Relé nesepne tak jak má

Odpovědět
Xif
Příspěvky: 6
Registrován: 16 kvě 2018, 21:35
Reputation: 0

Relé nesepne tak jak má

Příspěvek od Xif » 17 kvě 2018, 01:47

Dobrý den
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);
  }

}







ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Relé nesepne tak jak má

Příspěvek od ohruska » 17 kvě 2018, 06:31

Zdravím.
Myslím si, že chyba je v tomto:

Kód: Vybrat vše

  if (h == 8 && m == 30 && s == 0) {
    digitalWrite(rele, LOW);
  }
  if (h == 8 && m == 30 && s == 7) {
    digitalWrite(rele, HIGH);

  }
Když se netrefíš přesně do 08:30:00, tak relé nesepne.
Asi by se to dalo řešit:

Kód: Vybrat vše

  if (h == 8 && m == 30 && s => 0) {
    digitalWrite(rele, LOW);
  }
  if (h == 8 && m == 30 && s =< 7) {
    digitalWrite(rele, HIGH);

  }

Xif
Příspěvky: 6
Registrován: 16 kvě 2018, 21:35
Reputation: 0

Re: Relé nesepne tak jak má

Příspěvek od Xif » 17 kvě 2018, 07:47

Dik za tvoji pomoc ale bohužel tak to asi nepujde

Kód: Vybrat vše

mosfet_rele_15_5_2018:112: error: expected primary-expression before '>' token

    if (h == 8 && m == 30 && s => 0) {

mosfet_rele_15_5_2018:115: error: expected primary-expression before '<' token

   if (h == 8 && m == 30 && s =< 7) {

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Relé nesepne tak jak má

Příspěvek od ohruska » 17 kvě 2018, 07:59

Promin.
Musí být >= a <=
Nebo jen < a >

Xif
Příspěvky: 6
Registrován: 16 kvě 2018, 21:35
Reputation: 0

Re: Relé nesepne tak jak má

Příspěvek od Xif » 17 kvě 2018, 22:38

Dík za tvojí trpělivost
zkusil sem to takhle

Kód: Vybrat vše

if (h == 22 && m == 31 && s  <= 0) {
    digitalWrite(rele, LOW);
  }
  if (h == 22 && m == 31 && s >= 7) {
    digitalWrite(rele, HIGH);
a cca pří 10 testech, relé seplo tak jak potřebuji
teť to složím,počkám pár dní a uvidím.
takže prozatím velké díky

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Relé nesepne tak jak má

Příspěvek od martinius96 » 17 kvě 2018, 22:42

Ahoj..
Je tu ešte jedna chyba v tom zápise, ktorý si použil.

Kód: Vybrat vše

if (h == 22 && m == 31 && s  <= 0)
Ak je sekunda menšia alebo rovná ako 0? Mínusové sekundy nemáme. Upravil by som to i s tou druhou podmienkou takto...

Kód: Vybrat vše

if (h == 22 && m == 31 && s  <= 6) {
    digitalWrite(rele, LOW);
  }
  if (h == 22 && m == 31 && s >= 7) {
    digitalWrite(rele, HIGH);
    }

Xif
Příspěvky: 6
Registrován: 16 kvě 2018, 21:35
Reputation: 0

Re: Relé nesepne tak jak má

Příspěvek od Xif » 17 kvě 2018, 23:27

a nebude to rele pak spínat jen na jednu vteřinu?
ja potřebuji ať sepne na 7 vteřin

Kód: Vybrat vše

if (h == 22 && m == 31 && s  <= 6) {
    digitalWrite(rele, LOW);
  }
  if (h == 22 && m == 31 && s >= 7) {
    digitalWrite(rele, HIGH);
    }
a co tohle

Kód: Vybrat vše

if (h == 22 && m == 31 && s  <= 1) {
    digitalWrite(rele, LOW);
  }
  if (h == 22 && m == 31 && s >= 8) {
    digitalWrite(rele, HIGH);
    }

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Relé nesepne tak jak má

Příspěvek od martinius96 » 18 kvě 2018, 00:37

Toto zopne relé (ZAPNE KONTAKT) v časovom intervale čase: 22:31:00 --> 22:31:06 (sekundy sú menšie alebo rovné ako 6) (takže beží to 7 sekúnd od 0 po 6 sekúnd, v 7-ej sekunde to rozopne)

Kód: Vybrat vše

if (h == 22 && m == 31 && s  <= 6) {
    digitalWrite(rele, LOW);
  }
  if (h == 22 && m == 31 && s >= 7) {
    digitalWrite(rele, HIGH);
    }
    
Toto zapne relé pri 22:31:00, kedy sú sekundy menšie rovné jednej sekunde, zopnutý stav je do dosiahnutia času 22:31:07 (čas je 8 sekund) pri 22:31:08 a vyššie rozopne.

Kód: Vybrat vše

if (h == 22 && m == 31 && s  <= 1) {
    digitalWrite(rele, LOW);
  }
  if (h == 22 && m == 31 && s >= 8) {
    digitalWrite(rele, HIGH);
    }

Xif
Příspěvky: 6
Registrován: 16 kvě 2018, 21:35
Reputation: 0

Re: Relé nesepne tak jak má

Příspěvek od Xif » 18 kvě 2018, 00:41

aha, děkuji za vysvětlení

Xif
Příspěvky: 6
Registrován: 16 kvě 2018, 21:35
Reputation: 0

Re: Relé nesepne tak jak má

Příspěvek od Xif » 07 čer 2018, 20:49

Relé spíná už 20-cet dní a vše v pořádku
Takže vám oběma velké díky
Xif

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů