На рисунке показана схема простого и очень удобного в использовании терморегулятора, в качестве датчика используется DS18B20, а управление регулятором осуществляется при помощи энкодера ky-040.
Интегральный датчик температуры DS18B20 имеет диапазон измерения температуры от -55 до + 125 °C, показания температуры выводятся на первую строку индикатора 1602 HD44780, во второй строке индикатора выводится показания регулятора температуры, вращая ручку энкодера можно изменять температуру регулирования, так же используется гистерезис в 0,5 °C, которой можно изменить в скетче.
Температура регулирования сохраняется в энергонезависимой памяти, для ее сохранения необходимо нажать на кнопку энкодера (появится надпись — SAVE).
Если у Вас модуль DS18B20, то сопротивление R2 необходимо из схемы исключить. Сигнал регулирования выводится на цифровой выход 13.
#include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal.h> #include <Encoder.h> #include <EEPROM.h> // #include <EEPROMex.h> Encoder myEnc(3, 4);// CLK, DT OneWire oneWire(A1);// вход датчика 18b20 DallasTemperature t(&oneWire); LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7 int oldPosition = -999,newPosition,rom; unsigned long time; byte minus_reg; float gis = 0.5;// гистерезис void setup() { t.begin(); lcd.begin(16,2);// LCD 16X2 t.setResolution(11);//11 бит pinMode(2,INPUT); pinMode(13,OUTPUT); rom=EEPROM.read(0);minus_reg=EEPROM.read(1); if(minus_reg==1){rom=rom-2*rom;} } void loop() { newPosition = myEnc.read()/4+rom; if (newPosition != oldPosition) { oldPosition = newPosition; Serial.println(newPosition);time=millis(); }// измерение температуры 1 раз в секунду else if(millis()-time>1000){t.requestTemperatures();time=millis();} if(newPosition<0){minus_reg=1;}else{minus_reg=0;} if(newPosition<-55){newPosition=-55;} if(newPosition>125){newPosition=125;} if(digitalRead(2)==LOW){EEPROM.update(0,abs(newPosition)); EEPROM.update(1,minus_reg); lcd.setCursor(1,1);lcd.print(" SAVE "); delay(1000); } lcd.setCursor(1,0);lcd.print("t = "); lcd.print(t.getTempCByIndex(0),1); lcd.print(char(223)); lcd.print("C "); lcd.setCursor(1,1);lcd.print("r = "); lcd.print(newPosition); lcd.print(char(223));lcd.print("C "); if(newPosition >= t.getTempCByIndex(0) + gis){digitalWrite(13,HIGH);} if(newPosition <= t.getTempCByIndex(0) - gis){digitalWrite(13,LOW);} }
Здравствуйте. Подскажите,пожалуйста, можно ли и как сделать,чтобы энкодером «r» выставлять с точностью до десятых,напр: 37,7*С? Хочу приспособить для инкубатора.