Здесь расположены небольшие скетчи (прошивки) для 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 секунда
}

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


Выводим в монитор порта код ключа.