Il codice è giusto.
L'importante è che l'intervallo del controllo sia maggiore del tempo di esecuzione di tutto il loop.
quindi in quel caso ho sbagliato.. controllo ogni 10 secondi ma effettuo l'invio dei dai ogni 30 secondi.
Sai cosa faccio... 5 minuti per il controllo del watchdog e 1.30 minuto per l'invio dei dati(non lo faccio arrotondato evitando,così, che si incrocino).
Cosa ne pensi?
Basta che il controllo tu lo faccia dopo almeno 1 invio ![]()
ok perfetto... questa notte effettuo il flash del firmware e vediamo cosa succede! ]![]()
Ti ringrazio da parte di tutta la community per aver condiviso la tua leOS2.. evviva la community evviva l'open source! questo indipendentemente se il mio Arduino si blocchi o meno! 8)
Antroid:
evviva la community evviva l'open source! questo indipendentemente se il mio Arduino si blocchi o meno! 8)
ROTFL ![]()
leo... la board continua a riavviarsi e non riesco ad aggiornare il firmware
Mi da questo errore avrdude: stk500_recv(): programmer is not responding
Come posso fare?
Avrai sbagliato qualcosa nei tempi impostati?
Cmq, applica la manovra di emergenza:
http://forum.arduino.cc/index.php?topic=59668.msg429965#msg429965
nn ci crederai ma ho fatto gli stessi passaggi involontariamente... ho letto solo ora il tuo messaggio! grazie cmq.. ora sta trasmettendo! 8)
eccomi qui a ripostare codice sorgente simile ai precendenti ma con piccole accortezze...
/*
My Lab Project
Programmed By Antonio Blescia
State: Alpha
2013-07-09
*/
/*Library Section*/
#include <SPI.h>
#include <Ethernet.h>
#include <leOS2.h> //include the scheduler
/*Sensor Section*/
#define LIGHT_SENSOR A0
#define TEMP_SENSOR A1
#define PIR_SENSOR 2
/*Network Settings*/
EthernetClient client;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
/*ThingSpeak proprieties*/
String writeAPIKey = "KEY_HERE"; // Write API Key for a ThingSpeak Channel
byte server[] = { 184, 106, 153, 149 }; // IP Address for the ThingSpeak API
const unsigned long postingInterval = 30*1000; // delay between updates, in milliseconds
/*WatchDog Manager Section*/
bool allRight = false;
leOS2 Controller;
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
boolean lastConnected = false; // state of the connection last time through the main loop
String stringLightValue;
String pirValue;
int tempC =0;
String tempcString;
void(* resetFunc)(void)=0;
void setup() {
Serial.begin(9600);
pinMode(PIR_SENSOR,INPUT);
delay(1000);
Ethernet.begin(mac);
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
Controller.begin();
Controller.addTask(reset, Controller.convertMs(60000)); //add a task to be executed after 10 seconds
}
void loop() {
allRight = false;
/*Pir Sensor Reading*/
byte PirState = digitalRead(PIR_SENSOR);
PirState = 1-PirState; /*Invert the vale*/
if(PirState > 0){
pirValue = String(PirState,DEC);
}
/*Temperature Sensor Reading and Parsing*/
tempC = analogRead(TEMP_SENSOR); //lettura valore del sensore
tempC =(int) (5.0 * tempC * 100.0)/1024.0; //conversione del dato analogico
tempcString = String(tempC,DEC);
if (client.available()) {
char c = client.read();
Serial.print(c);
}
// if there's no net connection, but there was one last time
// through the loop, then stop the client:
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
// if you're not connected, and ten seconds have passed since
// your last connection, then connect again and send data:
if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
stringLightValue = String(analogRead(A0),DEC);
updateThingSpeak("field1="+stringLightValue+"&field2="+pirValue+"&field3="+tempcString);
pirValue = "0";
}
// store the state of the connection for next time through
// the loop:
lastConnected = client.connected();
allRight= true;
}
// this method makes a HTTP connection to the server:
void updateThingSpeak(String tsData) {
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println("Connected to ThingSpeak...");
Serial.println();
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
// note the time that the connection was made:
lastConnectionTime = millis();
}
else {
// if you couldn't make a connection:
Serial.println("connection failed");
Serial.println("disconnecting.");
client.stop();
}
}
void reset() {
if(!allRight)
{
Serial.println("Resetting....");
resetFunc();
}
}
Ho provato ad usare la funzione reset() della classe leOS2 ma il micro si resetta in maniera infinita... ho utilizzato la soluzione suggerita da Massimo Banzi e consigliata da Atmel e adesso sembra andare tutto bene... vediamo domani se ci saranno altri blocchi.. ![]()
La funzione che stai usando tu non è un reset, è solo un salto all'indirizzo $0000 della memoria: in pratica riavvii dall'inizio il firmware. Il reset con watchdog è un vero e proprio reset, ha gli effetti che avresti se premessi il pulsantino di reset.
Ora vediamo un pò, forse il bootloader della 2009 non disabilita subito il watchdog per cui entri in un loop infinito. Faccio una modifica al leOS e ti richiamo.. ![]()
In allegato trovi il file leOS2.cpp da sostituire a quello che hai tu. Imposta il timer del watchdog a 2 secondi invece che a 30 ms com'è ora per cui dovresti avere tutto il tempo per uscire dal bootloader e arrivare al begin() dello scheduler che poi disattiva il wdt prima della reinizializzazione.
leOS2.cpp (10.5 KB)
PS.
mi fai sapere se risolvi? se risolvi, aggiorno la lib per tutti.
grazie per il supporto leo! ![]()
Ad ogni modo sto notando che il sensore di temperatura ha degli scostamenti di 1-2 gradi Celsius.
Ho deciso di effettuare un campionamento in modo tale da poter crearne una media 8)
float readTemp()
{
float temp = 0.0; // valore convertito in temperatura (°C)
int val = 0; // valore quantizzato dall'ADC [0..1023]
int nread = 5; // numero di letture (da 5 a 8)
float somma = 0.0; // somma delle letture
for (int i=0; i<nread; i++)
{
val = analogRead( LM35_pin ); // legge il dato della tensione sul pin 'LM35_pin'
temp = ( 100.0 * vref * val ) / 1024.0; // lo converte in °C
somma += temp; // aggiunge alla somma delle temperature lette
}
return ( somma / nread ); // ne calcola il valore medio
}
Intanto resto in attesa di tue leo!
Buona giornata! 8)
Sono io che aspetto tue notizie... lo hai scaricato il file che ti ho messo 2 post fa?? ![]()
leo72:
In allegato trovi il file leOS2.cpp da sostituire a quello che hai tu. Imposta il timer del watchdog a 2 secondi invece che a 30 ms com'è ora per cui dovresti avere tutto il tempo per uscire dal bootloader e arrivare al begin() dello scheduler che poi disattiva il wdt prima della reinizializzazione.
Ho appena letto la tua risposta.. sei troppo immediato. non l'avevo notata ![]()
Quindi hai semplicemente aumentato il tempo del watchdog timer?
Buongiorno leo,
questa mattina ho fatto la sostituzione del file come mi hai detto e ho riflashato il firmware..
ha trasmesso un solo dato ma adesso riprende a riavviarsi in continuazione...
Se provo ad uploadare il firmware mi restituisce un'altra volta questo errore
stk500_recv(): programmer is not responding
Ciao pablos, grazie per la risposta.
Provvedo subito nel risponderti:
Metti un server.begin(); ogni 2-3-5 minuti nel loop con un millis(), questo comporta un delay di 300 ms, se ti da fastidio vai nella lib w5100.cpp e cambia il delay (io l'ho tolto proprio)
Quel begin svuota i buffer e azzera i socket del wiznet, avendo tu una connessione webserver open-close non comporta nessun difetto, il problema lo avresti se la connessione restasse sempre connected()
per server.begin() intendi il mio " Ethernet.begin(mac);" ? se si posso utilizzare la libreria timer per eseguirlo e non ci sarebbero problemi(spero...)
la tua ethernet ha uno slot sd?
certo.. è lo shield ufficiale di arduino.. ma all'interno non ho alcuna scheda sd...
non usare i pin 4-10-11-12-13, ma questo lo saprai già
certo.. ti ringrazio per avermelo ricordato ![]()
Ho dato un occhiata veloce, non posso dire con sicurezza perchè non mi sono messo a leggere tutti i passaggi da un void all'altro, ma sei sicurissimo che alla fine dei salti hai un client.stop sempre?
Vedendo il Serial Monitor vengono chiuse le connessioni ogni volta che ne apro una... quindi non credo che lasci connessioni aperte... ![]()
Grazie ancora..
W5100.init();
va bene se uso la libreria timer per non incasinare il codice con i millis()?
una domanda stupida per voi ma per me importante... il watchdog che ho configurato attraverso le leOS2 di leo non dovrebbe dare problemi con queste modifiche, vero? ![]()
Il mio scheduler funziona usando il watchdog per cui non interferisce con nient'altro che non sia un altro scheduler basato su altri meccanismi trasparenti all'utente, ossia basati sull'uso di timer, oppure su funzioni di interrupt.
La Timer dovrebbe usare i millis per schedulare dei compiti. Puoi abbinarla al leOS2. Ma con la Timer che di dovresti fare?
Perché il leOS2 è già uno scheduler e se nondevi far eseguire compiti gravosi, puoi usarlo per programmare l'esecuzione di eventi in background.