Skocz do zawartości

Problem z zawieszeniem zapetlonego programu co 3 tygodnie o 3:22


piotrasta

Pomocna odpowiedź

Witajcie

Mam problem z najprostszym programem działającym w pętli 24/7.

Arduino uno + tego typu data loger https://botland.com.pl/arduino-shield-komunikacja/8238-datalogger-shield-v10-rtc-ds1307-z-czytnikiem-kart-sd-dla-arduino-iduino-st1046-5903351241205.html?gclid=CjwKCAjwgISIBhBfEiwALE19SbUrwBCl3bgwmYEAFQv1hrAHj4eD_-c81NSB240e0KJ6HBW_Tnq29BoCMbgQAvD_BwE&sskey=aee85889e7d842febd73e58a33c7e020 oraz PCF8574 sterujący przekaźnikami.

Co 3 tygodnie w środę dokładnie o 3:22:00 program zawiesza się.

Baterię w datalogerze wymieniłem 3 tygodnie temu a dziś powtórka.

Czy ktoś zna przyczynę takiego problemu?

#include "Wire.h"
#include "DS1307.h"//https://github.com/jarzebski/Arduino-DS1307
#include "LiquidCrystal.h"
#include "PCF8574.h"  // https://github.com/xreef/PCF8574_library
#include "Arduino.h"

DS1307 clock;
RTCDateTime dt;
PCF8574 PCF (0x39);


LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Definicja pinów do których podłaczamy wyprowadzenia ekranu
// For arduino uno only pin 1 and 2 are interrupted

void setup() {
 Serial.begin(9600);
  lcd.begin(16, 2);
   // Set pinMode to OUTPUT
  for(int i=0;i<8;i++) {
    PCF.pinMode(i, OUTPUT);
    PCF.digitalWrite(i, LOW);

  }
  PCF.begin();



  clock.begin();


  // Jeśli nie ustawiono daty, ustawiamy
  if (!clock.isReady())
  {
    // Data i czas z momentu kompilacji
    clock.setDateTime(__DATE__, __TIME__);
  }

    

  }


void loop() {

  dt = clock.getDateTime();
  //Jeśli odczyt prawidłowy następuje wyświetlenie danych
    lcd.setCursor(0, 0);
    lcd.print(dt.hour); //Wyswietlenie godzin
    lcd.print(":");
    lcd.print(dt.minute);//Minut
    lcd.print(":");
    print2digits(dt.second);//Sekund
    lcd.setCursor(0,9);

    //Wyświetlenie daty
    lcd.print(dt.day);
    lcd.print('/');
    lcd.print(dt.month);
    lcd.print('/');
    lcd.print(dt.year-2000);
    lcd.print(dt.dayOfWeek);
    int h=dt.day;
    int d=dt.dayOfWeek;
if (d==1 || d==3 || d==5)
{
  Aktywna();
}
}

void print2digits(int number) {
  if (number < 10) {
    lcd.print("0"); // print a 0 before if the number is < than 10
  }
  lcd.print(number);
}

void Aktywna()

{

  if (dt.hour == 3 && dt.minute == 1)
  {
  PCF.digitalWrite(0, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 1");
  }
  else if (dt.hour == 3 && dt.minute == 4) 
  {
  PCF.digitalWrite (0, HIGH);
  PCF.digitalWrite(1, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 2");
  }
    else if (dt.hour == 3 && dt.minute == 7) 
  {
  PCF.digitalWrite (1, HIGH);
  PCF.digitalWrite(2, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 3");
  }
    else if (dt.hour == 3 && dt.minute == 10) 
  {
  PCF.digitalWrite (2, HIGH);
  PCF.digitalWrite(3, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 4");
  }
    else if (dt.hour == 3 && dt.minute == 13) 
  {
  PCF.digitalWrite (3, HIGH);
  PCF.digitalWrite(4, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 5");
  }
    else if (dt.hour == 3 && dt.minute == 16) 
  {
  PCF.digitalWrite (4, HIGH);
  PCF.digitalWrite(0, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 1");
  }
  else if (dt.hour == 3 && dt.minute == 19) 
  {
  PCF.digitalWrite (0, HIGH);
  PCF.digitalWrite(1, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 2");
  }
    else if (dt.hour == 3 && dt.minute == 22) 
  {
  PCF.digitalWrite (1, HIGH);
  PCF.digitalWrite(2, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 3");
  }
    else if (dt.hour == 3 && dt.minute == 25) 
  {
  PCF.digitalWrite (2, HIGH);
  PCF.digitalWrite(3, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 4");
  }
    else if (dt.hour == 3 && dt.minute == 28) 
  {
  PCF.digitalWrite (3, HIGH);
  PCF.digitalWrite(4, LOW);
  lcd.setCursor(0,2);
  lcd.print("Aktywna Sekcja 5");
  }
    else if (dt.hour == 3 && dt.minute == 31) 
  {
  PCF.digitalWrite (4, HIGH);
  PCF.digitalWrite(5, LOW);
  lcd.setCursor(0,2);
  
  lcd.print("Aktywna Sekcja 6");
  }
    else if (dt.hour == 3 && dt.minute == 55) 
  {
  PCF.digitalWrite (5, HIGH);
  }
}

 

Link do komentarza
Share on other sites

Po pierwsze przyjrzyj się temu co masz w loop()
cały czas (kilkaset czy kilka tysięcy razy na sekundę) coś drukujesz na ekranie, cały czas tworzysz zmienne (int h) i (int d)
po co ? Loop powinien być w miarę czysty, wystarczy, że raz na sekundę wyswietlisz aktualną sekundę, raz na minutę wyswietlisz aktualna minutę, itp itd.

zmodyfikuj na ten sposób loop, przynajmniej raz na sekundę coś wyświetlisz i sprawdzisz, Arduino Ci odetchnie z ulgą
 

unsigned long aktualnyCzas0 = 0;       // dla millis ZEGAR 1 sekunda
unsigned long zapamietanyCzas0 = 0;    // dla millis
unsigned long roznicaCzasu0 = 0;       // dla millis

int h = 0;
int d = 0;

void loop()
{
	aktualnyCzas = millis();                                     // millis() 
	roznicaCzasu0 = aktualnyCzas0 - zapamietanyCzas0;            // dla LCD co 1 sekundę
	
	if (roznicaCzasu0 >= 1000UL)        						// wykonuj co 1 sekunde
	{  
		dt = clock.getDateTime();
 
		lcd.setCursor(0, 0);
		lcd.print(dt.hour); //Wyswietlenie godzin
		lcd.print(":");
		lcd.print(dt.minute);//Minut
		lcd.print(":");
		print2digits(dt.second);//Sekund
		lcd.setCursor(0,9);

		//Wyświetlenie daty
		lcd.print(dt.day);
		lcd.print('/');
		lcd.print(dt.month);
		lcd.print('/');
		lcd.print(dt.year-2000);
		lcd.print(dt.dayOfWeek);
		h=dt.day;
		d=dt.dayOfWeek;
		if (d==1 || d==3 || d==5) Aktywna();

		zapamietanyCzas0 = aktualnyCzas0;                            
	}
}

 

Edytowano przez PowerTGS440
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.