koupil jsem si hodiny "Arduino RTC Hodiny reálného času DS3231 AT24C32" (na https://www.laskarduino.cz/arduino-rtc- ... 1-at24c32/) v nich mám LIR2032 baterii, čas se mi ukazuje na displeji a hodiny řídí relé. To cele mám zapojené k Arduinu Unu a to je napájené ze sítě.
Zapojené a naprogramované je mám podle tohoto návodu : https://navody.arduino-shop.cz/navody-k ... modul.html.
Kód: Vybrat vše
//DHT11 teploměr a vlhkoměr
/*#include "DHT.h"
#define pinDHT 6 // nastavení čísla pinu s připojeným DHT senzorem
#define typDHT11 DHT11 // DHT 22
DHT mojeDHT(pinDHT, typDHT11); // inicializace DHT senzoru s nastaveným pinem a typem senzoru
*/
//G3MB-202P relé 5VDC-240AC
//#define RELE_PIN_cer 12 //CH1 pro čerpadlo
//#define RELE_PIN_sve 13 //CH2 pro světlo
#define RELE_PIN_ven 12 //CH3 pro ventilátor
#define RELE_PIN_zvl 11 //CH4 pro zvlhčovač
//LM393 světelný senzor
#define pinOUT A0
//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
#include <Wire.h> // připojení potřebných knihoven
#include <DS3231.h>
DS3231 rtc; // inicializace RTC z knihovny
RTCDateTime datumCas; // vytvoření proměnné pro práci s časem
// LCD 20x4 I2C
#include <Wire.h> // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // nastavení adresy I2C (0x27 v mém případě) a dále počtu znaků a řádků LCD, zde 20x4
//HC-SR04 ultrazvukový měřič vzdálenosti
int pTrig = 4;
int pEcho = 5;
long odezva, vzdalenost; // inicializace proměnných, do kterých se uloží data
//PH modul a sonda pro měření PH
const int pinPo = A0;
//Senzor BME280
// připojení potřebných knihoven
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// nastavení adresy senzoru
#define BME280_ADRESA (0x76)
// inicializace senzoru BME z knihovny
Adafruit_BME280 bme;
void setup() {
Serial.begin(9600); // komunikace přes sériovou linku rychlostí 9600 baud
//DHT11 Teploměr a vlhkoměr
// mojeDHT.begin(); // zapnutí komunikace s teploměrem DHT
//HC-SR04 ultrazvukový měřič vzdálenosti
pinMode(pTrig, OUTPUT); // nastavení pinů modulu jako výstup a vstup pro měření vzdalenosti
pinMode(pEcho, INPUT);
//LM393 Světelný senzor
pinMode(8, INPUT);
pinMode(9, OUTPUT);
//G3MB-202P relé 5VDC-240AC
//pinMode(RELE_PIN_cer, OUTPUT); //relé 5V-220V CH1 pro čerpadlo
//pinMode(RELE_PIN_sve, OUTPUT); //relé 5V-220V CH2 pro světlo
pinMode(RELE_PIN_ven, OUTPUT); //relé 5V-220V CH3 pro ventilátor
pinMode(RELE_PIN_zvl, OUTPUT); //relé 5V-220V CH4 pro zvlhčovač
//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
rtc.begin(); // zahájení komunikace s RTC obvodem
rtc.setDateTime(__DATE__, __TIME__); // nastavení času v RTC podle času kompilace programu; přímé nastavení času pro RTC; rtc.setDateTime(__DATE__, "12:34:56");
// LCD 20x4 I2C
lcd.begin(); // inicializace LCD
lcd.backlight(); // zapnutí podsvícení
lcd.setCursor( 0, 0);
lcd.print("Tep ");
lcd.setCursor( 0, 1);
lcd.print("Vlh ");
lcd.setCursor( 0, 2);
lcd.print("Tlk ");
lcd.setCursor( 0, 3);
lcd.print("Cas ");
lcd.setCursor( 15, 1);
lcd.print("HYD");
lcd.setCursor( 15, 2);
lcd.print("2.3.3");
lcd.setCursor( 15, 3);
lcd.print("Rust");
//lcd.setCursor( 10, 0);
//lcd.print("Rez ");
lcd.setCursor( 13, 0);
lcd.print("PH");
//lcd.setCursor( 10, 2);
//lcd.print("Cer ");
delay(1000);
//Senzor BME280
// v případě chyby je vypsána hláška po sériové lince
// a zastaven program
if (!bme.begin(BME280_ADRESA)) {
Serial.println("BME280 senzor nenalezen, zkontrolujte zapojeni!");
while (1);
}
}
void loop() {
//DHT11 Teploměr a vlhkoměr
//dht11(1000);
//HC-SR04 ultrazvukový měřič vzdálenosti
hc_sr04(1000);
//LM393 Světelný senzor
lm393(1000);
//G3MB-202P relé 5VDC-240AC CH1 pro světlo
//g3mb_202p_CH1();
//G3MB-202P relé 5VDC-240AC CH2 pro čerpadlo
//g3mb_202p_CH2();
//G3MB-202P relé 5VDC-240AC CH3 pro ventilator
g3mb_202p_CH3();
//G3MB-202P relé 5VDC-240AC CH4 pro zvlhčovač
g3mb_202p_CH4();
//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
ds3231(1000);
//PH modul a sonda pro měření PH
phSonda();
//Senzor BME280
bme280(2000);
}
//DHT11 Teploměr a vlhkoměr
/* void dht11(short dht11_Delay) {
// pomocí funkcí readTemperature a readHumidity načteme
// do proměnných tep a vlh informace o teplotě a vlhkosti,
// čtení trvá cca 250 ms
int tep = mojeDHT.readTemperature();
int vlh = mojeDHT.readHumidity();
// kontrola, jestli jsou načtené hodnoty čísla pomocí funkce isnan
if (isnan(tep) || isnan(vlh)) {
// při chybném čtení vypiš hlášku
Serial.println("Chyba při čtení z DHT senzoru!");
lcd.setCursor( 13, 0);
lcd.print("Er");
} else {
// pokud jsou hodnoty v pořádku,
// vypiš je po sériové lince
Serial.print("Teplota: ");
Serial.print(tep);
Serial.print(" °C, ");
lcd.setCursor( 4, 0);
lcd.print(tep);
lcd.print("C");
Serial.print("vlhkost: ");
Serial.print(vlh);
Serial.println(" %");
lcd.setCursor( 4, 1);
lcd.print(vlh);
lcd.print("%");
}
// pauza pro přehlednější výpis
delay(dht11_Delay);
}
*/
//HC-SR04 ultrazvukový měřič vzdálenosti
void hc_sr04(short hc_sr04_Delay) {
// nastavíme na 2 mikrosekundy výstup na GND (pro jistotu)
// poté nastavíme na 5 mikrosekund výstup rovný napájení
// a poté opět na GND
digitalWrite(pTrig, LOW);
delayMicroseconds(2);
digitalWrite(pTrig, HIGH);
delayMicroseconds(5);
digitalWrite(pTrig, LOW);
// pomocí funkce pulseIn získáme následně
// délku pulzu v mikrosekundách (us)
odezva = pulseIn(pEcho, HIGH);
// přepočet získaného času na vzdálenost v cm
vzdalenost = odezva / 58.31;
Serial.print("Vzdalenost je ");
Serial.print(vzdalenost);
Serial.println(" cm.");
//lcd.setCursor( 14, 0);
//lcd.print(vzdalenost);
// pauza 0.5 s pro přehledné čtení
delay(hc_sr04_Delay);
}
//LM393 Světelný senzor
void lm393(short lm393_Delay) {
int temp = digitalRead(8); //assign value of LDR sensor to a temporary variable
Serial.println("Intenzita"); //print on serial monitor using ""
Serial.println(temp); //display output on serial monitor
if (temp == 0) {
//lcd.setCursor( 16, 0);
//lcd.print("ZAP");
}
if (temp == 1) {
//lcd.setCursor( 16, 1);
//lcd.print("VYP");
}
delay(lm393_Delay);
}
//RTC DS3231 hodiny reálného času + AT24C32 paměťový modul
void ds3231(short DS3231_delay) {
// načtení času z RTC do proměnné
datumCas = rtc.getDateTime();
// postupný tisk informací po sériové lince
Serial.print("Datum a cas DS3231: ");
Serial.print(datumCas.year); Serial.print("-");
Serial.print(datumCas.month); Serial.print("-");
Serial.print(datumCas.day); Serial.print(" ");
Serial.print(datumCas.hour); Serial.print(":");
Serial.print(datumCas.minute); Serial.print(":");
Serial.print(datumCas.second); Serial.println("");
lcd.setCursor( 4, 3);
lcd.print(datumCas.hour);
lcd.setCursor( 6, 3);
lcd.print(":");
lcd.setCursor( 7, 3);
lcd.print(datumCas.minute);
lcd.setCursor( 9, 3);
lcd.print(":");
lcd.setCursor( 10, 3);
lcd.print(datumCas.second);
// pauza na konci smyčky loop
delay(DS3231_delay);
}
//}
//G3MB-202P relé 5VDC-240AC CH1 pro světlo
//void g3mb_202p_CH1(){
//
// //sepnuté světlo
// if (datumCas.hour < 21 && datumCas.hour > 3) {
// digitalWrite(RELE_PIN_sve, LOW);
// }
// else{
// digitalWrite(RELE_PIN_sve, HIGH);
//}
//}
//G3MB-202P relé 5VDC-240AC CH2 pro čerpadlo
/*void g3mb_202p_CH2(){
//sepnutý čerpadlo
if (datumCas.minute >= 0 && datumCas.minute <= 5 || datumCas.minute >= 30 && datumCas.minute <= 35) {
digitalWrite(RELE_PIN_cer, LOW);
}
//rozepnutý čerpadlo
else{
digitalWrite(RELE_PIN_cer, HIGH);
}
}*/
//G3MB-202P relé 5VDC-240AC CH3 pro ventilátor
void g3mb_202p_CH3() {
int tep = bme.readTemperature();
int vlh = bme.readHumidity();
if (tep >= 25 && datumCas.hour >= 0 && datumCas.hour <= 17) {
//sepnutý ventilátor Den
digitalWrite(RELE_PIN_ven, LOW);
lcd.setCursor( 8, 0);
lcd.print("ZAP1");
};
if (tep <= 22 && datumCas.hour >= 0 && datumCas.hour <= 17) {
//rozepnutý ventilátor
digitalWrite(RELE_PIN_ven, HIGH);
lcd.setCursor( 8, 0);
lcd.print("VYP1");
};
if (tep >= 22 && datumCas.hour <= 23 && datumCas.hour >= 18) {
//sepnutý ventilátor Noc
digitalWrite(RELE_PIN_ven, LOW);
lcd.setCursor( 8, 0);
lcd.print("ZAP4");
};
if (tep <= 20 && datumCas.hour <= 23 && datumCas.hour >= 18) {
//rozepnutý ventilátor
digitalWrite(RELE_PIN_ven, HIGH);
lcd.setCursor( 8, 0);
lcd.print("VYP2");
};
if (vlh >= 75 && datumCas.hour <= 23 && datumCas.hour >= 18) {
//sepnutý ventilátor
digitalWrite(RELE_PIN_ven, LOW);
lcd.setCursor( 8, 0);
lcd.print("ZAP5");
};
if (vlh >= 65 && datumCas.hour >= 0 && datumCas.hour <= 17) {
//sepnutý ventilátor
digitalWrite(RELE_PIN_ven, LOW);
lcd.setCursor( 8, 0);
lcd.print("ZAP6");
};
}
//G3MB-202P relé 5VDC-240AC CH4 pro zvlhčovač
void g3mb_202p_CH4() {
int vlh = bme.readHumidity();
if (vlh <= 60 && datumCas.hour >= 0 && datumCas.hour <= 17) {
//sepnutý zvlhčovač Den
digitalWrite(RELE_PIN_zvl, LOW);
lcd.setCursor( 8, 1);
lcd.print("ZAP1");
};
if (vlh >= 70 && datumCas.hour >= 0 && datumCas.hour <= 17) {
//rozepnutý zvlhčovač
digitalWrite(RELE_PIN_zvl, HIGH);
lcd.setCursor( 8, 1);
lcd.print("VYP1");
}
if (vlh <= 50 && datumCas.hour <= 23 && datumCas.hour >= 18) {
//sepnutý zvlhčovač Noc
digitalWrite(RELE_PIN_zvl, LOW);
lcd.setCursor( 8, 1);
lcd.print("ZAP2");
};
if (vlh >= 60 && datumCas.hour <= 23 && datumCas.hour >= 18) {
//rozepnutý zvlhčovač
digitalWrite(RELE_PIN_zvl, HIGH);
lcd.setCursor( 8, 1);
lcd.print("VYP2");
};
}
//PH modul a sonda pro měření
void phSonda() {
// vytvoření pomocných proměnných
int pole[10];
int zaloha;
unsigned long int prumerVysl = 0;
// načtení deseti vzorků po 10 ms do pole
for (int i = 0; i < 10; i++) {
pole[i] = analogRead(pinPo);
delay(10);
}
// seřazení členů pole naměřených výsledků podle velikosti
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (pole[i] > pole[j]) {
zaloha = pole[i];
pole[i] = pole[j];
pole[j] = zaloha;
}
}
}
// uložení 2. až 8. výsledku do
// proměnné, z které se vypočte průměr
// (vynechání dvou členů pole na začátku
// a konci pro lepší přesnost)
for (int i = 2; i < 8; i++) {
prumerVysl += pole[i];
}
// výpočet hodnoty pH z průměru
// měření a přepočet na rozsah 0-14 pH
float prumerPH = (float)prumerVysl * 5.0 / 1024 / 6;
float vyslednePH = -5.70 * prumerPH + 21.34;
// vytištění výsledků po sériové lince
Serial.print("Namerene pH: ");
Serial.println(vyslednePH);
lcd.setCursor( 15, 0);
lcd.print(vyslednePH);
// pauza 900 ms před novým měřením, celkem tedy 1s
delay(900);
}
//Sensor BME280
void bme280(short bme280_delay) {
// výpis všech dostupných informací ze senzoru BMP
int tep = bme.readTemperature();
int vlh = bme.readHumidity();
float tlk = bme.readPressure() / 100.0F;
// výpis teploty
Serial.print("Teplota: ");
Serial.print(bme.readTemperature());
Serial.println(" stupnu Celsia.");
lcd.setCursor( 4, 0);
lcd.print(tep);
lcd.print("C");
// výpis relativní vlhkosti
Serial.print("Relativni vlhkost: ");
Serial.print(bme.readHumidity());
Serial.println(" %");
lcd.setCursor( 4, 1);
lcd.print(vlh);
lcd.print("%");
// výpis tlaku s přepočtem na hektoPascaly
Serial.print("Tlak: ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa.");
lcd.setCursor( 4, 2);
lcd.print(tlk);
lcd.print("hPa");
// vytištění prázdného řádku a pauza po dobu 2 vteřin
Serial.println();
delay(bme280_delay);
}
A druhý problém nastává při restartu arduina, čas začne znovu odpočítávat od času nahrání programu.
Měl byněkdo nápad, co s tím.
Díky za každou radu