Использование данных датчика для активации 5в реле на arduino

Скетч

Прошейте контроллер скетчем через Arduino IDE.

timer.ino
// Подключаем библиотеку для работы с дисплеем
#include <QuadDisplay2.h>
 
// номер аналогового пина пищалки
#define POT_PIN     A0
// номер цифрового пина пищалки
#define BUZZER_PIN  2
// номер цифрового пина кнопки
#define BUTTON_PIN  4
 
// создаём объект класса QuadDisplay и передаём номер пина CS
QuadDisplay qd(9);
 
// переменная для подсчёта времени
unsigned long prevMillis = ;
 
// переменная для хранения таймера
int reverseTimer;
 
void setup()
{
  // инициализация дисплея
  qd.begin();
  // функция установки таймера
  settingTimer();
}
void loop()
{
  // если время таймера не дошло до нуля и прошла 1 секунда
  if ((reverseTimer > ) && ((millis() - prevMillis) > 1000)) {
    // выводим значение на дисплей
    qd.displayInt(--reverseTimer);
    // запоминаем текущее время
    prevMillis = millis();
    // если таймер дошёл до нуля
    if (reverseTimer == ) {
      // подаём звуковой сигнал и выводим «Off» на дисплей
      qd.displayDigits(QD_NONE, QD_O, QD_f, QD_f);
      tone(BUZZER_PIN, 4000, 200);
    }
  }
  // если нажата кнопка
  if (!digitalRead(BUTTON_PIN)) {
    // подаём звуковой сигнал
    tone(BUZZER_PIN, 500, 500);
    delay(1000);
    // выполняем настройку таймера
    settingTimer();
  }
}
 
// функция настройки таймера
void settingTimer()
{
  // пока кнопка не нажата
  while (digitalRead(BUTTON_PIN)) {
    // считываем значения с потенциометра
    reverseTimer = analogRead(A0);
    // и выводим его на дисплей
    qd.displayInt(reverseTimer);
    delay(30);
  }
  // после нажатия кнопки, подаём звуковой сигнал
  tone(BUZZER_PIN, 2000, 200);
  delay(300);
  tone(BUZZER_PIN, 3000, 200);
  delay(300);
  tone(BUZZER_PIN, 4000, 200);
}

Управление реле Ардуино Уно / Нано

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • блок питания 12 Вольт;
  • светодиодная лента;
  • провода «папа-папа» и «папа-мама».

Соберите схему, как показано на картинке ниже. Подобная схема использовалась в проекте Светильник с управлением от пульта, где светодиодная лента включалась при помощи реле. Модуль имеет три контакта для управления от микроконтроллера Ардуино и два контакта для подключения мощной электрической цепи. Схема подключения реле к Ардуино УНО, Нано или Ардуино Мега ничем не отличается:

GND — GND
VCC — 5V
In — любой цифровой порт

Схема подключения реле srd-05vdc-sl к Ардуино Уно

После сборки электрической схемы, загрузите следующий скетч в микроконтроллер. Данная программа ничем не отличается от скетча для мигания светодиода на Ардуино, мы только поменяли в скетче порт и задали большее время задержки.

Скетч для управления реле от Ардуино

void setup() {
pinMode(3, OUTPUT); // объявляем пин 3 как выход
}

void loop() {
digitalWrite(3, HIGH); // замыкаем реле

delay(3000); // ждем 3 секунды

digitalWrite(3, LOW); // размыкаем реле

delay(1000); // ждем 1 секунду
}

После загрузки скетча включите блок питания в цепь. Реле при этом должно устанавливаться в разрыве одного из проводов, идущего к LED ленте. Для безопасности лучше устанавливать реле в провод заземления. К минусам реле следует отнести щелчки при замыкании/размыкании контакта, поэтому для включения LED ленты и других приборов до 40 Вольт удобнее использовать транзисторы.

Русификация LCD 1602 I2C дисплея

Перед загрузкой следующего скетча, необходимо установить библиотеку LCD_1602_RUS.h для русификации дисплея 1602 Ардуино. Архив с библиотекой можно скачать на нашем сайте на странице — Библиотеки для Ардуино. После установки библиотеки из архива загрузите в микроконтроллер небольшой пример с кодом для LCD, который значительно упростит для вас вывод кириллицы на дисплей.

Скетч с библиотекой LCD_1602_RUS.h

#include <Wire.h> // библиотека для управления устройствами по I2C 
#include <LCD_1602_RUS.h> // подключаем библиотеку LCD_1602_RUS

LCD_1602_RUS LCD(0x27,16,2); // присваиваем имя LCD для дисплея

void setup() {
   LCD.init(); // инициализация LCD дисплея
   LCD.backlight(); // включение подсветки дисплея
   
   LCD.setCursor(2,0); // ставим курсор на 3 символ первой строки
   LCD.print("РУСИФИКАЦИЯ!"); // печатаем символ на первой строке
}

void loop() {
 
}

Мигаем светодиодом без delay()

или всегда ли официальный примеру учат «хорошему».

Обычно это одна из первых проблем с которой сталкивается навичок в микроконтроллерх. Помигал диодом, запустил стандартный скетч blink(), но как только он него возникает желание что-бы контроллер «занимался чем-то еще» его ждет неприятный сюрприз — тут нет многопоточности. Как только он написали где-то что-то типа delay(1000) — обнаруживается что на это строчке «контроллер остановился» и ничего больше не делает (кнопки не опрашивает, датчики не читает, вторым диодом «помигать» не может).

Новичок лезет с этим вопросом на форум и тут же получает ушат поучений: «отказывайтесь от delay()», учитесь работать с millis() и в прочитайте, в конце концов базовые примеры. В частности Мигаем светодиодом без delay()

Приведу его код:

/* Blink without Delay
 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 */

const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода 
long previousMillis = 0;        // храним время последнего переключения светодиода

long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
 
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;  

    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
}
  

В принципе отправка к этому примеру — вполне правильна. В нем действительно виден стандартный паттерн как нужно выполнять какое-то переодическое действие (или отложенное):

1. Сохраняем время в какую-то переменную
2. В loop() все время смотрим на разницу «текущие-время — сохраненное»
3. Когда эта разница превысила какое-то значение (нужный нам «интервал переодичности»)

4. Выполняем какое-то действие (меняем состояние диода, заново запоминаем «стартовое время и т.п.»)
С задачей «объяснить идею» — пример справляется. Но, с моей точки зрения, в нем есть несколько методологических ошибок. Написание скетчек в подобно стиле — рано или поздно приведет к проблемам.
Итак, что же тут не так?

1. Не экономно выбираем тип переменных

Переменная ledPin у нас объявлена как тип int. Зачем?  Разве номер пина может быть очень большим числом? Или может быть отрицательным числом? Зачем под его хранение выделять два байта, когда вполне хватит одного. Тип byte может хранить числа от 0 до 255. Для номера пина — этого вполне хватит.

  const byte ledPIN = 13; //  номер выхода, подключенного к светодиоду

Этого будет вполне достаточно.

2. А зачем нам переменная для малых чисел?

А зачем нам тут вообще переменая? (пусть и объявленная как const). Зачем тратить такты процессора на чтение переменной? И расходовать еще один байт?  Воспользуемся директивой препроцессора #define

#define LED_PIN  13 //  номер выхода, подключенного к светодиоду

Тогда еще на этапе компиляции компилятор просто подставить 13-ть везде где в коде используется LED_PIN и не будет выделять отдельных переменных.

3. Тип int опять выбрали как «первое что в голову пришло»?

И опять спотыкаемся на объявлении следующей же переменной. Почему ledState опять int? Кроме того что снова «два байта там где можно один использовать», так еще и «смысловая нагрузка» теряется. Что у нас хранится в переменной? Состояние светодиода. Включен/выключен. Горит/Не горит. Явно же напрашивается тип boolean. По крайней мере до тех пор, пока светодиод у нас может принимать два состояния.

Кухонный таймер Ардуино с энкодером

Сейчас рассмотрим, как сделать таймер на Ардуино своими руками с энкодером и LCD. Принцип управления, подобен предыдущему варианту. Поворотом ручки энкодера можно задать необходимый временной интервал, а нажатием на ручку можно запускать и останавливать обратный отсчет времени. Далее размещена схема сборки проекта на Arduino Nano, этот проект можно собрать и на плате Arduino Uno.

Скетч таймера обратного отсчета времени

#include <Wire.h> // библиотека для протокола I2C #include <LiquidCrystal_I2C.h> // библиотека для LCD 1602 LiquidCrystal_I2C LCD(0x27, 20, 2); // присваиваем имя дисплею #include <RotaryEncoder.h> // библиотека для энкодера RotaryEncoder encoder(4, 2); // пины подключение энкодера (DT, CLK) // задаем шаг энкодера, максимальное и минимальное значение #define STEPS 1 #define POSMIN 0 #define POSMAX 30 int lastPos, newPos; boolean buttonWasUp = true; byte w = 0; int SEC = 0; int MIN = 0; unsigned long timer; void setup() { pinMode(6, INPUT_PULLUP); // пин для кнопки энкодера encoder.setPosition(0 / STEPS); pinMode(10, OUTPUT); // подключаем светодиод и зуммер pinMode(12, OUTPUT); digitalWrite(10, HIGH); LCD.init(); // инициализация дисплея LCD.backlight(); // включение подсветки LCD.setCursor(2, 0); LCD.print(«TIMER STOP»); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(» : «); LCD.print(SEC); } void loop() { // проверяем положение ручки энкодера encoder.tick(); newPos = encoder.getPosition() * STEPS; if (newPos < POSMIN) { encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; } else if (newPos > POSMAX) { encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; } // если положение изменилось — меняем переменную MIN и выводим на дисплей if (lastPos != newPos) { MIN = newPos; lastPos = newPos; LCD.clear(); LCD.setCursor(2, 0); LCD.print(«TIMER STOP»); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(» : «); LCD.print(SEC); } // если была нажата кнопка энкодера запускаем отсчет времени boolean buttonIsUp = digitalRead(6); if (buttonWasUp && !buttonIsUp && MIN > 0) { delay(10); buttonIsUp = digitalRead(6); if (!buttonIsUp) { if (SEC == 0) { SEC = 60; MIN = MIN — 1; } if (MIN < 0 ) { MIN = 0; } digitalWrite(10, LOW); w = 1; } } buttonWasUp = buttonIsUp; // запоминаем состояние кнопки while (w == 1 ) { // если прошло 995 мс — вычитаем одну секунду от переменной SEC if (millis() — timer > 993) { timer = millis(); SEC = SEC — 1; // если отсчет закончился — обнуляемся, включаем сигнал и выходим из цикла if (SEC == 0 && MIN == 0) { lastPos = 0; newPos = 0; MIN = 0; SEC = 0; LCD.clear(); LCD.setCursor(2, 0); LCD.print(«TIMER STOP»); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(» : «); LCD.print(SEC); digitalWrite(10, HIGH); tone(12, 100); delay(500); noTone(12); w = 0; } // если секунды дошли до нуля — вычитаем одну минуту if (SEC == 0 && w==1) { SEC = 59; MIN = MIN — 1; if (MIN < 0 ) { MIN = 0; } } // если из цикла while еще не вышли — выводим информацию на дисплей if (w == 1) { LCD.clear(); LCD.setCursor(2, 0); LCD.print(«TIMER START»); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(» : «); LCD.print(SEC); } } // если была нажата кнопка — обнуляем переменные и выходим из цикла buttonIsUp = digitalRead(6); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(6); if (!buttonIsUp) { lastPos = 0; newPos = 0; MIN = 0; SEC = 0; LCD.clear(); LCD.setCursor(2, 0); LCD.print(«TIMER STOP»); LCD.setCursor(5, 1); LCD.print(MIN); LCD.print(» : «); LCD.print(SEC); digitalWrite(10, HIGH); w = 0; } } buttonWasUp = buttonIsUp; // запоминаем состояние кнопки } }

Реле времени 220в

Большинство электронных схем работают на малом напряжении с гальванической развязкой от сети, но при этом могут коммутировать значительные нагрузки.

Временная задержка может производиться от реле времени 220В. Всем известны электромеханические устройства с задержкой выключения старых стиральных машин. Достаточно было повернуть ручку таймера, и устройство включало двигатель на заданное время.

На смену электромеханическим таймерам пришли электронные устройства, которые также применяются для временного освещения в туалете, на лестничной площадке, в фотоувеличителе и т. п. При этом часто используются бесконтактные переключатели на тиристорах, где схема работает от сети 220 В.

Питание производится через диодный мост с допустимым током 1 А и более. Когда контакт выключателя S1 замыкается, в процессе зарядки конденсатора С1 открывается тиристор VS1 и загорается лампа L1. Она служит нагрузкой. После полной зарядки тиристор закроется. Это будет видно по отключению лампы.

Время горения лампы составляет несколько секунд. Его можно менять, установив конденсатор С1 с другим номиналом или подключив к диоду D5 переменный резистор на 1 кОм.

Ардуино. Метеостанция на LCD 1602 и DHT11

Ардуино. Метеостанция с дисплеем LCD 1602 и DHT22

После сборки схемы, загрузите в микроконтроллер следующий скетч (здесь ссылка на скачивание архива со скетчем для метеостанции и необходимыми библиотеками). Информация с датчика DHT22 выводиться будет на монитор порта Arduino IDE и на жидкокристаллический дисплей 1602a, для отображения информации использован русский шрифт для LCD и символы (в скетче есть подробные комментарии).

Скетч для метеостанции с DHT11 на Ардуино

#include <Wire.h>                 // библиотека для протокола IIC 
#include <LiquidCrystal_I2C.h>    // подключаем библиотеку LCD IIC
LiquidCrystal_I2C lcd(0x27,20,2); // присваиваем имя lcd для дисплея

#include "DHT.h"   // подключаем библиотеку для DHT11
DHT dht(2, DHT11); // к какому порту подключаем датчик

// создаем символ градуса и присваиваем имя "gradus"
byte gradus = {
0b01100,0b10010,0b10010,0b01100,0b00000,0b00000,0b00000,0b00000
};

// создаем русскую букву "П"
byte P = {
0b11111,0b10001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000
};

// создаем русскую букву "У"
byte Y = {
0b10001,0b10001,0b10001,0b01111,0b00001,0b00001,0b01110,0b00000
};

// создаем русскую букву "Л"
byte L = {
0b00111,0b01001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000
};

// создаем русскую букву "Ж"
byte ZH = {
0b10101,0b10101,0b10101,0b01110,0b10101,0b10101,0b10101,0b00000
};

// создаем русскую букву "Ь"
byte znak = {
0b10000,0b10000,0b10000,0b11110,0b10001,0b10001,0b11110,0b00000
};

void setup() {
  Serial.begin(9600); // запуск последовательного порта
  lcd.init();         // инициализация LCD дисплея
  lcd.backlight();    // включение подсветки дисплея

  lcd.createChar(1, gradus);
  lcd.createChar(2, P);
  lcd.createChar(3, Y);
  lcd.createChar(4, L);
  lcd.createChar(5, ZH);
  lcd.createChar(6, znak);
}

void loop() {
  // если нужны точные значение, то используйте float, вместо byte
  byte h = dht.readHumidity();    // считываем значение температуры
  byte t = dht.readTemperature(); // считываем значение влажности

  Serial.print("Temperature: ");
  Serial.println(t);   // отправляем значение температуры на монитор

  Serial.print("Humidity: ");
  Serial.println(h);   // отправляем значение температуры на монитор

  Serial.println(" "); // пустая строка

  lcd.setCursor(0,0);  // ставим курсор на 1 символ первой строки
  lcd.print("TEM");    // используем латинские буквы
  lcd.print(char(2));  // выводим русскую букву "П"
  lcd.print("EPAT");   // используем латинские буквы
  lcd.print(char(3));  // выводим русскую букву "У"
  lcd.print("PA: ");   // используем латинские буквы
  lcd.print(t);        // выводим значение температуры на LCD
  lcd.print(char(1));  // выводим знак градуса

  lcd.setCursor(2,1);  // ставим курсор на 3 символ второй строки
  lcd.print("B");      // используем латинские буквы
  lcd.print(char(4));  // выводим русскую букву "Л"
  lcd.print("A");      // используем латинские буквы
  lcd.print(char(5));  // выводим русскую букву "Ж"
  lcd.print("HOCT");   // используем латинские буквы
  lcd.print(char(6));  // выводим русскую букву "Ь"
  lcd.print(": ");     // используем латинские буквы
  lcd.print(h);        // выводим значение влажности на LCD
  lcd.print("%");      // выводим знак процент
  
  delay(1000);
}

Пояснения к коду:

  1. в скетче можно использовать до 8 русских букв и символов, при необходимости заменяйте буквы из кириллицы — латинскими буквами;
  2. скорость обновления данных замените на необходимое значение.

Заключение. Мы рассмотрели, как сделать простую домашнюю метеостанцию на Ардуино c дисплеем 1602а и датчиком температуры и влажности воздуха DHT11. Данный проект можно доработать, добавив к схеме еще больше датчиков для анализа метеоусловий. Также можно сделать беспроводную метеостанцию на Arduino Uno, используя блютуз или радио модули для передачи информации на расстояние.

Простой таймер Ардуино millis()

Чтобы понять принцип работы функции millis() Arduino продемонстрируем пример программы счетчика с выводом времени на монитор порта. Команда millis позволяет осуществлять задержу в выполнении программы без delay и осуществлять при выполнении программы многозадачность. Отсчет времени начинается сразу после загрузки программы в микроконтроллер и открытия монитора порта Arduino IDE.

// переменные для отсчета минут и секунд int SEC = 0; int MIN = 0; unsigned long timer; void setup() { Serial.begin(9600); timer = millis(); } void loop() { // если прошло 995 мс — прибавляем одну секунду к переменной SEC // если прошло 60 секунд, прибавляем одну минуту if (millis() — timer > 995) { timer = millis(); SEC = SEC + 1; if (SEC > 60) { SEC = 1; MIN = MIN + 1; } // выводим текущий счетчик времени на монитор порта Serial.println(String(MIN) + » : » + String(SEC)); } }

Пояснения к коду:

  1. секунда прибавляется через 995 мс, так как на выполнение других операций тратится некоторое количество миллисекунд. Если программируемый таймер будет спешить, то количество миллисекунд следует добавить.

Как подключить DHT11 к Ардуино Уно

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • модуль DHT11 / DHT22 Ардуино;
  • макетная плата;
  • 2 светодиода и 2 резистора на 220 Ом;
  • провода «папа-папа» и «папа-мама».

На этом занятии мы приведем для примера два скетча. Первый скетч будет отсылать данные с модуля DHT11 на последовательный монитор порта  компьютера. Во втором скетче мы будем использовать вывод данных на жк дисплей — LCD 1602 модуль. LCD модуль можно будет использовать в дальнейшем в любом автономном устройстве, например, при конструировании «Домашней метеостанции» или «Умной теплицы».


Схема подключения модуля DHT11 к плате Ардуино Уно

Скетч. Ардуино датчик температуры и влажности DHT11

#include <DHT.h>      // подключаем библиотеку для датчика
DHT dht(2, DHT11);  // сообщаем на каком порту будет датчик

void setup() {
   dht.begin();                // запускаем датчик DHT11
   Serial.begin(9600);   // подключаем монитор порта
}

void loop() {
   // считываем температуру (t) и влажность (h)
   float h = dht.readHumidity();
   float t = dht.readTemperature();

   // выводим температуру (t) и влажность (h) на монитор порта
   Serial.print("Humidity: ");
   Serial.println(h);
   Serial.print("Temperature: ");
   Serial.println(t);
}

Пояснения к коду:

  1. переменные «h» и «t» являются типом данных float, которая служит для хранения чисел с десятичным разделителем (вре11 подключение к ардуино);
  2. команда выводит информацию на порт без переноса строки, команда выводит информацию на порт с переносом строки.


Схема подключения DHT11 и LCD 1602 к Ардуино

Скетч. Подключение к Ардуино DHT11 и вывод на LCD 1602 i2c

#include <Wire.h>                       // библиотека для протокола I2C 
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для LCD 1602
#include <DHT.h>                         // подключаем библиотеку для датчика

LiquidCrystal_I2C LCD(0x27,16,2);  // присваиваем имя LCD для дисплея
DHT dht(2, DHT11);                          // сообщаем на каком порту будет датчик

void setup() {
   LCD.init();            // инициализация LCD дисплея
   LCD.backlight();  // включение подсветки дисплея
   dht.begin();         // запускаем датчик DHT11
}

void loop() {
   // считываем температуру (t) и влажность (h)
   float h = dht.readHumidity();
   float t = dht.readTemperature();

   // выводим температуру (t) и влажность (h) на жк дисплей
   LCD.setCursor(0,0);
   LCD.print("Humidity: ");
   LCD.print(h);

   LCD.setCursor(0,1);
   LCD.print("Temperature: ");
   LCD.print(t);

   delay(1000);
   LCD.clear();
}

Пояснения к коду:

  1. для подключения датчика к микроконтроллеру можно использовать любой пин общего назначения, указав его в скетче;
  2. команда в программе очищает экран дисплея от надписей для вывода новых значений с сенсора температуры DHT11 Arduino.

Основные принципы работы устройства

Рассматриваемый нами проект цифрового счетчика посетителей основан на использовании таких компонентов как датчики, двигатели, плата Arduino Uno и т.д. Этот счетчик будет способен подсчитывать количество посетителей в двух (обоих) направлениях. То есть он будет увеличивать счетчик посетителей когда человек проходит в центр/офис/стадион через входные ворота и уменьшать счетчик посетителей когда человек выходит из центра/офиса/стадиона через выходные ворота. Кроме указанных применений подобный счетчик можно также использовать на автопарковках и других общественных местах.

Проект разделен на 4 части: датчики, контроллер, дисплей для отображения числа посетителей и ворота. Датчик будет обнаруживать проходящих людей и подавать соответствующий сигнал на контроллер, который будет увеличивать или уменьшать счетчик посетителей в зависимости от того, вошел человек или вышел. Затем контроллер выдает команду на ЖК дисплей отобразить текущее количество посетителей.

Принцип обнаружения человека инфракрасным датчиком основан на том, что проходящий человек прерывает поток света на некоторое время и это прерывание света обнаруживается приемным инфракрасным датчиком.

Методы библиотек TimerOne и TimerThree

Настройка

Вы должны вызвать этот метод первым, перед использованием любых других методов библиотеки. При желании можно задать период таймера (в микросекундах), по умолчанию период устанавливается равным 1 секунде

Обратите внимание, что это нарушает работу на цифровых выводах 9 и 10 на Arduino.

Устанавливает период в микросекундах. Минимальный период и максимальная частота, поддерживаемые данной библиотекой, равны 1 микросекунде и 1 МГц, соответственно

Максимальный период равен 8388480 микросекунд, или примерно 8,3 секунды. Обратите внимание, что установка периода изменит частоту срабатывания прикрепленного прерывания и частоту, и коэффициент заполнения на обоих ШИМ выходах.

Управление запуском

Запускает таймер, начиная новый период.
Останавливает таймер.
Перезапускает таймер, обнуляя счетчик и начиная новый период.

Управление выходным ШИМ сигналом

Генерирует ШИМ сигнал на заданном выводе . Выходными выводами таймера Timer1 являются выводы 1 и 2, поэтому вы должны выбрать один из них, всё остальное игнорируется. На Arduino это цифровые выводы 9 и 10, эти псевдонимы также работают. Выходными выводами таймера Timer3 являются выводы , соответствующие выводам 2, 3 и 5 на Arduino Mega. Коэффициент заполнения задается, как 10-битное значение в диапазоне от 0 до 1023 (0 соответствует постоянному логическому нулю на выходе, а 1023 – постоянной логической единице)

Обратите внимание, что при необходимости в этой функции можно установить и период, добавив значение в микросекундах в качестве последнего аргумента.

Быстрый способ для настройки коэффициента заполнения ШИМ сигнала, если вы уже настроили его, вызвав ранее метод. Этот метод позволяет избежать лишних действий по включению режима ШИМ для вывода, изменению состояния регистра, управляющего направлением движения данных, проверки необязательного значения периода и прочих действий, которые являются обязательными при вызове .

Выключает ШИМ на заданном выводе, после чего вы можете использовать этот вывод для чего-либо другого.

Прерывания

Вызывает функцию через заданный в микросекундах интервал. Будьте осторожны при попытке выполнить слишком сложный обработчик прерывания при слишком большой тактовой частоте, так как CPU может никогда не вернуться в основной цикл программы, и ваша программа будет «заперта»

Обратите внимание, что при необходимости в этой функции можно установить и период, добавив значение в микросекундах в качестве последнего аргумента.

Отключает прикрепленное прерывание.

Программирование таймеров в плате Arduino UNO

В этом проекте мы будем использовать прерывание переполнения таймера (Timer Overflow Interrupt) и использовать его для включения и выключения светодиода на определенные интервалы времени при помощи установки заранее определяемого значения (preloader value) регистра TCNT1 с помощью кнопок. Полный код программы будет приведен в конце статьи, здесь же рассмотрим его основные части.

Для отображения заранее определяемого значения используется ЖК дисплей, поэтому необходимо подключить библиотеку для работы с ним.

Анод светодиода подключен к контакту 7 платы Arduino, поэтому определим (инициализируем) его как ledPin.

Затем сообщим плате Arduino к каким ее контактам подключен ЖК дисплей.

Установим заранее определенное значение (preloader value) равное 3035 – это будет соответствовать интервалу времени в 4 секунды. Формула для расчета этого значения приведена выше в статье.

Затем в функции void setup() установим режим работы ЖК дисплея 16х2 и высветим приветственное сообщение на нем на несколько секунд.

Затем контакт, к которому подключен светодиод, установим в режим вывода данных, а контакты, к которым подключены кнопки – в режим ввода данных.

После этого отключим все прерывания.

Далее инициализируем Timer1.

Загрузим заранее определенное значение (3035) в TCNT1.

Затем установим коэффициент деления предделителя равный 1024 при помощи конфигурирования битов CS в регистре TCCR1B.

Разрешим вызов процедуры обработки прерывания переполнения счетчика с помощью установки соответствующего бита в регистре маски прерываний.

Теперь разрешим все прерывания.

Теперь процедура обработки прерывания переполнения счетчика будет отвечать за включение и выключение светодиода с помощью функции digitalWrite. Состояние светодиода будет меняться каждый раз когда будет происходить прерывание переполнения счетчика.

В функции void loop() предварительно загружаемое значение увеличивается и уменьшается на 10 (инкрементируется и декрементируется) при помощи кнопок в схеме. Также это значение отображается на экране ЖК дисплея 16х2.