помогите запустить rtc и lcd

domino13
Offline
Зарегистрирован: 20.07.2018

Здравствуйте! Прошу помощи. Ситуация следующая:

в наличии: - 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;
            }
}

Ещё раз прошу сильно не пинать, я ещё только учусь.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строке №30 переменная инициализируется недопустимым значением. Максимальным допустимым значение переменной int  является 32767

domino13
Offline
Зарегистрирован: 20.07.2018

Спасибо. Изменил тип переменной на unsigned long.

domino13
Offline
Зарегистрирован: 20.07.2018

Проблема частично решена. Откинув шину i2c гружу скетч, выключаю питание, подключаю i2c, отключаю все провода от программатора (DTR, RX, TX) кроме питания. Всё работает. Но, конечно, хотелось бы чтоб и в монитор порта данные передавались одновременно. Ладно, это не главное. Есть другой момент - при активации дисплея цифры на нём моргают с частотой (примерно) светодиода RX. Как это исправить, а то глаза режет?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, как. Вы же очищаете и рисуете заново весь экрна целиком (строки 98-115) при каждом вызове loop. Конечно, будет мигать.

Вам нужно сделать две вещи.

1) выводить только тогда, когда что-то изменилось

2) выводить не весь экран, а только то, что изменилось

Разумеетя, первый раз надо вывести всё - это можно в setup сделать.

domino13
Offline
Зарегистрирован: 20.07.2018

ЕвгенийП, я вот написал что всё работает и поторопился... Увы после перезагрузки проблема вернулась. Как Вы считаете, может ли это быть следствием помех от питающих проводов или ошибка в программе (изделии)? Дело в том, что связка ардуоно-кнопка-датчики работают. Косяк только в дисплее с часами. Ну не хочет дисплей время показывать. как часы с дисплеем подключаешь - ничего не работает...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Попробуйте сделать часы с дисплеем отдельно. Хоть вот так - https://lesson.iarduino.ru/page/urok-17-podklyuchenie-rtc-chasy-realnogo-vremeni-s-knopkami/ А уж потом добавляйте свои датчики

domino13
Offline
Зарегистрирован: 20.07.2018

Спасибо за совет. Попробую.