Здесь расположены небольшие скетчи (прошивки) для esp8266 для быстрой проверки различных плат и пр. |
|
Давайте в этом примере разберемся с прерываниями микроконтролера ESP8266. Прерывания очень полезная функция в микроконтроллере так как он может выполнять свою прошивку не замечая ничего, крутясь в своих бесконечных циклах как карапуз на карусели, а прерывания то что способно его одернуть и заставить делать то что нам надо. Например у нас есть новогодняя гирлянда которая переливается различными огнями, мы хотим переключить ее в другой режим и тут нам поможет прерывание, оно остановит мигание и мы выполним что хотим. В скетче у нас есть кнопка которая будет задействовать прерывание, микроконтроллер все бросит и выполнит функцию прикрепленную к прерыванию, а затем вернется к воим действиям. В функции прерывания есть событие при котором сработает прерывание : FALLING - переход на низкий уровень (замыкание пина на 0), RISING - переход на высокий уровень (подача на пин +3.3 вольта), CHANGE – когда меняется состояние вывода (если было +3.3 вольта и поменялось на 0 или наоборот было 0 стало 3.3 вольта). В ESP8266 прерывания можно настроить практически на любой пин микроконтроллера.
void setup() { // функция настроек и разового ввода данных
pinMode (D4, OUTPUT); // д4 пин настраиваем на выход
pinMode (D1, INPUT_PULLUP); // д1 пин настраиваем на вход, с подтяжкой +3.3 вольта на пин
attachInterrupt (D1, blink, FALLING); // включаем прерывание на д1 пине, (пин, выполняемая функция, событие)
}
void loop() { // запускаем бесконечную обработку кода (цикл)
digitalWrite(D4, 1); // светодиод гаснет
delay(500); // ожидание в течение пол секунды
digitalWrite(D4, 0); // светодиод загорается
delay(500); // ожидание в течение пол секунды
}
IRAM_ATTR void blink () { // функция выполняемая при прерывании
delay(3000); // ожидание в течение 3 секунд
}
Подключаем один из самых популярных дисплеев OLED 128x64 0.96 Inch к ЕСП. Данный дислей очень часто встречается в различных проектах так как не дорогой, яркий, работает без подсветки и соответственно потребляет небольшой ток, так же дислей подключается всего по 4 проводам что сильно облегчает работу с ним. Данный дисплей пригодится для часов, игрушек, панелей управления различными устройствами, для вывода ошибок оборудования, моточасов, весов и пр. так как может выводить не только текст но и графику. Подключается дислей по шине I2C в которой всего два провода пин D1-SCL и пин D2-SDA , дисплей питается как от 5 так и от 3.3 вольта что позволяет использовать его как в Ардуино так и в ЕСП. Для нашего скетча необходимо установить две библиотеки одну для шины I2C, вторую для дисплея , как устанавливать и где скачивать библиотеки есть много информации в интернете.
#include <Wire.h> // Подключаем библиотеку Wire.h для I2C интерфейса
#include "SSD1306Wire.h" // Подключаем библиотеку SSD1306.h для работы с дисплеем
SSD1306Wire display(0x3c, SDA, SCL); // (ADDRESS, SDA, SCL) SSD1306Wire display(0x3c, SDA, SCL, GEOMETRY_128_32);
void setup() { // функция настроек и разового ввода данных
display.init(); // инициализация дисплея
display.setFont(ArialMT_Plain_16); // устанавливаем шрифт на дисплее
}
void loop() { // запускаем бесконечную обработку кода (цикл)
display.clear(); // очистка дисплея от старой записи
delay(1000); // задержка 1 секунда
display.drawString(0, 0, "Hello world"); // место на дисплее и текст для вывода
display.display(); //передаем на дисплей информацию
}
Разбираемся с подключением ИК приемника и работой ИК пультов с ЕСП. ИК пульты очень популярны в различных девайсах так как работать с ними очень просто, у них множество кнопок, и пульты можно использовать любые хоть от телевизора, необязательно использовать пульт из ардуино наборов, из минусов пультов на ИК это прямая видимость между пультом и устройством, работа желательно в помещенни без солнечных прямых лучей. В первом примере считаем информацию с кнопок пульта а во втором будем управлять светодиодом.
#include <IRrecv.h> // подключаем библиотеку для работы с ИК пультом
IRrecv irrecv(D5); // выставляем пин для сигнала ИК приемника
decode_results results; // расшифровыванные результаты помещаем в переменную results
void setup() { // функция настроек и разового ввода данных
Serial.begin(9600); // настраиваем скорость монитора порта
irrecv.enableIRIn(); // включаем прием сигнала
}
void loop() { // запускаем бесконечную обработку кода (цикл)
if (irrecv.decode(&results)) { // если есть какой нибудь сигнал с пульта
Serial.println(results.value); // выводим в монитор порта значение
irrecv.resume(); // получить новое значение
}
delay(100); // пауза 100 милисекунд
}
Подключаем ИК модуль к WeMos D1 mini, можно так же подключить ИК датчик напрямую без модуля например от старого телевизора но надо знать распиновку датчика, в интернете много примеров, так что если нет ИК модуля то можно и обойтись б.у. датчиком или купить в радиомагазине новый.
Выводим в монитор порта коды кнопок
В прошлом примере мы подключали ИК модуль ардуино и получали коды кнопок через WeMos D1 mini, давайте сейчас посмотрим как применять в деле ИК управление. Используя данный пример можно собрать много устройств например часы с настройкой времени через пульт, новогоднюю гирлянду, игрушечный авто на ик управлении и пр. Схема подключения ИК модуля у нас та же, и мы получив с монитора порта в прошлом примере данные с кнопок копируем код одной кнопки и вставляем в нашу новую прошивку и все при нажатии пульта на ту кнопку с которой вставлен код у нас происходит действие мы тушим светодиод, как помним на WeMos D1 mini он инверсный и при подаче +3.3 вольта он погаснет, потом через 2 секунды загорится так заложено в нашей программе, при нажатии на любую другую кнопку ничего не произойдет.
#include <IRrecv.h> // подключаем библиотеку для работы с ИК пультом
IRrecv irrecv(D5); // выставляем пин для сигнала ИК приемника
decode_results results; // расшифровыванные результаты помещаем в переменную results
void setup() { // функция настроек и разового ввода данных
Serial.begin(9600); // настраиваем скорость монитора порта
irrecv.enableIRIn(); // включаем прием сигнала
pinMode(D4, OUTPUT); // пин д4 настраиваем на выход, светодиод загорается
}
void loop() { // запускаем бесконечную обработку кода (цикл)
if (irrecv.decode(&results)) { // если есть какой нибудь сигнал с пульта
if (results.value == 33441975) { // если результат равен 33441975
digitalWrite(D4, 1); // светодиод гаснет
delay(2000); // пауза 2 секунды
digitalWrite(D4, 0); // светодиод загорается
}
irrecv.resume(); // получить новое значение
}
delay(100); // пауза 100 милисекунд
}
Работаем с ключами ibutton (таблетка) на WeMos D1 mini по протоколу OneWire (ванваир). Данный ключ можно использовать в замках, в автомобильных блокировщиках (иммобилайзерах), в управлении станками где необходим ограниченый доступ и т.д. Ключи ibutton много где применяются так как надежны, недорогие и простые в разработке для них устройств, ведь для считывания даже не нужен какой нибудь отдельный модуль просто два контакта нулевой (GND) и сигнальный на который через резистор 2 килоома подается + 3.3 вольта для работы самого ключа, ведь ключ работает без батареек! В этом скетче мы будем просто считывать код нашего ключа, а в следующем будем делать полезную работу. Библиотека OneWire.
#include <OneWire.h> // подключаем библиотеку для работы с протоколом OneWire (ванваир)
OneWire ds(D2); // д2 пин на WeMos D1 mini
byte i; // создаем переменную для счетчика информации с ключа
byte addr[8]; // создаем переменную для массива с восемью значениями (8 переменных в одной)
void setup(void) { // функция настроек и разового ввода данных
Serial.begin(9600); // настраиваем скорость монитора порта
}
void loop(void) { // запускаем бесконечную обработку кода (цикл)
if (!ds.search(addr)) { // если обнулен пин ds(D4) считываем 8 бит в массив, если считалось то идем дальше
ds.reset_search(); // останавливаем считывание с ds(D4)
return; // прекращаем вычисления
}
for ( i = 0; i < 8; i++) { // цикл на 8 действий
Serial.print(addr[i], HEX); // каждый цикл увеличиваем на 1 адрес в массиве и выводим одно значение в HEX формате
Serial.print(" "); // пробел после бита для монитора порта чтоб лучше читалось
}
Serial.println(); // делаем перевод строки в мониторе порта
ds.reset(); // обновление считывания с ds(D4)
delay(1000); // пауза 1 секунда
}
Подключаем все по схеме и подносим ключ ненадолго к контактам, можно использовать специальные считыватели в корпусе, но для понимания лучше именно так.
Выводим в монитор порта код ключа.