Vai al contenuto
PLC Forum


Arduino E Liquid Crystal


roberto8303

Messaggi consigliati

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: da Gabriele Riva
Inserito tag CODE
Link al commento
Condividi su altri siti


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.

Link al commento
Condividi su altri siti

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: da roberto8303
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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: da Gabriele Riva
Inserito tag CODE
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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...

Link al commento
Condividi su altri siti

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?

Link al commento
Condividi su altri siti

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...

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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: da walterword
Link al commento
Condividi su altri siti

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)

Link al commento
Condividi su altri siti

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 ...)

Link al commento
Condividi su altri siti

allora ho trovato il problema :D

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 :thumb_yello:

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: da roberto8303
Link al commento
Condividi su altri siti

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: da Livio Orsini
Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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 :P comunque lo sbaglio personale è sempre il migliore insegnamento...quando lo si capisce e tutto finisce bene ovviamente :lol:

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...