#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#include "Wire.h" // библиотека для протокола I2C
#include "LiquidCrystal_I2C.h" // библиотека для LCD 16x02
LiquidCrystal_I2C LCD(0x27, 20, 2); // присваиваем имя дисплею
// переменные для отсчета времени и будильника
byte SEC = 0;
byte MIN = 0;
byte HOUR = 0;
byte day = 0;
byte mon;
byte year;
unsigned long timer;
byte w = 0;
unsigned long LP;
byte BT = 50;
byte button_hold_timer = 1000;
// переменные для считывания нажатия на кнопки
boolean btn1flag = 0;
boolean btn2flag = 0;
boolean button1IsUp;
boolean button2IsUp;
uint32_t myTimer1, myTimer2, myTimer3;
boolean LEDflag = false;
float tempSum = 0, temp;
byte tempCounter;
void setup() {
sensors.begin();
sensors.requestTemperatures(); // запрос температуры
float tempC = sensors.getTempCByIndex(0); // получаем
pinMode(9, INPUT_PULLUP); // подключаем тактовые кнопки
pinMode(8, INPUT_PULLUP);
LCD.init(); // инициализация дисплея
LCD.backlight(); // включение подсветки
}
void loop() {
// если прошло 1000 мс - прибавляем одну секунду
if (millis() - timer >= 1000) {
timer = millis();
SEC++;}
if (millis() - myTimer2 >= 200) {
myTimer2 = millis(); // сбросить таймер
getTemp();
}
// если прошло 59 секунд, прибавляем 1 минуту
if (SEC > 59) { SEC = 0; MIN++; }
// если прошло 59 минут, прибавляем 1 час
if (MIN > 59) { MIN = 0; HOUR++; }
if (HOUR > 23) { HOUR = 0; day++; }
if (day>31){mon++;}
if(mon>12){year++;}
// выводим время на дисплей
LCD.setCursor(0, 0);
if (HOUR < 10) LCD.print(0);LCD.print(HOUR);LCD.print(':');
if (MIN < 10) LCD.print(0);LCD.print(MIN);LCD.print(':');
if (SEC < 10) LCD.print(0);LCD.print(SEC);
//выводим дату
LCD.setCursor(0, 1);
if (day < 10) LCD.print(0);LCD.print(day);LCD.print('.');
if (mon < 10) LCD.print(0);LCD.print(mon);LCD.print('.');
if (year < 10) LCD.print(0);LCD.print(year);
// TEMP
LCD.setCursor(11, 0); // курсор в 11,0
LCD.print("Temp:");
LCD.setCursor(11, 1); // курсор в 11,1
LCD.print(temp);
// узнаем текущее состояние кнопки
button1IsUp = !digitalRead(9);
button2IsUp = !digitalRead(8);
// если кнопка 1 нажата, заходим в настройки (цикл while)
if (btn1flag == 0 && button1IsUp == 1 && millis()-LP>BT)
{
btn1flag = !btn1flag;
LCD.clear(); w++; SEC=0; LP=millis();
}
if (!btn1flag == 0 && !button1IsUp == 1 && millis()-LP>BT)
{
btn1flag = !btn1flag; LP=millis();
}
while (w == 1) {
if (HOUR > 23) { HOUR = 0; }
LCD.setCursor(0, 0);
if (HOUR < 10) LCD.print(0);LCD.print(HOUR);LCD.print(':');
if (MIN < 10) LCD.print(0);LCD.print(MIN);LCD.print(':');
if (SEC < 10) LCD.print(0);LCD.print(SEC);
LCD.setCursor(2, 1);
LCD.print("HOUR SETTING");
button1IsUp = !digitalRead(9);
button2IsUp = !digitalRead(8);
// если кнопка 1 была нажата, заходим во 2 цикл while
if (btn1flag == 0 && button1IsUp == 1)
{
LCD.clear(); w++;
btn1flag = !btn1flag;
}
if (!btn1flag == 0 && !button1IsUp == 1)
{
btn1flag = !btn1flag;
}
// если кнопка 2 была нажата, прибавляем 1 час
if (btn2flag == 0 && button2IsUp == 1)
{
HOUR++;
btn2flag = !btn2flag;
}
if (!btn2flag == 0 && !button2IsUp == 1)
{
btn2flag = !btn2flag;
}
}
while (w == 2) {
LCD.setCursor(0, 0);
if (HOUR < 10) LCD.print(0);LCD.print(HOUR);LCD.print(':');
if (MIN < 10) LCD.print(0);LCD.print(MIN);LCD.print(':');
if (SEC < 10) LCD.print(0);LCD.print(SEC);
LCD.setCursor(1, 1);
LCD.print("MINUTE SETTING");
if (MIN > 59) { MIN = 0; }
button1IsUp = !digitalRead(9);
button2IsUp = !digitalRead(8);
// если кнопка 1 была нажата, заходим в 3 цикл while
if (btn1flag == 0 && button1IsUp == 1)
{
LCD.clear(); w++;
btn1flag = !btn1flag;
}
if (!btn1flag == 0 && !button1IsUp == 1)
{
btn1flag = !btn1flag;
}
// если кнопка 2 была нажата, прибавляем 1 минуту
if (btn2flag == 0 && button2IsUp == 1)
{
MIN++;
btn2flag = !btn2flag;
}
if (!btn2flag == 0 && !button2IsUp == 1)
{
btn2flag = !btn2flag;
}
}
while (w == 3) {
if (day > 31) { HOUR = 0; }
LCD.setCursor(0, 1);
if (day < 10) LCD.print(0);LCD.print(day);LCD.print('.');
if (mon < 10) LCD.print(0);LCD.print(mon);LCD.print('.');
if (year < 10) LCD.print(0);LCD.print(year);
LCD.setCursor(2, 0);
LCD.print("DAY SETTING");
button1IsUp = !digitalRead(9);
button2IsUp = !digitalRead(8);
// если кнопка 1 была нажата, заходим во 2 цикл while
if (btn1flag == 0 && button1IsUp == 1)
{
LCD.clear(); w++;
btn1flag = !btn1flag;
}
if (!btn1flag == 0 && !button1IsUp == 1)
{
btn1flag = !btn1flag;
}
// если кнопка 2 была нажата, прибавляем 1 час
if (btn2flag == 0 && button2IsUp == 1)
{
day++;
btn2flag = !btn2flag;
}
if (!btn2flag == 0 && !button2IsUp == 1)
{
btn2flag = !btn2flag;
}
}
while (w == 4) {
if (mon >12 ) { mon = 0; }
LCD.setCursor(0, 1);
if (day < 10) LCD.print(0);LCD.print(day);LCD.print('.');
if (mon < 10) LCD.print(0);LCD.print(mon);LCD.print('.');
if (year < 10) LCD.print(0);LCD.print(year);
LCD.setCursor(2, 0);
LCD.print("MON SETTING");
button1IsUp = !digitalRead(9);
button2IsUp = !digitalRead(8);
// если кнопка 1 была нажата, заходим во 2 цикл while
if (btn1flag == 0 && button1IsUp == 1)
{
LCD.clear(); w++;
btn1flag = !btn1flag;
}
if (!btn1flag == 0 && !button1IsUp == 1)
{
btn1flag = !btn1flag;
}
// если кнопка 2 была нажата, прибавляем 1 час
if (btn2flag == 0 && button2IsUp == 1)
{
mon++;
btn2flag = !btn2flag;
}
if (!btn2flag == 0 && !button2IsUp == 1)
{
btn2flag = !btn2flag;
}
}
while (w == 5) {
if (year > 99) { year = 0; }
LCD.setCursor(0, 1);
if (day < 10) LCD.print(0);LCD.print(day);LCD.print('.');
if (mon < 10) LCD.print(0);LCD.print(mon);LCD.print('.');
if (year < 10) LCD.print(0);LCD.print(year);
LCD.setCursor(2, 0);
LCD.print("YEAR SETTING");
button1IsUp = !digitalRead(9);
button2IsUp = !digitalRead(8);
// если кнопка 1 была нажата, заходим во 2 цикл while
if (btn1flag == 0 && button1IsUp == 1)
{
LCD.clear(); w=0;
btn1flag = !btn1flag;
}
if (!btn1flag == 0 && !button1IsUp == 1)
{
btn1flag = !btn1flag;
}
// если кнопка 2 была нажата, прибавляем 1 час
if (btn2flag == 0 && button2IsUp == 1)
{
year++;
btn2flag = !btn2flag;
}
if (!btn2flag == 0 && !button2IsUp == 1)
{
btn2flag = !btn2flag;
}
}
}
void getTemp() {
// суммируем температуру в общую переменную
tempSum += sensors.getTempCByIndex(0);
sensors.requestTemperatures();
// счётчик измерений
tempCounter++;
if (tempCounter >= 5) { // если больше 5
tempCounter = 0; // обнулить
temp = tempSum / 5; // среднее арифметическое
tempSum = 0; // обнулить
}
}