RTC si blocca durante esecuzione ciclo FOR

Ciao a tutti
sto cercando di realizzare il piu' classico dei progetti, un controllo elettronico luci.
Utilizzo un RTC DS1302, il punto e' che all'arrivo di un certo orario devo controllare un PWM (rampa luce accesa e successivamente discesa) e per farlo uso un ciclo FOR, ma (e lo temevo) si inchioda l'orologio e non mi visualizza piu' l'ora durante il ciclo. Me lo aspetto visto che non e' multitasking...come posso aggirare la cosa?
Vorrei si continuasse a vedere l'orologio funzionare...

// DS1302:  CE pin    -> Arduino Digital 27
//          I/O pin   -> Arduino Digital 29
//          SCLK pin  -> Arduino Digital 31
//          VCC pin   -> Arduino Digital 33
//          GND pin   -> Arduino Digital 35
//
// LCD:     DB7       -> Arduino Digital 7
//          DB6       -> Arduino Digital 6
//          DB5       -> Arduino Digital 5
//          DB4       -> Arduino Digital 4
//          E         -> Arduino Digital 9
//          RS        -> Arduino Digital 8

#include <LiquidCrystal.h>
#include <DS1302RTC.h>
#include <Time.h>

// Init the DS1302
// Set pins:  CE, IO,CLK
DS1302RTC RTC(27, 29, 31);

// Optional connection for RTC module
#define DS1302_GND_PIN 33
#define DS1302_VCC_PIN 35

// Init the LCD
//   initialize the library with the numbers of the interface pins
//            lcd(RS,  E, d4, d5, d6, d7)
LiquidCrystal lcd(8,   9,  4,  5,  6,  7);
int momentogiorno = 0;
int fading = 0;
const int pinrele = 3;
const int pinLED = 11;

void setup()
{
  // Setup LCD to 16x2 characters
  lcd.begin(16, 2);

  // Activate RTC module
  digitalWrite(DS1302_GND_PIN, LOW);
  pinMode(DS1302_GND_PIN, OUTPUT);

  digitalWrite(DS1302_VCC_PIN, HIGH);
  pinMode(DS1302_VCC_PIN, OUTPUT);

  lcd.print("RTC activated");

  delay(500);

  // Check clock oscillation  
  lcd.clear();
  if (RTC.haltRTC())
    lcd.print("Clock stopped!");
  else
    lcd.print("Clock working.");

  // Check write-protection
  lcd.setCursor(0,1);
  if (RTC.writeEN())
    lcd.print("Write allowed.");
  else
    lcd.print("Write protected.");

  delay ( 2000 );

  // Setup Time library  
  lcd.clear();
  lcd.print("RTC Sync");
  setSyncProvider(RTC.get); // the function to get the time from the RTC
  if(timeStatus() == timeSet)
    lcd.print(" Ok!");
  else
    lcd.print(" FAIL!");

  delay ( 2000 );

  lcd.clear();
  
  lcd.begin(16, 2);

  lcd.setCursor(0,0);
  lcd.print("  AcquaControl ");
  lcd.setCursor(0,1);
  lcd.print("    Ivanooe ");

  delay( 3000 );
   lcd.clear();
}

void loop()
{

  // Display time centered on the upper line
  lcd.setCursor(3, 0);
  print2digits(hour());
  lcd.print("  ");
  print2digits(minute());
  lcd.print("  ");
  print2digits(second());

  // Display abbreviated Day-of-Week in the lower left corner
  lcd.setCursor(0, 1);
  lcd.print(dayShortStr(weekday()));

  // Display date in the lower right corner
  lcd.setCursor(5, 1);
  lcd.print(" ");
  print2digits(day());
  lcd.print("/");
  print2digits(month());
  lcd.print("/");
  lcd.print(year());
  
  // Warning!
  if(timeStatus() != timeSet) {
    lcd.setCursor(0, 1);
    lcd.print(F("RTC ERROR: SYNC!"));
  }

  delay ( 1000 ); // Wait approx 1 sec
}

void print2digits(int number) {
  // Output leading zero
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
  
  if ((hour()) == 20 && minute() ==00) {
    momentogiorno = 0
      ;
  } //tutto spento
  if ((hour()) == 13 && minute() == 00) {
    momentogiorno = 1
      ;
  } // tutto acceso
  if ((hour()) == 14 && minute() == 30) {
    momentogiorno = 2
      ;
  } // spengo neon 

  if ((hour()) == 12 && minute() == 00) {
    momentogiorno = 3
      ;
  } //rampa su
  if ((hour()) == 19 && minute() == 40) {
    momentogiorno = 4
      ;
  } // rampa giu'

  switch (momentogiorno) {

  case 0 : 
    digitalWrite (pinrele, LOW); // tutto spento
    analogWrite (pinLED, 0);

    break ;

  case 1 : 
    digitalWrite (pinrele, HIGH); //tutto acceso
    analogWrite (pinLED, 255);
    ;
  case 2 : 
    digitalWrite (pinrele, LOW); //tutto acceso spengo neon
    analogWrite (pinLED, 255);
    ;



  case 3 : 
    digitalWrite (pinrele, LOW); //rampa su
    for (fading = 0 ; fading < 255; fading++) {
      lcd.setCursor(6, 0);

      analogWrite (pinLED, fading);      //impostiamo la luminosità del LED
      delay(4000);
    }

    break;

  case 4 : 
    digitalWrite (pinrele, LOW); //rampa giu'
    for (fading = 255 ; fading > 0; fading--) {
      lcd.setCursor(6, 0);
     
      analogWrite (pinLED, fading);      //impostiamo la luminosità del LED
      delay(4000);
    }
}


}

Grazie a tutti! :slight_smile:

Devi semplicemente studiarti come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI ...

... dopo di che eviti di usare il delay() (che è bloccante) e programmi le cose con la millis() :slight_smile:

Guglielmo

gpb01:
Devi semplicemente studiarti come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI ...

... dopo di che eviti di usare il delay() (che è bloccante) e programmi le cose con la millis() :slight_smile:

Guglielmo

Grazie Guglielmo! Scusami dimenticavo che avevo valutato il discorso di usare il millis (). Pero' avevo un dubbio sull'overflow (visto che sta sempre acceso il circuito), nel primo articolo vedo che ne parla! Adesso cerco di capirci qualcosa... :slight_smile:

Se cerchi nel forum, di topic simile al tuo c'è ne sono tanti anche di recenti, qui ad esempio c'è ne uno:
http://forum.arduino.cc/index.php?topic=315523.msg2188871#msg2188871

Ciao.