buon pomeriggio ragazzi,
sto provando a far consumare di meno al mio arduino uno, per lo meno a provare a fargli consumare di meno.
guardo i vari metodi, trovo le sleep mode e mi interessa subito la sleep_pwr_mod quella orientato al massimo risparmio, quindi mi dirigo subito verso i watchdog.
studio un po’ di programmi e trovo in quello di leo72 un ottimo punto di partenza.
fin qui tutto ok.
io voglio far registrare ogni tot minuti/secondi dati su un file nella mia SD e se arduino (uno) non sta registrando lo metto in sleep mode.
però ho anche la possibilità di vedere questi dati via web.
ho pensato di mettere in ascolto arduino su ethernet e dirgli che quando riceve un interrupt da ethernet si deve svegliare e fare le cose che gli dico io (idea molto bella ma…)
ho provato i vari attachinterrupt ma niente non ci sono riuscito…
allora ho provato ad inserire altre modifiche nel codice di leo ricordandomi che arduino si sveglia ogni secondo per aggiornare il flag.
allora per prima cosa posto il codice funzionante (senza ultime modifica riguardanti ethernet)
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <SD.h>
#include <SPI.h>
const byte LED7 = 7;
const byte LED6 = 6;
byte ledStatus = 1;
volatile unsigned int counter = 0;
volatile byte flag = 0;
File mio;
int i = 1;
void setup() {
if (!SD.begin(4))
{
return;
}
MCUSR = 0; //resetta il registro di stato della MCU
wdt_disable(); //disattiva il watchdog
pinMode(LED7, OUTPUT); //pin 13 in OUTPUT
pinMode(LED6, OUTPUT);
digitalWrite(LED7, 0); //spento
digitalWrite(LED6, ledStatus); //stato iniziale acceso
setWdt(); //imposta il watchdog
//imposta lo sleep
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //modalità di sleep - POWER DOWN
}
void loop() {
power_adc_disable();
power_timer0_disable();
power_timer1_disable();
power_timer2_disable();
power_twi_disable();
power_usart0_disable();
// power_all_disable();
sleep_mode(); //cpu a nanna - corrisponde a sleep_enable+sleep_cpu+sleep_disable
power_all_enable();
if (flag)
{
wdt_disable();
counter = 0;
flag = 0;
//fai qui quello che devi fare
mio = SD.open("digimon.txt", FILE_WRITE);
mio.println(i);
i++;
mio.close();
ledStatus ^= 1; //cambio lo stato al led
digitalWrite(LED6, ledStatus);
setWdt(); //reimposta il watchdog
}
}
void setWdt() {
SREG &= ~(1<<SREG_I); //disattiva tutti gli interrupt
//imposta il registro del watchdog
WDTCSR |= ((1<<WDCE) | (1<<WDE));
//imposta la modalità "interrupt" ed il timeout ad 1 secondo
WDTCSR = ((1<<WDIE)| (1<<WDP2) | (1<<WDP1));
SREG |= (1<<SREG_I); //riattiviamo gli interrupt globali
}
//funzione per settare quanto tempo dorme
ISR(WDT_vect)
{
if (++counter >= 8)
{ //impostare qui il numero di timeout (secondi)
flag = 1;
}
}
ora metto le modifiche che ho provato ad aggiungere ma con scarsi risultati(però non so quanto mi faranno risparmiare, non ci sono le varie impostazioni per l’ethernet ma nello sketch sono presenti in setup())…
ISR(WDT_vect)
{
EthernetClient client = server.available();
if(client)
{
while(client.connected())
{
accendi();
}
spegni();
}
if (++counter >= 1)
{ //impostare qui il numero di timeout (secondi)
flag = 1;
}
}
la luce del led 7 mi si accende quando io mi connetto ad arduino (uno) tramite browser ma non si spegne più, e ovviamente non ritorno in loop(non glielo dico da nessuna parte)…
chiedo cortesemente a voi se sapete, o indicarmi, qualche metodo per andare a far svegliare arduino da sleep mode da ethernet quando io mi voglio connettere a lui tramite html.
(io avevo pensato di usare 2 arduino collegati tramite i2c, ma vorrei vedere se è possibile con solo un arduino)
se non sono stato chiaro ditelo pure che rispiego il mio intento/dubbio.
buona serata.