Arduino HC-06 + DS18B20 (Терморегулятор)

При помощи 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


#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

Добавить комментарий

Войти с помощью: