problemi con display lcd

salve a tutti , premetto che sono alle prime armi sia con elettrinica che programmazione ,
arduino mi appassiona molto e vorrei imparare a programmarlo .
facendo delle prove mi e venuta un idea ma visto le mie scarse conscenze,mi sono inchiodato. ecco che vi chiedo aiuto, potete visionare il mio progettino e farmi capire dove sbaglio?
io purtroppo non ci arrivo da solo.forse per la fretta .
mi spiego meglio .
vorrei poter regolare un led grb in maniera digitale, funzionerebbe alla perfezione se non fosse che vorrei stampare su lcd anche i valori.
che si li leggo sul display , ma quando funziona il display ,(quindi vedo i valori corretti)
non funziona piu la regolazione del colore.(se cancello cio che riguarda il display questultima funziona.
prima di gettare la spugna mi rivolgo a voi per vedere se mi sblocco per procedere con la mia idea
la domanda e quindi se ce fra voi qualcuno disposto a dare un occhio a cio che ho fatto e che riesca a trovare dove sbaglio.devo dire che non sono acora in possesso di un arduino ec.(che avrei gia bruciato).mi aiuto con tinkercad, ammesso che funzioni bene.
provo a postare cio che ho scritto nel programma e una foto dei collegamenti poi vediamo se in caso necessita linko il progetto che magari e piu chiaro.
ripeto vorrei solo essere aiutato a trovare l'errore che non capisco se sia il cablaggio sbagliato o il sw.scritto,,,,,,,,ringrazio fin dora chi mi puo aiutare..

rgbdisplay.txt (5.96 KB)

ciao.
mi permetto di farti un paio di osservazioni senza cattiveria...

  • il codice se ci sta mettilo direttamente nel post USANDO i tag code, è più semplice consultarlo
  • se proprio non ci sta allegalo come file INO
  • indenta decentemente il codice... se non hai chiaro come fare premi ctrl+T nell'ide e ci pensa lui
  • usa dei nomi simbolici per i pin che chiariscano a cosa servono, tipo LEDR_PIN per il pin abbinato al led rosso. se metti solo i numeri dei pin diventa difficile capire cosa stai facendo
  • usa qualche commento così aiuti chi legge il tuo codice a capire

venendo al problema, sono arrivato solo a metà codice ma mi pare che hai fatto casino coi pin... usi il pin 11 sia per il display che per il led...
verifica che ogni pin serva per una cosa soltanto.

prima di tutto grazie dell’interessamento .si hai ragione ma proprio non ci ho fatto caso alla scrittura ,sono autodidatta…provo a fare di meglio sicuramente col tempo accadra.rimanendo sullo schema ,ho collegato il display sui pin di uscita assieme a quelli del led perche pensavo che lo stesso impulso che do ad arduino per aumentare la luce mi venga letto dal display il problema e che non capisco dove e perche con il display attivo mi rimane corrente nei pin 9, e 10 ma il display funziona correttamente.se cancello la parte di codice
riguardante il display funziona alla perfezione la parte elettrica .compreso il seriale
l’errore c’e ma non lo trovo…aspetto idee grazie ancora

[code]
[code]
#include <LiquidCrystal.h>
// inizializzo il display e i vari pin collegati
const int rs = 13, en = 12, d4 = 6, d5 = 9, d6 = 10, d7 = 11;
LiquidCrystal lcd (rs, en, d4, d5, d6, d7);

//definisco le variabili per laccensione dei 3 colori mediante interruttore
int  brosso = 0; // pulsante del colore rosso che entra nel pin 8 e mi da corrente anche ai pulsanti piu e meno.
int  bblu = 0;   // pulsante del colore blu che entra nel pin 7 e mi da corrente anche ai pulsanti piu e meno.
int  bverde = 0; // pulsante del colore verde che entra nel pin 4 e mi da corrente anche ai pulsanti piu e meno.
//definisco le variabili per l'aumento/diminuzione dell'inensita di uscita (pin 9,10,11)
int piu = 0 ;
int meno = 0 ;
//definisco le variabili per ognuna delle 3 uscite 
int valr = 0 ; colore rosso (pin 11)
int valb = 0 ; colore blu (pin 10)
int valv = 0 ; colore verde (pin 9)
void setup() {
//inizializzo i vari pin
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(8, INPUT);
  pinMode(7, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(3, INPUT);
//inizializzo il display
  lcd.begin(16, 2);
  
}



void loop() {

//inizializzo i vari pulsani nei vari pin
  meno = digitalRead(3);
  piu = digitalRead(5);
  brosso = digitalRead(8);
  bblu = digitalRead(7);
  bverde = digitalRead(4);

  
  

// do un limite alla lettura per ogni colore
  valr = max(valr, 0);
  valr = min(valr, 255);
  valb = max(valb, 0);
  valb = min(valb, 255);
  valv = max(valv, 0);
  valv = min(valv, 255);

 

  if ( brosso == HIGH) {    //controllo  di avere corrente nel pin 8
    if (piu == HIGH) {   //  se schiaccio il pulsante piu
      valr = valr + 1;  //aumenta la corrente
      analogWrite(11, valr);  //dammi la corrente aumentata nel pin di uscita 11
 //scrivi il valore di tutti e tre  i colori
      Serial.print("ROS "); 
      Serial.print(valr);
      Serial.print(" BLU ");
      Serial.print(valb);
      Serial.print(" VER ");
      Serial.println(valv);
   // scrivi su lcd dopo averlo pulito il valore delle 3 uscite
      lcd.clear();
      lcd.print("R");
      lcd.print(valr);
      lcd.setCursor(7, 0);
      lcd.print("B");
      lcd.print(valb);
      lcd.setCursor(13, 0) ;
      lcd.print("V");
      lcd.print(valv);
      lcd.noAutoscroll();
      //delay(200);
    }
  }

//  stesso loop del piu ma col pulsante meno del colore rosso
  if ( brosso == HIGH) {
    if (meno == HIGH) {
      valr = valr - 1;
      analogWrite(11, valr);
      delay(500);
      Serial.print("ROS ");
      Serial.print(valr);
      Serial.print(" BLU ");
      Serial.print(valb);
      Serial.print(" VER ");
      Serial.println(valv);
      // lcd.clear();
      lcd.print("R");
      lcd.print(valr);
      lcd.setCursor(7, 0);
      lcd.print("B");
      lcd.print(valb);
      lcd.setCursor(13, 0) ;
      lcd.print("V");
      lcd.print(valv);
      lcd.noAutoscroll();

      // delay(200);

    }
  }
  // stesso loop del rosso ma riguarda il blu sul pin 10
  

              if( bblu==HIGH){
              if(piu==HIGH){
                 valb=valb+1;
                 analogWrite(10,valb);
             delay(500);
               Serial.print("ROS ");
               Serial.print(valr);
               Serial.print(" BLU ");
               Serial.print(valb);
               Serial.print(" VER ");
               Serial.println(valv);
      //   lcd.clear();
                lcd.print("R");
                lcd.print(valr);
                lcd.setCursor(7, 0);
                lcd.print("B");
                lcd.print(valb);
                lcd.setCursor(13,0) ;
                lcd.print("V");
                lcd.print(valv);
                   lcd.noAutoscroll();


            } }
                if( bblu==HIGH){
              if(meno==HIGH){
              valb=valb-1;
              analogWrite(10,valb);
              delay(500);
                Serial.print("ROS ");
               Serial.print(valr);
               Serial.print(" BLU ");
               Serial.print(valb);
               Serial.print(" VER ");
               Serial.println(valv);
      //   lcd.clear();
                lcd.print("R");
                lcd.print(valr);
                lcd.setCursor(7, 0);
                lcd.print("B");
                lcd.print(valb);
                lcd.setCursor(13,0) ;
                lcd.print("V");
                lcd.print(valv);
              lcd.noAutoscroll();


              }lcd.clear();}


// stesso loop del blu e del rosso ma col verde sul pin 9
               if( bverde==HIGH){
               if(piu==HIGH){
              valv=valv+1;
              analogWrite(9,valv);
             delay(500);
                   Serial.print("ROS ");
               Serial.print(valr);
               Serial.print(" BLU ");
               Serial.print(valb);
               Serial.print(" VER ");
               Serial.println(valv);
    //     lcd.clear();
                lcd.print("R");
                lcd.print(valr);
                lcd.setCursor(7, 0);
                lcd.print("B");
                lcd.print(valb);
                lcd.setCursor(13,0) ;
                lcd.print("V");
                lcd.print(valv);
          lcd.noAutoscroll();


          } }
               if( bverde==HIGH){
               if(meno==HIGH){
              valv=valv-1;
              analogWrite(9,valv);
           delay(500);
              Serial.print("ROS ");
               Serial.print(valr);
               Serial.print(" BLU ");
               Serial.print(valb);
               Serial.print(" VER ");
               Serial.println(valv);
        //  lcd.clear();
                lcd.print("R");
                lcd.print(valr);
                lcd.setCursor(7, 0);
                lcd.print("B");
                lcd.print(valb);
                lcd.setCursor(13,0) ;
                lcd.print("V");
                lcd.print(valv);
                 lcd.noAutoscroll();

               }lcd.clear();}

         //delay(1000);

}//LOOP

[/code][/code]

Usa pin diversi per fare cose diverse.
Il display è gestito dalla libreria e utilizza i relativi pin come le pare.
Per i led usa degli altri pin.
Prova e vedi cosa succede.

Poi, anche da autodidatta, puoi cercare di fare attenzione ad alcune "buone pratiche" di programmazione.
Se il codice è scritto in maniera comprensibile hai più probabilità di essere aiutato. Non tutti hanno voglia di scervellarsi per capire cosa fa un codice scritto ad escusivo uso e consumo di chi l'ha scritto...
E fidati che se lo riprendi in mano tra un paio di settimane anche tu stesso farai fatica a capire cosa stavi facendo.

perfettamente ragione grazie, ora vedo cosa riesco a combinare, si mi e venuto il dubbio che il display mi sparasse fuori corrente a modo suo, ora provo a capirlo meglio, anche se in prove precedenti,
dall'alto delle mie conoscenze :confused: ho provato a spargere diodi in giro ,per cercare di incanalare il segnale , ma no e cosi evidentemente .ci guardo ancora un po...... grazie ancora della pazienza,

aspetta aspetta ,non e che devo capire che il led mi si accende con un impulso analogico e il display ne vuole uno digitale o viceversa?
mi basterebbe sapere anche questo,,,,,,

Allora, intanto quello che devi ricordare è che, su Arduino, non puoi usare lo stesso pin per più cose, quindi, i pin del LCD sono unicamente del LCD, i pin per i LED sono unicamente per i LED, e così via ... niente miscugli!

Dopo di che, se devi solo accendere e spegnere un LED, usi un qualsiasi pin (... ricorda che anche i pin, che su Arduino sono marchiati come ingressi analogici, in realtà possono essere usati come I/O digitali), mentre, se devi regolarne la luminosità, allora devi usare dei pin capaci di PWM (quelli marchiati con il simbolo ~).

Guglielmo

Stai usando un microcontrollore! Perché colleghi i pulsanti con logiche a diodi? Basta scrivere nel programma che i tasti + e - sono attivi solo se contemporaneamente è premuto un altro tasto.

Se colleghi i LED sul bus del display, ogni volta che viene scritta qualche cosa sul display i LED lampeggiano. Quando i pin non sono sufficienti, cose del genere si possono anche fare, ma bisogna pensarci bene per gestire la condivisione.

Ad esempio, nel contatore Geiger ho condiviso il pin A0 per il pilotaggio di un LED e la lettura della tensione della batteria, ma per farlo ho dovuto leggere la tensione della batteria tramite un partitore che a piena carica fornisce una tensione di 1V, molto inferiore a quella di soglia del LED. Ogni minuto, per un attimo viene letta la tensione della batteria e poi il pin ritorna a pilotare il LED.

>Datman: … ti pregherei di lasciare per te queste cose … chi inzia deve avere ben in testa che con un pin fa UNA cosa, poi, con l’esperienza, si impara che possono, a volte, esserci deroghe alla cosa. Grazie.

Guglielmo

Infatti ho scritto che bisogna pensarci bene. Se non è in grado, non lo fa.
Torno nel silenzio.

Datman:
Stai usando un microcontrollore! Perché colleghi i pulsanti con logiche a diodi? Basta scrivere nel programma che i tasti + e - sono attivi solo se contemporaneamente è premuto un altro tasto.

dai non litigate sto solo imparando......
ciao a tutti .
datman ,si io intendevo proprio cosi, solo se si chiude uno dei tre interruttori i tasti piu e meno lavorano
intendevo scriverlo con i due "if"
mi hai dato due spunti sui quali pensare, ma sono anche daccordo con gpb01 sono proprio all'inizio,

grazie a voi ho risolto!
erano proprio i pin in comune che non andavano d'accordo.ho seguito il consiglio di gbp01.
rimango ancora ignorante sul perche non posso sdoppiare un pin dal quale mi deve uscire lo stesso segnale!

federicokuki:
... rimango ancora ignorante sul perche non posso sdoppiare un pin dal quale mi deve uscire lo stesso segnale!

Perché, specie per alcune cose, NON sei tu ad avere il controllo dei pin e sapere il loro comportamento, ma è il "core" Arduino e le librerie che usi, cose di cui NON conosci il funzionamento interno e NON sai cosa fanno.

Guglielmo

federicokuki:
rimango ancora ignorante sul perche non posso sdoppiare un pin dal quale mi deve uscire lo stesso segnale!

Quando vengono inviati dati al display, escono sugli stessi pin a cui sono collegati i LED, perciò è inevitabile che si accendano! No?... :slight_smile:

si sono daccordo, infatti il mio pensiero iniziale (sbagliato) voleva allo stesso tempo un uscita di corrente per manovrare l’intensita del led e sullo stesso pin un “segnale” per lcd.si una specie di impulso insomma.

grazie ancora delle spiegazioni

A tutto ciò, aggiungo anche che ti semplifichi notevolmente la vita se per i display LCD ne usi uno con interfaccia I2C che è un "bus seriale", e quindi grazie a questo:

  1. eviti di usare 4 pin da dedicare all'LCD ma ne bastano due
  2. i due pin sono A4 ed A5, ossia SDA e SCL, ed in genere sono poco usati
  3. il bus I2C può collegare più device con gli stessi due pin (ogni device "legge" solo i dati per il proprio indirizzo).

Ti consiglio quindi di acquistare sempre LCD in I2C, che di fatto sono lo stesso display che hai, ma dietro c'è collegato un circuitino che "trasforma" i segnali dell'LCD nel bus I2C.
Il che significa anche che se hai un po' di pratica col saldatore, potresti anche acquistare tu questo circuitino di conversione I2C per i display LCD e trasformare quello "normale" in uno con interfaccia I2C. Vedi ad esempio QUI.

si, si grazie , ho visto che ci sono possibilita di tutti i tipi.Non so se c'entra ma sono propro all'inizio, non posseggo ancora niente, sono solo
idee che mi servono per imparare, questo e un mondo!!! mille potenzialita !
fortunatamente sono nel posto giusto dove anche solo un appassionato puo imparare.grazie ancora .
poi un giorno se sviluppero qualcosa ve lo mostro.
per ora sono solo luci , forse domani un drone con braccio robotico che mi toglie il cappello e lo posiziona ,,,e via dicendo ..alla prossima,CIAO!

Oppure un semplice shift register
Bastano 3 pin
Vedere LCD 4094
http://www.dmxpassion.altervista.org/pg018.html
Pilota inoltre un buzzer e il BL del display
C’è lo schema