SCARICARE POSTA SU ARDUINO TRAMITE POP3

mi chiedevo come si potrebbe fare una volta connessi al pop3 a scaricare la posta su arduino!!

Devi usare il protocollo POP3.
Puoi iniziare da questo post:
http://www.kewl.lu/articles/pop3

allora in realtà da stamattina sono arrivato a questo codice...mi scarica la mail...ma nn mi accende il led..perchè ??? cosa sbaglio??? :-/

#include <Ethernet.h>
int ledPIN=9;

int statusPIN=0;
byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip = { 10, 0, 0, 5};
byte server={85,33,2,56};

Client client(server,110);

void setup()
{
pinMode(ledPIN,OUTPUT);
delay(1000);
Ethernet.begin(mac,ip);
Serial.begin(9600);
delay(1000);
Serial.println(“connecting…”);

if(client.connect()){

Serial.println(“connected”);
client.println(“USER username@alice.it”);
client.println(“PASS psw”);
client.println(“STAT”);
client.println("LIST 1 ");
client.println(“RETR 1”);
client.println(“QUIT”);
client.println();

}

}

void loop()
{
if (client.available()){
char c=client.read();
Serial.print(c);
statusPIN!=statusPIN;
digitalWrite(ledPIN,statusPIN);

}

}

trovato l'errore...il led mi si accende:

statusPIN=!statusPIN

ho un piccolo problema e cioè che se arriva una mail al mio indirizzo di posta questo non mi va direttamente sull'arduino...il download della mail con testo incluso avviene solo quando avvio il serial monitor...

vorrei fare un ciclo per temporizzare il tutto!...tipo ogni tot tempo l'arduino invia queicomandi al server... :-/

è facile! Ricordati che la parte inclusa in void setup {} viene ripetuta una sola volta... cioè quando si riavvia arduino e tu aprendo il serial monitor fai proiprio questo, cioè riavvi arduino.

quindi sposta il codice che scarica la posta in void loop {} e temporizza dapprima con un delay e poi ottimizza la cosa usando la funzione millis()
Ecco il reference:

si ok ma il problema ora è che il led mi si accende perennenmente anche quando non ci sono mail!! :-/

#include <Ethernet.h>
int ledPIN=9;
int statusPIN=0;
int startTime=0;

byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip = { 10, 0, 0, 5};
byte server={85,33,2,56};

Client client(server,110);

void setup()
{
pinMode(ledPIN,OUTPUT);
delay(1000);
Ethernet.begin(mac,ip);
Serial.begin(9600);

Serial.println(“connecting…”);

}

void loop()
{

if(client.connect()){

Serial.println(“connected”);
delay(60000);

client.println(“USER username@alice.it”);
client.println(“PASS psw”);
client.println(“STAT”);
client.println(“LIST 1”);
client.println(“RETR 1”);
client.println(“DELE 1”);
client.println(“QUIT”);
client.println();
}

if (client.available()){
char c=client.read();
Serial.print(c);
statusPIN=!statusPIN;
digitalWrite(ledPIN,statusPIN);
}
}

all’inizio del loop abbassa il pin
statusPIN=LOW;

e poi invece di

f (client.available()){
  char c=client.read();
  Serial.print(c);
  statusPIN=!statusPIN;
  digitalWrite(ledPIN,statusPIN);
}

fai

f (client.available()){
  char c=client.read();
  Serial.print(c);
  statusPIN=HIGH;      <---------
  digitalWrite(ledPIN,statusPIN);
}

si ma il mio problema è che il led mi si accende sempre..nel senso che se io dico all'arduino di scaricare solo la prma mail e poi cancellarla... nel momento in cui va a rifare il controllo per verificare che nn ci siano nuove mail il led mi viene acceso comunque...in definitiva il led mi si accende non solo se ho una mail ma per qualsiasi risposta del server...tipo se ho zero mail il server mi risponde e mi si accende il led...io invece voglio che mi si accenda solo quando ci sono delle mail.

infatti il tou codice non ha molto senso.
se non ti studi il protocollo pop3 non puoi pretendere di scrivere il codice e che questo funzioni a primo colpo.
fai un po di prove con il telnet del tuo pc e poi scrivi il codice

il protocollo pop3 l'ho studiato e i comandi sono quelli che vedi....di prove con il telnet ne ho fatte già troppe...

Pinturicchio, ma l'output della stringa del seguente codice quale è?

client.println("LIST 1");
client.println("RETR 1");

Probabilmente devi dire qualcosa del tipo:

Fai il list delle mail.
Se ne trovi accendi il LED altrimenti no

Se ci dici l'output di quei comandi forse arrivamo a risolvere il problema.

è quello che sto cercando di fare ma non so come fare l’if

avevo pensato di fare

if(client.read(“LIST1”)=1)
{
statusPIN=HIGH;
digitalWrite(ledPIN,statusPIN);
}
è L’istruzione per fargli leggere la risposta del server che mi manca…so che quell’if che ho scritto è errato ma non so come dire all’arduino di leggere larisposta al comando LIST1 del server…

Ma

client.println("LIST 1");
client.println("RETR 1");

non ti restituisce qualcosa a video sul terminale?
In tal caso puoi postare questo "qualcosa"?
A occhio println dovrebbe essere un "stampa a video la risposta"

Non facciamo confusione

client.println() serve per inviare delle stringe al server a cui si è connessi.

client.read() legge i byte che il server invia al client

quindi una volta che hai inviato i comandi al server attraverso println() (il tuo codice dovrebbe essere giusto) metti tutto quello che il server ti risponde in una variabile attraverso la funzione read.
quindi l'istruzione

if(client.read("LIST1")=1)

non ha alcun senso per alcuni motivi: primo l'istruzione client.read() non ha parametri e tu gliel'hai dato e secondo non è una istruzione booleana (quindi non ha senso metterla in un if) ma restituisce dei byte.

questa è la risposta del server se non ci sono mail!!

connecting...
connected
+OK Microsoft Exchange Server 2003 POP3 Server Version 6.5.7638.1 ready
+OK
+OK User successfully logged on
-ERR protocol error.
-ERR protocol error.
-ERR The specified message is out of range.
-ERR The specified message is out of range.
+OK Microsoft Exchange Server 2003 POP3 Server Version 6.5.7638.1 singning off

so che nn ha senso era per rendere in qualke modo l'idea d quell che vglio fare...inoltre per 1 non intendo boolean ma numero di mail...perchè il max di mail che può avere per me è uno...la rileva poi la cancella cosikkè il numero di mail torna a zero...gli arriva un'altra mail e cosi via...

si ma non centra quello che intendi te... quello che hai scritto non ha senso!!!!!!!
Ma ancora non ci hai fatto capire cosa vuoi fare! VUoi che arduino accenda un led quando arriva una nuova mail? Qualsiasi mail essa sia, chiunque l'abbia mandata? Basta che ci sia una mail?
Se è così ti basterebbe fare:

client.println("USER username@alice.it");
client.println("PASS psw");
client.println("STAT");

se ci sono delle mail non lette il server ti risponde:

C:    STAT
S:    +OK #msgs #bytes

dove #msgs è il numero di messaggi e #bytes è il numero di byte

a quel punto metti questa risposta in una stringa con il comando client.read()
prendi questa stringa e leggi il valore dopo OK se questo è 1 accendi il led e cancelli il messaggio.

chiaro?

ok provo a fare cosi...il tutto è finalizzato a definire un sistema d allarme...al posto del led ci va una telecamera che io voglio accendere ogni qualvolta mi suona l'allarme in casa...ora io mi connetto da cellulare mando una mail al mio contatto di posta il quale scaricando la posta sull'arduino permette a quest'ultimo d attivarmi la telecamera e farmi vedere l'interno dell'appartamento...devo pensare inoltre allo stream video da inviare...