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!