В предыдущей статье было рассмотрено использование модуля индикации 4-х разрядного 7-и сегментного на сдвиговых регистрах 74НС595. В этой статье будет простой пример реализации простого терморегулятора с использованием выше указанного модуля индикации.
В качестве датчика температуры используется цифровой датчик DS18B20 (модуль) который имеет диапазон измерения от -55 до 125 °С. Терморегулятор имеет всего две кнопки управления «+» и «-» для регулировки температуры. При нажатии на кнопку можно изменить температуру регулирования с шагом 0,5 °С. Терморегулятор управляет работой модуля реле и имеет гистерезис в 0,5 °С. Если в течении трех секунд не будет изменена температура регулирования индикатор покажет текущую температуру.
Температура терморегулирования после изменения сохраняется в энергонезависимой памяти.
#include <MsTimer2.h> #include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> OneWire oneWire(A0);// вход датчика 18b20 DallasTemperature temp(&oneWire); byte razr[5] = {0x08, 0x04, 0x02, 0x01, 0x00};// 0123 byte digit[12] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF, 0xBF}; // 0123456789 минус byte point = 0x80; //точка float gis=0.5; // гистерезис 0,5 градуса float k,k2,reg; int k1,t; byte a[4],w; unsigned long time; void setup(){Serial.begin(9600); MsTimer2::set(15, to_Timer);// задаем период 10...20 мс MsTimer2::start();// старт индикации pinMode(3, OUTPUT); // RCLK pinMode(4, OUTPUT); // SCLK pinMode(2, OUTPUT); // DIO pinMode(5, INPUT); // кнопка + pinMode(6, INPUT); // кнопка - pinMode(13, OUTPUT); // выход реле temp.begin(); temp.setResolution(12);//12 бит reg = EEPROM.get(0, reg); } void to_Timer(){ if(k<0){k2 = abs(k);a[0]=11;}else{k2=k;a[0]=10;} Serial.println(k2); if(k2<10){k1=round(k2*100);t=1;} else if(k2<100){k1=round(k2*10);t=2;} else {k1=k2;t=4;} a[1]=k1/100%10; a[2]=k1/10%10; a[3]=k1%10%10; for(int i=0;i<5;i++){ digitalWrite(3, LOW); if(i==t){shiftOut(2, 4, MSBFIRST, digit[a[i]] ^ point);} else{shiftOut(2, 4, MSBFIRST, digit[a[i]]);} shiftOut(2, 4, MSBFIRST, razr[i]); digitalWrite(3, HIGH); } } void loop(){ if(digitalRead(5)==HIGH){reg+=0.5;if(reg>=125){reg=125;}delay(300);time=millis();w=1;} if(digitalRead(6)==HIGH){reg-=0.5;if(reg<=-55){reg=-55;}delay(300);time=millis();w=1;} if(millis()-time<3000){k=reg;} else{ temp.requestTemperatures(); k = temp.getTempCByIndex(0); if(reg >= k + gis){digitalWrite(13,HIGH);} if(reg <= k - gis){digitalWrite(13,LOW);} } if(w==1){EEPROM.put(0, reg);w=0;} }
здраствуйте! Подскажите пожалуйста как увеличить яркость дисплея в данном проекте?
Попробуйте поменять период:
MsTimer2::set(15, to_Timer);// задаем период 10…20 мс
Спасибо за ответ, но не помогло.
Добрый день! Подскажите,пожалуйста,где может быть ошибка…. Регулятор показывает температуру,но нет регулировки. При нажатии на кнопки на экране появляются нули
При нажатии и удержании кнопки «+» должна меняться температура регулирования.
При нажатии и удержании кнопки «+» на экране зажигаются три нуля и температура не меняется. Аналогично происходит при нажатии кнопки «-«.
При нажатии и удержании кнопки «+» на экране зажигаются три нуля и температура не меняется. Аналогично происходит при нажатии кнопки «-«.
У меня сейчас нет этого экрана и датчика температуры, но показания температуры регулирования я вывел в монитор порта, кнопки отрабатывают нормально, температура меняется.
У меня при нажатии кнопок «+» или «-» в мониторе порта пишет следующее:
nan
nan
nan
nan
nan
nan
nan
nan
У меня все работает, нажмите кнопку «-» и держите до появления цифр.
Здравствуйте! У кого нибудь этот проект заработал? Я повторил и проблема точно такая же как у Сергея Костина. При нажатии на любую кнопку — нули на дисплее и «nan» в мониторе порта.
Такая-же история. уже и кнопки к земле притянул, на них грешил, 0 эмоций. При нажатии на кнопки — nan что в мониторе, что в LCD я подключил
Попробуйте в конце блока setup() добавить строчку:
if(reg>125&®<-55){reg=25.00;}
Не помогло, помогло в сетапе строчку reg = EEPROM.get(0, reg); поменял на EEPROM.get(0, reg);
Здравствуйте! То есть просто reg убрали и всё?
да
Все рекомендации выполнил. Всё равно при нажатии кнопок только нули. Может быть ещё есть варианты?
мне помогло
«в сетапе строчку reg = EEPROM.get(0, reg); поменял на EPROM.get(0, reg);»