allora dopo aver (+ o -) risolto i problemi sull'UDP...e per risolto intendo preso per buono che la libreria UDP dell'arduino voglia un ack dal ricevitore del pacchetto, pensavo di aver risolto i miei problemi con il watchdog...
quindi, tornato in campagna, montato tutto...dopo nemmeno 3 giorni l'arduino si è piantato...e il watchdog non lo ha resettato..
vi posto il codice
#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <Udp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
#include <avr/io.h>
#include <avr/wdt.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,202 };
unsigned int localPort = 8888; // local port to listen on
byte remoteIp[] = { 192,168,0,201 };
byte remoteIp2[] = {192,168,0,203 };
unsigned int remotePort = 8888; // holds received packet's originating port
unsigned int remotePort2 = 8889;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
int risposta;
int arrivo;
char invio[3];
char invio2[3];
int persi = 0;
int stato4 = 0;
int stato5 = 0;
int stato6 = 0;
int stato7 = 0;
int stati = 0;
void setup() {
wdt_enable(WDTO_8S);
pinMode(2, OUTPUT); //POMPA
pinMode(3, OUTPUT); //Acquedotto
pinMode(8, OUTPUT); //Assenza rete
pinMode(9, OUTPUT); //Reset Arduino
digitalWrite(9,LOW);
pinMode(4,INPUT); //Pompa ON
pinMode(5,INPUT); //Acquedotto ON
pinMode(6,INPUT); //Avaria Pompa
pinMode(7,INPUT); //Energia Elettrica
Ethernet.begin(mac,ip);
Udp.begin(localPort);
Serial.begin(9600);
}
void loop() {
wdt_reset();
stati = 0;
stato4 = digitalRead(4);
stato5 = digitalRead(5);
stato6 = digitalRead(6);
stato7 = digitalRead(7);
if (stato4 == HIGH) { (stati=stati+1); }
if (stato5 == HIGH) { (stati=stati+2); }
if (stato6 == HIGH) { (stati=stati+4); }
if (stato7 == LOW) { (stati=stati+8);
digitalWrite(8, HIGH); }
if (stato7 == HIGH) {digitalWrite(8, LOW);}
itoa(stati,invio,10);
Udp.sendPacket( invio, remoteIp, remotePort);
Udp.sendPacket( invio, remoteIp2, remotePort2);
Serial.print("Ho inviato");
Serial.println(invio);
char packetBuffer[]="0";
int packetSize = Udp.available();
if(packetSize)
{
persi =0;
Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
arrivo=atoi(packetBuffer);
Serial.print("Ho Ricevuto:");
Serial.println(arrivo);
switch (arrivo) {
case 1:
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
break;
case 2:
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
break;
case 3:
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
break;
default:
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
if (arrivo <0 || arrivo>3){
digitalWrite(9,HIGH);
}
}
else { persi= persi+1;}
if (persi >20){
digitalWrite(2, LOW);
digitalWrite(3, LOW);
Serial.println("Nessun Collegamento");}
if (persi == 100){
digitalWrite(9,HIGH);
}
Serial.print("pacchetti Persi: ");
Serial.println(persi);
Serial.println();
delay(200);
}
il pin 9 serve a resettare l'arduino nel caso di errori, o tramite un comando da remoto, non fa altro che attrarre un relè che chiude il pin reset a massa....ma ovviamente se l'arduino si pianta non funziona, per questo avevo inserito il watchdog...ma non fa...
cosa ho sbagliato? ho controllato sul sito dell'Atmel il atmega328 supporta anche il watchdog 8secondi
io penso di aver sbagliato qualcosa nella sintassi...boh...