На базе ESP32 используя сеть Bluetooth можно создать простой терморегулятор. В качестве датчика температуры используется цифровой датчик DS18B20. Вся информация и органы регулирования температуры выводятся в Android приложение.
Регулировка температуры может быть пределах от 10 до 50 °С. Гистерезис 1 °С (может быть изменен в скетче). Для управления нагревательным элементом используется вывод ESP32 D22 к которому можно подключить реле (модуль реле, максимальный выходной ток вывода ESP32 не должен превышать 40 мА).
Перед загрузкой скетча рекомендую ознакомится со статьей — ESP32 DevKit v1 Wi-Fi Bluetooth ESP32-WROOM-32 (Arduino IDE).
#include <BluetoothSerial.h> // Входит в состав Arduino IDE #include <OneWire.h> // Входит в состав Arduino IDE #include <EEPROM.h> // Входит в состав Arduino IDE OneWire ds(15); // Вход датчика D15 BluetoothSerial BL; float temper; int w,reg,buf[2],i,wb,rele,k; unsigned long buff,times,times1; const int gis = 1; // int гистерезис String BT_CALLBACK = ""; void setup() { Serial.begin(9600); EEPROM.begin(100); // под EEPROM выделить 100 ячеек памяти BL.register_callback(BTCallback); BL.begin("ESP32",false); // Имя Вашего устройства Bluetooth BL.setTimeout(100); Serial.println("Bluetooth OK"); pinMode (2, OUTPUT); // LED pinMode (22,OUTPUT); // выход рег. реле D22 reg=EEPROM.read(0); } void loop() { /////// ПРИЕМ ДАННЫХ ///////////////////////// if(BL.available()){ for (i=0;i<1;i++) { buf[0] = BL.parseInt(); buf[1] = BL.parseInt();} times=millis();times=millis();wb=1;w=1; } ///////////// обработка команд /////////////////// if(buf[0]>10&&wb==1){ wb=0; if(buf[0]==102){reg++;if(reg>50){reg=50;}} if(buf[0]==101){reg--;if(reg<10){reg=10;}} } //////////// reg temp if(reg >= temper + gis){rele=1;digitalWrite(22,HIGH);} if(reg <= temper - gis){rele=0;digitalWrite(22,LOW);} blue(); //////////////// EEPROM if(millis()-times>5000&&w==1){EEPROM.write(0,reg);times=millis();w=0;EEPROM.commit();} /////// измерение температуры 1 раз в секунду if(k==0){digitalWrite(2,LOW);} if(k==1){digitalWrite(2,HIGH);} if(k>1){k=0;} if(millis()-times1>1000){temper = dsRead(0);times1=millis();k++;} delay(20); }// loop float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод } void blue(){ //////// отправка данных в android BL.print(temper,1); BL.print(":"); BL.print(reg); BL.print(":"); BL.println(rele); } void BTCallback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param){ if(event == ESP_SPP_SRV_OPEN_EVT){BT_CALLBACK = "BTonConnect";} else if(event == ESP_SPP_CLOSE_EVT){ESP.restart();} else if(event == ESP_SPP_DATA_IND_EVT){BT_CALLBACK = "BTonReceivedStart";} else if(event == ESP_SPP_WRITE_EVT){BT_CALLBACK = "BTonWrite";} }
Приложение — app-debug.apk