При помощи Bluetooth модуля HC-06 и платы Arduino можно осуществить управление различными исполнительными механизмами c помощью смартфона. В данном случае речь пойдет от терморегуляторе. В качестве датчика температуры используется цифровой датчик DS18B20, температура регулируется при помощи реле (модуля реле) которое управляет нагревательным элементом.
На плате Arduino осуществляется измерение температуры и регулировка температуры срабатывания реле, а так же передача текущей температуры и температуры регулирования в Android приложение. Android приложение в свою очередь осуществляет соединение с Bluetooth модулем HC-06, изменение температуры регулирования и получение данных от платы Arduino о текущей температуре и температуре регулирования. Фактически плата Arduino работает автономно, измеряет температуру, управляет реле и хранит в памяти значение температуры регулирования. При изменении температуры регулирования на экран смартфона выводится уже подтвержденная и принятая платой Arduino температура.
Схема всего уст-ва очень простая, она содержит плату Arduino Nano (Uno), Bluetooth модуль HC-06 (подключение) и датчик DS18B20 показания которого передаются на вход A0. Выход управления реле (D13) и подключение датчика температуры можно изменить.
Для установки приложения на смартфон скачайте архив 18b20regapk.zip, распакуйте архив приложения и установите его.
#include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> OneWire oneWire(A0);// вход датчика 18b20 DallasTemperature temp(&oneWire); int buff[2],i,dig,arr[2],w=1,w1,reg; int k; int gis=1; // гистерезис 1 градус unsigned long times; void setup(){ Serial.begin(9600);Serial.setTimeout(50); pinMode(13, OUTPUT);// P1 temp.begin(); temp.setResolution(9);//12 бит reg = EEPROM.read(0); pinMode(13, OUTPUT); // выход реле } void loop() { /////// ПРИЕМ ДАННЫХ С SERIAL PORT ///////////////////////// while (Serial.available()>0){ for (i=0;i<1;i++) { buff[0] = Serial.parseInt(); buff[1] = Serial.parseInt();} w=1;w1=1;times=millis();} ///////////// обработка команд /////////////////// if(buff[0]>10&&w==1){ w=0; if(buff[0]==102){reg++;if(reg>125){reg=125;}} if(buff[0]==101){reg--;if(reg<0){reg=0;}}} /// EEPROM if(w1==1&&millis()-times>10000){w1=0;EEPROM.update(0,reg);} /// измерение температуры temp.requestTemperatures(); k = temp.getTempCByIndex(0); /// отправка днный в android Serial.print(k*10); Serial.println(reg); if(reg >= k + gis){digitalWrite(13,HIGH);} if(reg <= k - gis){digitalWrite(13,LOW);} }
Библиотеки:
Форум — http://forum.rcl-radio.ru/viewtopic.php?id=111
Доработка терморегулятора
Изменения:
- Увеличена точность датчика DS18B20 до 11 бит
- Добавлен десятичный знак температуры
- Индикатор вкл/выкл нагревателя
#include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> OneWire oneWire(A0);// вход датчика 18b20 DallasTemperature temp(&oneWire); int buff[2],i,dig,arr[2],w,w1,reg,nakal; float k; int gis=1; // гистерезис 1 градус unsigned long times,temp_time; void setup(){ Serial.begin(9600);Serial.setTimeout(50); pinMode(13, OUTPUT);// P1 temp.begin(); temp.setResolution(11);//12 бит reg = EEPROM.read(0); pinMode(13, OUTPUT); // выход реле } void loop() { /////// ПРИЕМ ДАННЫХ С SERIAL PORT ///////////////////////// while (Serial.available()>0){ for (i=0;i<1;i++) { buff[0] = Serial.parseInt(); buff[1] = Serial.parseInt();} w=1;w1=1;times=millis();} ///////////// обработка команд /////////////////// if(buff[0]>10&&w==1){ w=0; temp_time=millis(); if(buff[0]==102){reg++;if(reg>125){reg=125;}} if(buff[0]==101){reg--;if(reg<0){reg=0;}}} /// EEPROM if(w1==1&&millis()-times>10000){w1=0;EEPROM.update(0,reg);} /// измерение температуры if(millis()-temp_time>1000){ temp.requestTemperatures(); k = temp.getTempCByIndex(0); temp_time=millis();} /// отправка днный в android Serial.print(k,1); Serial.print(":"); Serial.print(reg); Serial.print(":"); Serial.println(nakal); if(reg >= k + gis){digitalWrite(13,HIGH);nakal=1;} if(reg <= k - gis){digitalWrite(13,LOW);nakal=0;} }
Приложение — 18b20_reg_02.apk.zip
Исходники — 18b20_reg_02.zip
Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=616#p616
- Приложение — 18b20_reg_seekBar.apk.zip
- Исходники для Android Studio — 18b20_reg_seekBar.zip
#include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> OneWire oneWire(A0);// вход датчика 18b20 DallasTemperature temp(&oneWire); int buff[2],i,dig,arr[2],w,w1,reg,nakal; float k; int gis=1; // гистерезис 1 градус unsigned long times,temp_time; void setup(){ Serial.begin(9600);Serial.setTimeout(50); pinMode(13, OUTPUT);// P1 temp.begin(); temp.setResolution(11);//12 бит reg = EEPROM.read(0); pinMode(13, OUTPUT); // выход реле } void loop() { /////// ПРИЕМ ДАННЫХ С SERIAL PORT ///////////////////////// while (Serial.available()>0){ for (i=0;i<1;i++) { buff[0] = Serial.parseInt(); buff[1] = Serial.parseInt();} w=1;w1=1;times=millis();} ///////////// обработка команд /////////////////// if(buff[0]>10&&w==1){ w=0; temp_time=millis(); if(buff[0]>=10000){dig=buff[0];arr[0]=dig/1000;arr[1]=dig%1000;} if(buff[0]<10000&&buff[0]>=1000){dig=buff[0];arr[0]=dig/100;arr[1]=dig%100;} if(buff[0]<1000){dig=buff[0];arr[0]=dig/10;arr[1]=dig%10;} if(arr[0]== 11){reg = arr[1];} } /// EEPROM if(w1==1&&millis()-times>10000){w1=0;EEPROM.update(0,reg);} /// измерение температуры if(millis()-temp_time>1000){ temp.requestTemperatures(); k = temp.getTempCByIndex(0); temp_time=millis();} /// отправка днный в android Serial.print(k,1); Serial.print(":"); Serial.print(reg); Serial.print(":"); Serial.println(nakal); if(reg >= k + gis){digitalWrite(13,HIGH);nakal=1;} if(reg <= k - gis){digitalWrite(13,LOW);nakal=0;} }
Добавлен датчик влажности DHT11
Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=1721#p1721
Добавлен регулятор влажности
Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=1790#p1790