помогите запустить rtc и lcd
- Войдите на сайт для отправки комментариев
Здравствуйте! Прошу помощи. Ситуация следующая:
в наличии: - arduino pro mini 5v16MHz ATmega328, lcd 16x2 blue + IIC плата (адрес 0x27), RTC 1307 (синяя платка такая Tiny RTC написано), сенсорная кнопка ttp223, инфракрасный датчик препятствия, мнфракрасный датчик HC-SR501, исполнитель мосфет (вкл светодиодную ленту).
назначение: по сигналу с HC-SR501 открывается мосфет. Часы нужны для того, чтобы в ночное время мосфет не открывался. Дисплей попутно отображает текущее время, при этом включение дисплея происходит либо по касанию сенсорной кнопки, либо при срабатывании датчика препятствия.
Что не получается: к выводам А4 и А5 подключаю RTC выводами SDA и SCL соответственно. сюда же подключаю LCD (в парралель с RTC). загружаю скетч - на lcd горит подсветка вместо символов - квадраты, в монитор порта данные не идут. Пробую отключить А4 и А5. Гружу скетч - в монитор порта идут данные. Выключаю питание, возвращаю А4 и А5 на место, включаю - в монитор порта данные не идут, на lcd текущее время, подсветка не работает. Все соединения проверил сто раз, всё нормально.
Скетч:
#include <Wire.h> #include <iarduino_RTC.h> #include <iarduino_RTC_DS1302.h> #include <iarduino_RTC_DS1307.h> #include <iarduino_RTC_DS3231.h> #include <iarduino_RTC_I2C.h> #include <memorysaver.h> iarduino_RTC time(RTC_DS1307); #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); unsigned long currentMillis=0; int offTime=7000; unsigned long currentMillis2=0; int offlight=5000; #define ledPin 2 //исполнительное реле #define pirD1 3 //HC-SR501 #define pirD2 4 //ttp 223 #define pirD3 5 //инфракрасный датчик препятствия boolean z=false; boolean w=false; unsigned long timeRegim=0; unsigned long preTimeRegim=0; int interval=1800000; byte hour=0; boolean regim=true; void setup(){ Wire.begin(); pinMode(ledPin, OUTPUT); pinMode(pirD1, INPUT); pinMode(pirD2, INPUT); Serial.begin(9600); lcd.init(); time.begin(); time.settime(0,55,9,20,07,18,5); //установка времени сек, мин, час, день, мес, год, день недели } void loop(){ if(regim==true){Serial.println("Regim true"); int pirState=digitalRead(pirD1); if(pirState==HIGH){Serial.println("sensor activated"); z=true; currentMillis=millis(); }; if(z==true){ if(millis()-currentMillis>offTime){Serial.println("timer is out"); digitalWrite(ledPin, LOW); z=false; } else{ digitalWrite(ledPin, HIGH); } }; } else if(regim==false){ digitalWrite(ledPin, LOW); } int pirState2=digitalRead(pirD2); int pirState3=digitalRead(pirD3); if(pirState3==LOW){Serial.println("sensor_opt LCD activated"); w=true; currentMillis2=millis(); delay(500); }; if(pirState2==HIGH){Serial.println("sensor_emk LCD activated"); w=true; currentMillis2=millis(); delay(500); }; if(w==true){ if(millis()-currentMillis2>offlight){Serial.println("timer LCD light is out"); lcd.noDisplay(); w=false; } else{ lcd.display(); } }; if(millis()%1000==0){ Serial.println(time.gettime("d-m-Y, H:i:s, D")); delay(1); } lcd.clear(); lcd.setCursor(5,0); lcd.print(time.gettime("H")); lcd.setCursor(7,0);lcd.print(":"); lcd.setCursor(8,0); lcd.print(time.gettime("i")); lcd.setCursor(10,0); lcd.print(":"); lcd.setCursor(11,0); lcd.print(time.gettime("s")); lcd.setCursor(4,1); lcd.print(time.gettime("d")); lcd.setCursor(6,1); lcd.print("-"); lcd.setCursor(7,1); lcd.print(time.gettime("m")); lcd.setCursor(9,1); lcd.print("-"); lcd.setCursor(10,1); lcd.print(time.gettime("Y")); timeRegim=millis(); if(preTimeRegim>timeRegim){ preTimeRegim=0; }; if(timeRegim-preTimeRegim>interval){ // Функция gettime() в данной библиотеке не возвращает число, она возвращает значение типа char. // Вместо int x = time.gettime("h"); напишите int x = atoi(time.gettime("h")); hour=atoi(time.gettime("h")); preTimeRegim=timeRegim; } if(hour>=19||hour<7){ regim=true; } else{ regim=false; } }
Ещё раз прошу сильно не пинать, я ещё только учусь.
В строке №30 переменная инициализируется недопустимым значением. Максимальным допустимым значение переменной int является 32767
Спасибо. Изменил тип переменной на unsigned long.
Проблема частично решена. Откинув шину i2c гружу скетч, выключаю питание, подключаю i2c, отключаю все провода от программатора (DTR, RX, TX) кроме питания. Всё работает. Но, конечно, хотелось бы чтоб и в монитор порта данные передавались одновременно. Ладно, это не главное. Есть другой момент - при активации дисплея цифры на нём моргают с частотой (примерно) светодиода RX. Как это исправить, а то глаза режет?
Ну, как. Вы же очищаете и рисуете заново весь экрна целиком (строки 98-115) при каждом вызове loop. Конечно, будет мигать.
Вам нужно сделать две вещи.
1) выводить только тогда, когда что-то изменилось
2) выводить не весь экран, а только то, что изменилось
Разумеетя, первый раз надо вывести всё - это можно в setup сделать.
ЕвгенийП, я вот написал что всё работает и поторопился... Увы после перезагрузки проблема вернулась. Как Вы считаете, может ли это быть следствием помех от питающих проводов или ошибка в программе (изделии)? Дело в том, что связка ардуоно-кнопка-датчики работают. Косяк только в дисплее с часами. Ну не хочет дисплей время показывать. как часы с дисплеем подключаешь - ничего не работает...
Попробуйте сделать часы с дисплеем отдельно. Хоть вот так - https://lesson.iarduino.ru/page/urok-17-podklyuchenie-rtc-chasy-realnogo-vremeni-s-knopkami/ А уж потом добавляйте свои датчики
Спасибо за совет. Попробую.