Silente:
Millis Non credo sia la soluzione da usare, ma per un altro motivo: A quanto ho capito fai attualmente uso di un RTC, ovvero di un sistema per misurare il tempo con una precisione elevata, e mi sembra concettualmente stupido dotarsi di un sistema del genere e continuare a usare millis che ha una precisione Inferiore
Condivido...ma infine non devo realizzare un progetto ultrapreciso, mi basta che mi faccia accendere le elettrovalvole una alla volta ad una certa ora...ed avevo pensato all'RTC perchè ha un orologio con batteria ed una sveglia...
con la funzione millis ho modificato lo sketch come in allegato facendo finta di accendere solo la elettrovalv 1 per due secondi...ma non si accende...viene eseguito solo illampeggio della scritta "ON 1" e basta.
#include <DS3232RTC.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <TimeAlarms.h>
#include "RTClib.h"
#include <Time.h>
#include <TimeLib.h>
// OLED display TWI address
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
RTC_DS3231 rtc;
const int eleval_1 = 2;
const int eleval_2 = 3;
const int eleval_3 = 4;
const int eleval_4 = 5;
const int eleval_5 = 6;
unsigned long time;
unsigned long lampeggio_time = 0;
void setup () {
pinMode(eleval_1, OUTPUT);
digitalWrite(eleval_1, LOW);
pinMode(eleval_2, OUTPUT);
digitalWrite(eleval_2, LOW);
pinMode(eleval_3, OUTPUT);
digitalWrite(eleval_3, LOW);
pinMode(eleval_4, OUTPUT);
digitalWrite(eleval_4, LOW);
pinMode(eleval_5, OUTPUT);
digitalWrite(eleval_5, LOW);
// initialize and clear display
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
#ifndef ESP8266
while (!Serial); // for Leonardo/Micro/Zero
#endif
Serial.begin(9600);
delay(1000); // wait for console opening
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power !");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
//cosi imposti l'allarme
RTC.setAlarm(ALM1_MATCH_HOURS, 0, 39, 23, 0);
}
void loop () {
// cosi verifichi se è l'ora x
if (RTC.alarm(ALARM_1)) {
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(90, 5);
display.println("ON 1");
time=millis();
if(time>lampeggio_time+1000)
{
digitalWrite(eleval_1, HIGH);
}
if(time>lampeggio_time+2000)
{
digitalWrite(eleval_1, LOW);
lampeggio_time=millis();
}
}
DateTime now = rtc.now();
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.println();
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print("T: ");
Serial.print(rtc.getTemperature());
Serial.println(" C");
Serial.println();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print(now.day(), DEC);
display.print('.');
display.print(now.month(), DEC);
display.print('.');
display.print(now.year(), DEC);
display.setCursor(0, 10);
display.print("T: ");
display.print(rtc.getTemperature());
display.print(" C");
display.setCursor(45, 22);
display.print(now.hour(), DEC);
display.print(':');
display.print(now.minute(), DEC);
display.print(':');
display.print(now.second(), DEC);
display.display();
display.clearDisplay();
delay(1000);
}