Arduino: leggere su display la distanza da un oggetto



Questo progetto vi consentirà di cosruire una sorta di metro ad ultrasuoni,
Potrete infatti visualizzare su display la distanza misurata con sensore ultrasonico HC-SR04.
ecco lo schema di collegamento:




Qui lo sketch:


  1. #include <LiquidCrystal.h>
  2. int triggerPort = 7;
  3. int echoPort = 8;
  4. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
  5. // connessione display (pin)
  6. void setup() {
  7. pinMode( triggerPort, OUTPUT );
  8. pinMode( echoPort, INPUT );
  9. Serial.begin( 9600 );
  10. Serial.println( "Sensore ultrasuoni: ");
  11. lcd.begin(16, 2);
  12. // imposto il tipo di display (colonne, righe)
  13. lcd.print("Distanza:");
  14. }
  15. void loop() {
  16. //porta bassa l'uscita del trigger
  17. digitalWrite( triggerPort, LOW );
  18. //invia un impulso di 10microsec su trigger
  19. digitalWrite( triggerPort, HIGH );
  20. delayMicroseconds( 10 );
  21. digitalWrite( triggerPort, LOW );
  22. long duration = pulseIn( echoPort, HIGH );
  23. long r = 0.034 * duration / 2;
  24. Serial.print( "durata: " );
  25. Serial.print( duration );
  26. Serial.print( " , " );
  27. Serial.print( "distanza: " );
  28. if( duration > 38000 ) Serial.println( "fuori portata");
  29. else { Serial.print( r ); Serial.println( "cm" );}
  30. // posiziono il cursore alla colonna 12 e riga 0
  31. if(r > 99){
  32. lcd.setCursor(13, 0);
  33. lcd.print(r);}
  34. if(r <= 99 && r > 9){
  35. lcd.setCursor(13, 0);
  36. lcd.print(r);
  37. lcd.setCursor(15, 0);
  38. lcd.print(" ");}
  39. if(r <= 9){
  40. lcd.setCursor(13, 0);
  41. lcd.print(r);
  42. lcd.setCursor(14, 0);
  43. lcd.print("  ");}
  44. delay(300);
  45. }


Segui Daniele Alberti su Google+

21 commenti:

  1. Daniele, ho assemblato i componenti del progetto (leggere su display la distanza da un oggetto ), ho caricato lo sketch.
    Sul monitor durata e distanza compaiono regolarmente, su LCD nulla.
    Ho controllato e ricontrollato il cablaggio e Il contenuto dello sketch paragonandolo ad altro tuo progetto funzionate ( Termostato / Igrostato regolabile con display) sia nella configurazione del LCD e suoi parametri, ma nulla.
    Nota: LCD funziona con altro progetto e la regolazione del contrastoè stata effettuata.
    Sono alle prime armi con Arduino ma come assemblatore e conoscitore di elettronica me la cavo.
    Se hai qualche consiglio da fornirmi te ne sarei molto grato.
    In attesa gradisci distinti saluti e un grande apprezzamento per l'opera che svolgi.
    Antonio

    RispondiElimina
    Risposte
    1. Prova a scollegare Il modulo ad ultrasuoni e a caricare lo sketch del termostato, si vede qualcosa sull'lcd?

      Elimina
    2. Come prima, la prova l'avevo già effettuala sarebbe dovuto apparire come da riga 14 --lcd.print("Distanza:")--; la stringa inviata al LCD.
      Agendo sul controllo del contrasto passo da un azzurro uniforme ai 16 display dellla prima riga uniformemente illuminat in griglia 5x8

      Elimina
    3. Ho anche provato a sostituire Arduino pensando ad un suo problema.
      Niente

      Elimina
    4. Scusa ma non ho capito con l'altro sketch, senza modificare niente, si vede qualcosa?

      Elimina
  2. Ho provato ad estrapolare il codice seguente

    #include
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    void setup(){
    lcd.begin(16, 2);
    lcd.setCursor(3, 0);
    lcd.print("Distanza:");
    }
    Il caricamento non aviene e mi restituisce
    core.a(main.cpp.o): In function `main':
    C:\Program Files\Arduino\hardware\arduino\cores\arduino/main.cpp:43: undefined reference to `loop'

    Dove sbaglio?

    RispondiElimina
  3. Mi si è cancella to nella prima riga del commento parte della dichiarazione
    #include
    ma nello sketh era oresente
    Scusa

    RispondiElimina
    Risposte
    1. Si ho capito,
      Comunque devi per forza mettere anche il loop sennò non funziona.
      Lascialo anche vuoto così.
      void loop (){}

      Elimina
    2. Inserito il loop.
      Nulla, come prima.
      Sto utilizzando la versione del compilatore 1.0.6
      Quasi ci rinuncio mi spiace per l'impegno che ti ho recato.

      Elimina
    3. Ma no dai.. Prova questo
      http://www.danielealberti.it/2014/10/collegare-un-display-lcd-ad-arduino.html?m=1

      Elimina
  4. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  5. Risolto !!!
    La breadboard non collegava il GND ad un pin dell'LCD.
    grazie di tutto

    RispondiElimina
  6. Salve, innanzitutto complimenti per come delucidi tutti i progetti, premesso che sono alle prime armi ho sviluppato questo progettino della "misura della distanza con display", e grazie a tutte le spiegazioni sono riuscito a farlo senza difficoltà; ora avrei intenzione di implementarlo con 2 sostanziali modifiche visto che a me serve più per misurare il livello di una cisterna e la sua quantità di acqua al suo interno;le modifiche che avrei intenzione di fare sono le seguenti:
    1- tramite la formula dei cilindri inserire all'interno dello sketch la stessa per conoscere momento per momento la quantità di acqua al suo interno, (comunque ho letto che le onde sull'acqua si propagano ad una velocità diversa da quella dell'aria, (1480 ms) però ho già fatto delle prove con la formula inserita nello sketch e la misura è abbastanza precisa, quindi lascerei quella)e inserire nella seconda riga del display i litri rimanenti.
    2- se c'è la possibilità di avere un'uscita analogica proporzionale alla lettura del sensore, cioè 0V/0cm e 5V/1,2mt.
    Spero di essere stato chiaro, capisco che il tempo manca sempre ma se è possibile gliene sarei grato, grazie Lorenzo Vita

    RispondiElimina
    Risposte
    1. Buongiorno, grazie mille per i complimenti.
      Tenga conto che la variabile "r" contiene il valore in centimetri. quindi può creare una nuova variabile che conterrà il valore del calcolo che le serve. Per l'uscita analogica Arduino non ne dispone, è presente però il PWM su alcuni pin (quelli con la tilde disegnata a fianco del numero). Il pwm genera un treno di impulsi che simula un'uscita analogica tra 0 e 5v. Il comando è "analogWrite(x,y)" dove x e y sono il pin e il valore di uscita proporzionale tra 0 e 255.

      se ci sono problemi lasci pure un altro commento.
      Saluti, Daniele

      Elimina
    2. Buongiorno, grazie mille per i complimenti.
      Tenga conto che la variabile "r" contiene il valore in centimetri. quindi può creare una nuova variabile che conterrà il valore del calcolo che le serve. Per l'uscita analogica Arduino non ne dispone, è presente però il PWM su alcuni pin (quelli con la tilde disegnata a fianco del numero). Il pwm genera un treno di impulsi che simula un'uscita analogica tra 0 e 5v. Il comando è "analogWrite(x,y)" dove x e y sono il pin e il valore di uscita proporzionale tra 0 e 255.

      se ci sono problemi lasci pure un altro commento.
      Saluti, Daniele

      Elimina
  7. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  8. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  9. Grazie per le dritte, ho provato a inserire all'interno del progetto le dovute modifiche, per adesso sto cercando di modificare solo la parte analogica;
    la mia difficoltà stà nel far interpretare a "analogWrite(x,y)" a quale riferimento deve attenersi, cioè sul sito di arduino ho trovato la funzione

    "{
    int val = analogRead(0);
    val = map(val, 0, 1023, 0, 255);
    analogWrite(9, val);
    }

    ma capisco che fa riferimento ad un ingresso analogico, mentre a me serve fargli interpretare i valori del sensore che per l'esattezza leggendoli sul monitor seriale sono 800min e 5900max (cioè circa 16 cm come valore minimo e 100cm come valore max), quindi non saprei proprio come fare.
    Saluti e grazie per l'interessamento Lorenzo

    RispondiElimina
  10. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  11. int x=500; //numero tra 0 e 1000
    r = map(x, 0, 1000, 0, 255);
    analogWrite(6, r);

    questo è il codice che ho inserito, considerando che "r" è il valore del sensore e x il comparatore, non so se riesco a spiegarmi, in questo modo non mi varia la tensione in uscita rimane sempre la stessa, invece ho provato così:

    r = map(r, 800, 5900, 0, 5000);
    analogWrite(6, r);

    qualcosa succede però mi spegne dopo un pò il display, grazie ancora

    RispondiElimina
  12. Salve, primo quesito risolto, ora mi accingo all'altro, in caso mi faccio vivo, grazie ancora

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Related Posts Plugin for WordPress, Blogger...