• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Kontroler do akwarium - problem
#1
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:
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".
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości