Muže te mi prosím poradit, co s tím je?
Kdysi mi brácha poskládal kod,pro stmívání,svítání a měření teploty v akváriu a v místnosti,vše funguje jak má.
Já jsem do toho kodu, přidal pár řádků pro spínání relé,
relé v určeném času sepne na 7 vteřin a tím spustí peristaltickou pumpu.
K mému překvapení to fungovalo.
No ale můj problém je, že to funguje tak 3 až 5 dní (nejdéle týden)
relé přestane spínat (vše ostatní jede jak má) a nepomůže ani restart arduina,
jedině co funguje,je znovu nahráti kodu do arduina, a zase to jde pár dní a cele se opakuje.
skoušel jsem jiné arduino,hodiny,relé ale je to furt stejné,
takže prosím o radu, "Nevíte co s tím je?"
Kód: Vybrat vše
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); // nastavení adresy (0x3F) je duležité!!
#include <Wire.h>
#include <DS3231.h> //http://www.rinkydinkelectronics.com/library.php?id=73
const int pinCidlaDS = 2;//teplotní čidlo vody je připojeno k Digitálnímu pinu D2
OneWire oneWireDS(pinCidlaDS);
DallasTemperature senzoryDS(&oneWireDS);
// Init the DS3231 using the hardware interface
DS3231 rtc(SDA, SCL);
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val / 10 * 16) + (val % 10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val / 16 * 10) + (val % 16) );
}
int svetlo1 = 9;//pwm vystup - pin 9
int sviti = 0;
int den = 0;
int rele = 8;// rele - pin 8
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
void setup()
{
rtc.begin();
lcd.init();
lcd.backlight();
pinMode(rele, OUTPUT);
digitalWrite(8, HIGH);
Wire.begin();
// Nastavení hodin a datumu po nastavení dát do poznámek mění se jen to co jen odemknuto
// v upravene knihovne 1=PONDELI,2=UTERY,...(odkaz je na standartní knihovnu)
// rtc.setDOW(2); // Den v tydnu- mozno napsat jako cislo nebo jako den -- rtc.setDOW(1) -- rtc.setDOW(PONDELI)
// rtc.setTime( 21, 12, 00); // Nastaveni Casu 12:00:00 (24hod format) po nastavení dát // a znovu nahrát jinak při resetu se znovu nastaví
// rtc.setDate(24, 4, 2018); // Nastaveni datumu den/mesic/rok
}
void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year )
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime()
{
// retrieve data from DS3231 readDS3231time(&second, &minute,&hour,&dayOfWeek, &dayOfMonth, &month,&year );
senzoryDS.requestTemperatures(); //při stmívání nebo svítání obnovuje co 10 sekund jinak co 1 sekundu
lcd.setCursor(0, 0);
lcd.print ("Cas: ");
lcd.print(rtc.getTimeStr(1));// v zavorce 1 bez sekund, prazdna ukaze sekundy
lcd.print(" ");
lcd.setCursor(16, 1);
// lcd.print(rtc.getDOWStr(1));
lcd.setCursor(0, 1);
lcd.print("Den: ");
lcd.print(rtc.getDateStr());
lcd.setCursor(0, 2);
lcd.print("T.Okoli: ");
lcd.print(rtc.getTemp()); //Hodiny realného času ds3231 mají v sobě teploměr - teplotni čidlo obnovuje co 64 sekund dá se to zkrátit, ale nebudu zbytečně zvětšovat program
lcd.setCursor(0, 3);
lcd.print("T.Vody: ");
lcd.print(senzoryDS.getTempCByIndex(0));
}
void loop()
{
senzoryDS.requestTemperatures();
pinMode(svetlo1, OUTPUT);
displayTime();
delay(1000);
byte s, m, h, dvt, dvm, mesic, r;
readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);
// Nastavení času hnojení
if (h == 8 && m == 30 && s == 0) {
digitalWrite(rele, LOW);
}
if (h == 8 && m == 30 && s == 7) {
digitalWrite(rele, HIGH);
}
// nastaveni intervalu sviceni
if (h >= 9 && h < 20) den = 1;
else den = 0;
for (byte brightness = 0; den == 1 && sviti == 0 && brightness <= 255; brightness ++) {
displayTime();
analogWrite(svetlo1, brightness);
if (brightness == 255) sviti = 1;
lcd.setCursor(0, 3);
lcd.print("T.Vody: ");
lcd.print(senzoryDS.getTempCByIndex(0));
lcd.setCursor(17, 3);
lcd.print(" ");
lcd.setCursor(17, 3);
lcd.print(brightness);
delay(10000);
// delay(125);
}
for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness --) {
displayTime();
analogWrite(svetlo1, brightness);
if (brightness == 0) sviti = 0;
lcd.setCursor(0, 3);
lcd.print("T.Vody: ");
lcd.print(senzoryDS.getTempCByIndex(0));
lcd.setCursor(17, 3);
lcd.print(" ");
lcd.setCursor(17, 3);
lcd.print(brightness);
delay(10000);
// delay(125);
}
}