Si ma con tempi lunghi tra l'accensione e lo spegnimento, a volte passano anche 20/30 secondi da quando io do ON e si accende il LED e tra l'OFF e lo spegnimento del LED soprattutto l'ultimo caso.
Metti qui il codice
EDIT
Ah... dimmi anche come alimenti il tutto
Per ora solo con l'USB del PC.
#include <genieArduino.h>
Genie genie;
#define LED 8
boolean PULSANTE ;
void setup()
{
Serial.begin(9600);
genie.Begin(Serial);
pinMode (LED, OUTPUT);
digitalWrite(LED, LOW);
}
void loop()
{
genie.DoEvents();
genie.AttachEventHandler(myGenieEventHandler);
if (PULSANTE == 1)
{
digitalWrite(LED, HIGH);
genie.WriteObject (GENIE_OBJ_USER_LED, 0, 1);
}
else {
digitalWrite(LED, LOW);
genie.WriteObject (GENIE_OBJ_USER_LED, 0, 0);
}
}
void myGenieEventHandler(void)
{
genieFrame Event;
Event.reportObject.object;
genie.DequeueEvent(&Event);
Event.reportObject.cmd;
Event.reportObject.index;
PULSANTE = genie.ReadObject (GENIE_OBJ_WINBUTTON, 0);
}
Hai provato un delay nel loop ? Forse l'eventhandler non è adatto a ricevette infinite chiamate velocisdime. Prova un banale delay(1000); se funziona poi lo sostituisci con un millis
il do events più frequentemente lo chiami e meglio è.
l'attacheventhandler devi metterlo nel setup dove inoltre ci vuole qualche delay per dare modo al display di caricare il programma.
void setup()
{
delay (1000);
Serial.begin(9600);
genie.Begin(Serial);
genie.AttachEventHandler(myGenieEventHandler);
delay (4600);
}
C'è anche un 1000 messo prima che è bene usare quando si fa la serial begin, in generale.
Ovviamente anche il programma che hai caricato sul display deve sapere che comunichi a 9600, verifica nelle proprietà del progetto, quando lo crei troverai 9600.
Ci sarebbe da sistemare l'alimentazione, comunque poi vedremo.
Altra cosa da sistemare, è la filosofia con cui lo programmi.
Ad ogni loop stai verificando la variabile pulsante che può essere 1 oppure 0, in ogni caso tu gli fai accendere o spegnere il LED grafico sul display ed il LED fisico collegato.
Inoltre quando chiami il do events gli fai andare a leggere lo stato del winbutton...
cambia filosofia
La pressione del winbutton è un evento.
Quando si verifica l'evento, fai qualcosa che consiste nell'accendere o spegnere i LED.
Guarda se il winbutton ha temporary true o meno (nel visigenie)... per iniziare, lascialo come è quando lo metti quindi col temporary true.
Inoltre nelle proprietà del button troverai la gestione delle azioni degli eventi.
Metti on change report message.
Così quando toccherai il button, verrà mandato un messaggio.
Adesso nel loop lascia solo genie.DoEvents() e modifica così l'event handler
void myGenieEventHandler(void)
{
genieFrame Event;
genie.DequeueEvent(&Event);
if (Event.reportObject.cmd == GENIE_REPORT_EVENT)
{
if (Event.reportObject.object == GENIE_OBJ_WINBUTTON)
{
if (Event.reportObject.index == 0)
{
pulsante = !pulsante;
refreshled();
}
}
}
}
all'inizio quando fai boolean pulsante dagli uno stato iniziale boolean pulsate = false;
a questo punto manca l'ultima funzione, la refreshled()
void refreshled()
{
digltalWrite (LED, pulsante);
genie.WriteObject (GENIE_OBJ_USER_LED, 0, pulsante);
}
dovresti ottenere l'accensione e lo spegnimento dei LED quando tocchi il pulsante sullo schermo.
nel setup alla fine metti una chiamata a refreshled() così avrai una indicazione iniziale anche se decidi di partire con true
Vedi così...
Dovrebbe funzionare, ma la sto scrivendo a memoria ....
Funziona perfettamente.....!!!
ho capito la filosofia.
Ma ho tanto da studiare anche se per hobby.
Bene.
Una vota che hai capito come si fa, puoi aggiungere quanti elementi vuoi.
Andrà sempre bene, grazie al processore del display che lascia praticamente libero il nostro atmega328.
Peccato che siano un po' costosi, questi display.
Si è vero, però per alcuni progetti ne vale la pena.
Davvero grazie ancora per l'aiuto e per le spiegazioni....