roberto8303 Inserito: 5 febbraio 2015 Segnala Inserito: 5 febbraio 2015 (modificato) Ho un problema con un programmino che gestisce una dosatrice con monete, in una porzione del programma quando entro in un void, faccio lampeggiare un led e scrivo sul pannello 16X2 premere start credito Euro 1. Il problema che ho usato millis per far lampeggiare il led con intervallo di mezzo secondo, e per questo mi lampeggia la scritta premere start anche sul pannello...come posso ovviare al problema? void primafase(){ pin7=digitalRead(7); lcd.setCursor(0,1); lcd.println("CREDITO Euro 1"); lcd.setCursor(2,0); lcd.println("PREMERE START"); while (millis()-nulla>500){ digitalWrite(pin9,1); if (millis()-nulla>1000){ digitalWrite(pin9,0); nulla=millis();}} while (pin7==1){ secondafase();} } Modificato: 7 febbraio 2015 da Gabriele Riva Inserito tag CODE
walterword Inserita: 5 febbraio 2015 Segnala Inserita: 5 febbraio 2015 dovresti avere una stringa vuota tipo s=" " e passarla alla libreria che scrive sul lcd ogni tot tempo
roberto8303 Inserita: 5 febbraio 2015 Autore Segnala Inserita: 5 febbraio 2015 scusa non ho capito cosa intendi per stringa vuota?
Livio Orsini Inserita: 6 febbraio 2015 Segnala Inserita: 6 febbraio 2015 La stringa vuota è "" o " ". Però il lampeggio del led non ha nulla a che vedere con il lampeggio della scritta. Per far lampeggiare la scritta sul pannello è necesario un apposito comando.
roberto8303 Inserita: 6 febbraio 2015 Autore Segnala Inserita: 6 febbraio 2015 (modificato) ma a me non serve che lampeggi la scritta!! quando passo il comando di posizionare il cursore, e scrivere poi nel panello il programma entra nel ciclo while e li c è il millis secondo me è proprio per quello che ottengo questo difetto nel display... questa sera se riesco carico un video per spiegarmi meglio Modificato: 6 febbraio 2015 da roberto8303
Livio Orsini Inserita: 6 febbraio 2015 Segnala Inserita: 6 febbraio 2015 Prova a scrivere un "While" vuoto e vedi se lampeggia sempre. La scritta non può lampeggiare se non c'è un camndo specifico tramite libreria LCD.
roberto8303 Inserita: 6 febbraio 2015 Autore Segnala Inserita: 6 febbraio 2015 (modificato) allora, nulla da fare anche se nel void primafase tolgo while e stampo solo la scritta sul display essa non è stabile ma lampeggia ho caricato un video per far vedere cosa succede alla pressione del primo pulsante a sinistra che simula la presenza di 1 euro inserito, poi a dx lo start e i due led che durano uno 3 secondi e l altro 5 secondi, poi il ciclo si ripete all inizio i due led si alternano con intervallo di mezzo secondo per segnale che la macchina è pronta. Il programma deve essere molto perfezionato ma mi serve solo per le prime prove adesso, solo che non capisco perche questo display non è stabile,ho provato anche ad eliminare i delay dall ultimo void ma non cambia nulla il video: // include the library code: #include <LiquidCrystal.h> unsigned long nulla=0; // initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); boolean pin6=6;//presenza credito 1 euro macchina// boolean pin7=7;//start// boolean pin8=8;//led fisso prima fase// boolean pin9=9;//led fisso dosatura// boolean pin13=13; void setup() { pinMode(pin6,INPUT); pinMode(pin7,INPUT); pinMode(pin8,OUTPUT); pinMode(pin9,OUTPUT); pinMode(pin13,OUTPUT); // set up the LCD's number of columns and rows: lcd.begin(16, 2); } void loop() { pin6=digitalRead(6); pin7=digitalRead(7); lcd.setCursor(0,0); lcd.print("inserire moneta"); while(pin6==1){ digitalWrite(pin8,0); digitalWrite(pin9,0); primafase(); lcd.clear();} while (millis()-nulla >500){ digitalWrite(pin8,1); digitalWrite(pin9,0); if (millis()-nulla>1000){ digitalWrite(pin8,0); digitalWrite(pin9,1); nulla=millis(); }} } void primafase(){ pin7=digitalRead(7); lcd.setCursor(0,1); lcd.print("CREDITO Euro 1"); lcd.setCursor(2,0); lcd.print("PREMERE START"); while (millis()-nulla>500){ digitalWrite(pin9,1); if (millis()-nulla>1000){ digitalWrite(pin9,0); nulla=millis();}} while (pin7==1){ secondafase();} } void secondafase(){ digitalWrite(pin9,1); delay(3000); digitalWrite(pin9,0); delay(100); digitalWrite(pin8,1); delay(5000); digitalWrite(pin9,0); loop(); //da modificare con tasto start // } Modificato: 7 febbraio 2015 da Gabriele Riva Inserito tag CODE
Livio Orsini Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); Questa istruzione inizializza il display, controlla nella libreira perchè è quasi certo che hai inizializzato il display con il comando di "blinking". Il display per lampeggiare deve essere comandato. A meno che tu spenga e riaccenda il sistema ogni mezzo secondo.
giacomo56 Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 Ciao.Non capisco la chiamata a loop() alla fine di seconda fase().
roberto8303 Inserita: 7 febbraio 2015 Autore Segnala Inserita: 7 febbraio 2015 grazie per i consigli ma non va, non è un blink ho provato anche a scrivere lcd.noblink ma nulla solo nel void prima fase la scritta non resta stabile. giacomo il loop l ho messo per far ritornare la macchina allo "zero macchina" quindi pronta a ripetere il ciclo...
giacomo56 Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 Chiamare la funzione loop() all'interno della stessa funzione non mi sembra corretto in questo caso.Hai provato a togliere il while con millis per vedere se il display lampeggia lo stesso?
roberto8303 Inserita: 7 febbraio 2015 Autore Segnala Inserita: 7 febbraio 2015 si e stranamente se tolgo il while con dentro millis il lampeggio è piu veloce ma comunque fastidioso... Per il loop l ho messo nel void seconda fase in modo tale che quando il delay è finito e cioe finisce l erogazione il programma riparte dal loop altrimenti non uscirebbe dal void seconda fase...
walterword Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 il comando lcd.blink() è un po ostico da capire .Io lo uso sul fronte di salita di un evento , non lo devi scrivere ad ogni ciclo if(risingEdge) { if(edit.updateCursorOn ) { edit.IntToChar2(edit.command,buffer,0); lcd.setCursor(19,0); lcd.write( buffer[1]); edit.IntToChar2(edit.moveTagChar,buffer,0); lcd.setCursor(19,2); lcd.write( buffer[1]); edit.IntToChar2(edit.moveTagNumber,buffer,0); lcd.setCursor(19,1); lcd.write( buffer[1]); //if(edit.getcStatus()=='T') // { //lcd.setCursor(edit.page[edit.actualPage].tagInfo[edit.moveTagNumber].start,edit.page[edit.actualPage].tagInfo[edit.moveTagNumber].row); lcd.setCursor(edit.cursorColumn,edit.cursorRow); // } lcd.cursor(); lcd.blink(); } else { lcd.noBlink(); lcd.noCursor(); } } mem=myobject.SquareWave.C.clock10; Considera che nella libreria I2C ci sono dei piccoli ritardi per permettere la sincronizzazione dei comandi In pratica quando dai su un impulso il comando di blink , lui rimane finche non lo dai il noblink , anch'esso deve essere dato su evento . Se guardi il mio codice vedrai che io i comandi li do' solo quando ho certi impulsi - eventi
giacomo56 Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 Il display allora lampeggia perché viene cancellato e riscritto in continuazione.Ciao.
walterword Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 (modificato) Puo' anche capitare che il lampeggio sia asincorno cioè che blinka a frequenze non periodiche e che altre operazioni siano disinibite Dovresti guardare dentro la libreria come funziona per renderti conto , io ho fatto cosi dopo giornate di problematiche Sta di fatto che comunque le librerie funzionano , quasi sempre , no naccanirti sul fatto che sia la libreria a non funzionare Per abilitare il lampeggio devi abiltiare anche il cursore , guarda sopra il mio codice Altra cosa importante , se ha il codice troppo "veloce" può capitare un overhead per cui i delay devi metterli , non toglierli Io non li uso i delay bloccanti perche li odio ma bisogna valutare cosa si sta facendo e soprattutto come Modificato: 7 febbraio 2015 da walterword
Livio Orsini Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 Quand succedono cose apparentemente inspiegabili bisogna agire un passo alla volta per risalire alla causa, vista anche la povertà dei mezzi di debugging dell'ambiente di arduino. Io ti consiglio per prima cosa di scrivere un lopp vuoto ed inserire lcd.setCursor(0,0); lcd.print("inserire moneta"); nella funzione di setup. Così verifichi se c'è o non c'è lampeggio. Dimenticavo una cosa importante che leggndo il tuo listato mi ha ha fatto venire un sospetto. Puoi scrivere i collegamenti al display come li hai fatti? quali pin hai usato e la loro funzione? (pins dei dati, enable e R/S)
accacca Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 Ci provo anche se sono a zero con arduino il blink noblink credo si riferisca al comportamento del cursore che in un display del genere può essere fisso o appunto lampeggiante non ha relazione con i caratteri visualizzati. Vado a memoria ma non credo ci sia l'opzione per far lampeggiare i caratteri come già ipotizzato da altri è sicuramente un refresh dello schermo del tipo cancella la riga e riscrivi la riga. Ma dove questo avvenga non lo so! Tanto per toglierti il dubbio incrementa una variabile globale come prima riga di primafase() e la visualizzi sul display (la inizializzi con 'A' e incrementi di uno ogni volta che entri in prima fase Se la lettera cambia a ogni visualizzazione abbiamo capito altrimenti ...)
roberto8303 Inserita: 7 febbraio 2015 Autore Segnala Inserita: 7 febbraio 2015 (modificato) allora ho trovato il problema praticamente il problema non è nell esecuzione del void primafase, ma nel richiamo!! cioe nel ciclo loop prima di chiamare il void avevo altre funzioni quelle di spegnere i led e clear display prima, questo forse rallentava il ciclo...ora va perfetto posto il video ed il codice nuovo // include the library code: #include <LiquidCrystal.h> unsigned long nulla=0; // initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); boolean pin6=6;//presenza credito 1 euro macchina// boolean pin7=7;//start// boolean pin8=8;//led fisso prima fase e lampeggio credito inserito// boolean pin9=9;//led fisso dosatura// boolean pin13=13; void setup() { pinMode(pin6,INPUT); //sensore presenza 1euro pinMode(pin7,INPUT); // start pinMode(pin8,OUTPUT); //led erogazione pinMode(pin9,OUTPUT); //led pressatura // set up the LCD's number of columns and rows: lcd.begin(16, 2); } void loop() { pin6=digitalRead(6); pin7=digitalRead(7); lcd.setCursor(0,0); lcd.print("inserire moneta"); while(pin6==1){ primafase(); //nel richiamo del void prima fase non deve esserci nessun altro comando// } while //funzione lampeggio led 1 led2 (millis()-nulla >500){ digitalWrite(pin8,1); digitalWrite(pin9,0); if (millis()-nulla>1000){ digitalWrite(pin8,0); digitalWrite(pin9,1); nulla=millis(); }} } void primafase(){ pin7=digitalRead(7); lcd.setCursor(0,0); lcd.print(" CREDITO Euro 1 "); lcd.setCursor(1,1); lcd.print("PREMERE START"); while //lampeggio led1 credito rilevato (millis()-nulla>500){ digitalWrite(pin9,1); if (millis()-nulla>1000){ digitalWrite(pin9,0); nulla=millis();}} while (pin7==1){ lcd.clear(); secondafase();} } void secondafase(){ // esecuzione ciclo di programma aggiungere i pin per motore pressatura //ed elettrovalvola erogazione lcd.setCursor(3,0); lcd.print("EROGAZIONE"); lcd.setCursor(4,1); lcd.print("prodotto"); digitalWrite(pin9,1); delay(3000); digitalWrite(pin9,0); delay(100); digitalWrite(pin8,1); delay(5000); digitalWrite(pin9,0); loop(); } Gabriele Riva come si fa a postare il codice come hai fatto tu? Modificato: 7 febbraio 2015 da roberto8303
Livio Orsini Inserita: 7 febbraio 2015 Segnala Inserita: 7 febbraio 2015 (modificato) Basta evidenziare il codice e poi premere il pulsante con l'icona <> clear display prima Come volevasi dimostrare, c'era l'istruzione per spegnere il display. Modificato: 7 febbraio 2015 da Livio Orsini
roberto8303 Inserita: 7 febbraio 2015 Autore Segnala Inserita: 7 febbraio 2015 Si e oltre questo ora ho imparato che e meglio richiamare solo il void ed eventualmente una volta che vi si entra spegnere i led rimasti accesi ed azzerare variabili, sempre quando e possibile come nel mio caso altrimenti resterebbe un problema come e successo in questo caso...chissa quando mi si presentera questo problema vedro per ora vabbene cosi;)grazie a tutti
Livio Orsini Inserita: 8 febbraio 2015 Segnala Inserita: 8 febbraio 2015 richiamare solo il void Scusa ma se vuoi iniziare con questo lavoro devi imparare alcune informazioni di base. "void" significa solamente che la procedura che segue non restituisce alcun valore, non è il nome di una procedura. Difatti trovi "void setup", "void loop", etc. Significa che le funzioni "loop" e "setup" non rstituiscono alcun dato.
walterword Inserita: 8 febbraio 2015 Segnala Inserita: 8 febbraio 2015 eh ma Livio sei sempre puntiglioso e precisetto ...che palleee
walterword Inserita: 8 febbraio 2015 Segnala Inserita: 8 febbraio 2015 era una battuta la mia ...ovviamente
roberto8303 Inserita: 9 febbraio 2015 Autore Segnala Inserita: 9 febbraio 2015 Scusa ma se vuoi iniziare con questo lavoro devi imparare alcune informazioni di base. "void" significa solamente che la procedura che segue non restituisce alcun valore, non è il nome di una procedura. si e per questo che ho scritto sul forum per cercare di imparare prima comunque lo sbaglio personale è sempre il migliore insegnamento...quando lo si capisce e tutto finisce bene ovviamente
walterword Inserita: 9 febbraio 2015 Segnala Inserita: 9 febbraio 2015 pero' prima di chiedere o perdere tempo è meglio informarsi ed avere un minimo di base , c'e' pieno di roba su arduino in rete ....
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora