Po pierwsze witam wszystkich - jest to mój pierwszy post na forum. Zwracam się do was z prośbą o pomoc w rozwiązaniu problemu we własnym projekcie opartym na ATMEGA238P (czyli de facto UNO). Projekt ten jest bardzo podstawowym sterownikiem do akwarium 240l. Ma włączać o zadanej godzinie światło dzienne, po nim nocne, wyłączać na noc w ogóle światło. Do tego na LCD wyświetla się godzina i data, stan oświetlenia, temperatura wody i temperatura oraz wilgotność otoczenia.
PROBLEM 1: Oświetlenie dzienne powinno się włączyć o godzinie 7:00 natomiast włącza się o 5... Wyłącza się prawidłowo o 22 i o tej godzinie włącza się prawidłowo nocne oświetlenie. Nocne światło również wyłącza się prawidłowo o 23:59.
PROBLEM 2: Po włączeniu oświetlenia nocnego miga pierwszy znak na LCD, po załączeniu światła dziennego jest ok.
Oto kod:
Sprawdzałem kod i nie widzę powodu moich problemów, ale może ja nie widzę. Z góry dzięki za pomoc, pozdrawiam!
EDIT1: Problem 2 rozwiązany - za dużo spacji w tekście "Oswietlenie nocne".
PROBLEM 1: Oświetlenie dzienne powinno się włączyć o godzinie 7:00 natomiast włącza się o 5... Wyłącza się prawidłowo o 22 i o tej godzinie włącza się prawidłowo nocne oświetlenie. Nocne światło również wyłącza się prawidłowo o 23:59.
PROBLEM 2: Po włączeniu oświetlenia nocnego miga pierwszy znak na LCD, po załączeniu światła dziennego jest ok.
Oto kod:
Kod:
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <OneWire.h>
#include <DS18B20.h>
#include <LCD.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
//ADDR,EN,R/W,RS,D4,D5,D6,D7
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);
// Numer pinu czujnika temperatury wody
#define ONEWIRE_PIN 3
// Adres czujnika temperatury wody
byte address[8] = {0x28, 0x34, 0x71, 0x2A, 0x7, 0x0, 0x0, 0x9E};
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);
//czujnik DHT-22 - pokój temperatura i wilgotność
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define wlacznik_1 5 // pin przekaźnika - swiatlo dzienne
#define wlacznik_2 6 // pin przekaźnika - swiatlo nocne
// zmienne przechowujące aktualną godzinę i minutę
int godzina = 0;
int minuta = 0;
// aktualny czas w formacie np. 13:00 -> 1300
int aktualnyczas = 0;
// ramy czasowe
int czas_on = 0700;
int czas_off = 2200;
int czasnocny_off = 2359;
// odświeżanie daty na wyświetlaczu co sekundę
unsigned long previousMillis = 0;
const long interval = 1000;
void setup() {
Serial.begin(9600);
while (!Serial) ;
delay(200);
lcd.begin (20,4); // 20 x 4 LCD module
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
//start czujnika temp wody
sensors.begin();
sensors.request(address);
lcd.clear();
//konfiguracja początkowa przekaźnika
pinMode(wlacznik_1, OUTPUT);
digitalWrite(wlacznik_1, HIGH);
pinMode(wlacznik_2, OUTPUT);
digitalWrite(wlacznik_2, HIGH);
//start DHT-22
dht.begin();
}
//Ustawienie zera dla liczb poniżej 10
void print2digits(int number) {
if (number >= 0 && number < 10) {
lcd.write('0');
}
lcd.print(number);
}
void loop() {
czas(); //funkcja czasu i daty
temperatura(); //funkcja temperatury
temperaturaDHT22(); //funcka czujnika DHT22
swiatlo_dzienne(); // sterowanie swiatlem dziennym
swiatlo_nocne(); // sterowanie swiatlem nocnym
digitalWrite(LED_BUILTIN, HIGH);
}
void czas() {
//Wyświetlenie zegara i daty na LCD
tmElements_t tm;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (RTC.read(tm)) {
lcd.setCursor(0,0);
print2digits(tm.Hour);
godzina = tm.Hour;
lcd.print(':');
print2digits(tm.Minute);
minuta = tm.Minute;
lcd.print(':');
print2digits(tm.Second);
lcd.setCursor(10,0);
print2digits(tm.Day);
lcd.print('-');
print2digits(tm.Month);
lcd.print('-');
lcd.print(tmYearToCalendar(tm.Year));
}
}
}
void temperatura() {
//Wyświetlanie temperatury wody
if (sensors.available())
{
float temperature = sensors.readTemperature(address);
lcd.setCursor(2,1);
lcd.print("Woda");
lcd.setCursor(1,2);
lcd.print(temperature); lcd.print((char)223); lcd.print("C");
sensors.request(address);
}
}
void swiatlo_dzienne() {
aktualnyczas = godzina * 100 + minuta; //np. 13:00 -> 1300
if (aktualnyczas >= czas_on && aktualnyczas <= czas_off)
{
digitalWrite(wlacznik_1, LOW);
lcd.setCursor(0,3);
lcd.print("Oswietlenie dzienne");
}
else {
digitalWrite(wlacznik_1, HIGH);
if (aktualnyczas >= 0 && aktualnyczas < czas_on)
{
lcd.setCursor(0,3);
lcd.print(" Swiatlo wylaczone");
}
}
}
void swiatlo_nocne() {
aktualnyczas = godzina * 100 + minuta; //np. 13:00 -> 1300
if (aktualnyczas >= czas_off && aktualnyczas <= czasnocny_off)
{
digitalWrite(wlacznik_2, LOW);
lcd.setCursor(0,3);
lcd.print(" Oswietlenie nocne ");
}
else {
digitalWrite(wlacznik_2, HIGH);
}
}
void temperaturaDHT22() {
float h = dht.readHumidity();
float t = dht.readTemperature();
lcd.setCursor(12,1);
lcd.print(h); lcd.print("%");
lcd.setCursor(12,2);
lcd.print(t); lcd.print((char)223); lcd.print("C");
}
Sprawdzałem kod i nie widzę powodu moich problemów, ale może ja nie widzę. Z góry dzięki za pomoc, pozdrawiam!
EDIT1: Problem 2 rozwiązany - za dużo spacji w tekście "Oswietlenie nocne".