Arduino Uno und DfRobot LCD shield - ADC Tasten erkennen

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Arduino Uno und DfRobot LCD shield - ADC Tasten erkennen

      Hallo,
      hatte ja einmal hier https://bascomforum.de/index.php?thread/196-erstes-bascom-programm-auf-arduino/&postID=1695#post1695 Mustercode für einen Arduino Uno mit DfRobot LCD shield eingestellt. ABER noch ohne Tasten einzulesen, diese hängen nicht einzeln an pins sonder werden über den Analog-Digital wandler ausgelesen.

      Dies LCD Modul hier:index.jpg Hat diesen Schaltplan: LCDKeypad_Shield_SCH.png
      Alles recht grobschlächtig, aber vielleicht hilft es jemanden bei irgendwas. Auf wunsch mach ich ach nen Lexikon eintrag draus.

      Source Code

      1. 'Es wird ein orginal Arduino Uno mit DFRobot LCD shield benutzt
      2. $regfile = "m328pdef.dat"
      3. $crystal = 16000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. $baud = 4800
      8. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , Rs = PortB.0
      9. Config Lcd = 16 * 2
      10. 'Verwendet wird ein Arduino uno und DFRobot 16x2 Displayshiel im Pin mode
      11. Cursor Off Noblink 'Cursor abschalten
      12. cls 'LCD inhalt löschen und auf Home Position zurücksetzen
      13. Config Adc = single , Prescaler = Auto , Reference = avcc '= 10 bit auflösung benutzt wird die
      14. ' referenzspannung am externen AVCC anschluss; am UNO sind dies 5V
      15. Dim W As Word
      16. dim Channel As Byte
      17. Channel = 0 'Tasten Hängen am ADC Channel 0
      18. Config Portb.2 = output 'Konfigurieren des Ausgangs für die LCD Hintergrundbeleuchtung
      19. Deflcdchar 1 , 28 , 16 , 28 , 32 , 32 , 32 , 32 , 32 ' CHR(1) als copyright symbol festlegen
      20. cls 'nach der definition der Eigenen character muss ein CLS durchgeführt werden, Deflcdchar 0 wird nicht definiert da es nicht mit einer Variable benutzt werden kann
      21. cls
      22. portb.2 =1 ' Hintergrundbeleuchtung einschalten
      23. locate 1,1
      24. LCD CHR(1);"Bascomforum.de"
      25. Locate 2,1
      26. LCD "ADC Tasten Test"
      27. Wait 2
      28. cls
      29. Do' Main Loop
      30. cls
      31. W = Getadc(channel)
      32. 'ADC Werte von meinem Arduino und DFRobot LCD Shield, werte schwanken aber je nach Temperatur und Betriesspannung,
      33. 'daher muss man bereiche definieren
      34. 'Right = 0
      35. 'Up = 99
      36. 'Down = 254
      37. 'Left = 409
      38. 'Select = 640
      39. 'Keine Taste = 1023
      40. If w = 0 or w < 10 then
      41. print " Taste Right"
      42. Upperline
      43. LCD "Taste Right"
      44. end if
      45. if w > 95 and w < 105 then
      46. print "Taste Up"
      47. Upperline
      48. LCD "Taste UP"
      49. end if
      50. If w > 250 and w < 260 then
      51. print "Taste Down"
      52. Upperline
      53. LCD "Taste Down"
      54. end if
      55. If w > 403 and w < 414 then
      56. print "Taste Left"
      57. Upperline
      58. LCD "Taste Left"
      59. end if
      60. If w > 635 and w < 645 then
      61. Print "Taste Select"
      62. Upperline
      63. LCD "Taste Select"
      64. end if
      65. IF w = > 1018 then
      66. Print "Keine Taste Gedrueckt"
      67. Upperline
      68. LCD "Taste Druecken"
      69. end if
      70. lowerline
      71. Print "ADC Wert: " ; w
      72. LCD "ADC Wert: " ; w
      73. waitms 750
      74. Loop
      75. end
      Display All


      Tobias

      The post was edited 1 time, last by Schraubbaer ().

    • Hallo Tobias,

      finde ganz toll das Du Arduino Uno und DfRobot LCD shield in Netz gestellt hast.
      ich Persönlich finde es klasse und dafür sage ich Danke.
      ich habe auch eine Mustercode

      if (adc_key_in < 50) return btnRechte;
      if (adc_key_in < 250) return btnObere;
      if (adc_key_in < 450) return btnUntere;
      if (adc_key_in < 650) return btnLinke;
      if (adc_key_in < 850) return btnSELECT;

      und noch eine


      if (adc_key_in < 50) return btnRIGHT;
      if (adc_key_in < 195) return btnUP;
      if (adc_key_in < 380) return btnDOWN;
      if (adc_key_in < 555) return btnLEFT;
      if (adc_key_in < 790) return btnSELECT;



      damit werden meine Taster erkannt falls benötigt werde.

      Tobias eine Frage der Link wenn ich darauf drücke zeigt mir Fehler ( ich dachte ich schreibe es )

      Gruß.

      Antonio
      Teilen dein Wissen, so erlagst du zu Unsterblichkeit

      The post was edited 3 times, last by ledblu ().

    • Ich denke eher er meinte die ADC Werte an sich, die sind ja bei Bascom und C gleich. Auch die Auswertung nur mit < statt mit Bereich wie bei mir währe ausreichend und sieht ja mit Bascom nicht viel anders aus.

      Ursprung des test Programms war etwas anderes wo ich statt nem Stufenschalter ein Poti verwenden wollte, und ich dachte für einen Einstieg ists mit Bereichen besser verständlich.
      Deswegen ja auch die Bemerkung " recht grobschlächtig"

      Tobias
    • So Entschuldige Galaht, Schraubbaer hat genau erkannt
      ich meine die ADC Werte und ich weis auch das man Schreiben
      soll was man meint, dennoch manchmal passieren Fehler.
      so jetzt habe ich das richtig gemacht hoffentlich




      'Right = 50
      'Up = 250
      'Down = 450
      'Left = 650
      'Select = 850


      'Right = 50
      'Up = 195
      'Down = 380
      'Left = 555

      'Select = 790


      Antonio
      Teilen dein Wissen, so erlagst du zu Unsterblichkeit

      The post was edited 1 time, last by ledblu ().

    • Hallo,
      toll super und ich hab den Sonntag mit dem Ding verbracht.
      Aber auch von mir mein Code dazu.
      Da ich finde das er etwas Übersichtlicher und besser dokumentiert ist.
      Gerade für Anfänger.


      Source Code

      1. 'Programm zum Ansteuern des Arduino Uno mit LCD Keypad Shield
      2. '
      3. 'Controller: Original ATMega328P
      4. 'Quarz: 16MHz
      5. '
      6. 'Belegung LCD: *
      7. 'Backlight - PB2
      8. 'DB4 - PD4
      9. 'DB5 - PD5
      10. 'DB6 - PD6
      11. 'DB7 - PD7
      12. 'RS - PB0
      13. 'E - PB1
      14. '
      15. 'Belegung Tasten:
      16. 'Über Widerstandsnetzwerk an PC0 (ADC0)
      17. 'keine Taste gedrückt: 1023 - Abfrage auf ADC > 1000
      18. 'Select: 739 - Abfrage auf ADC < 790
      19. 'Links: 503 - Abfrage auf ADC < 555
      20. 'Unten: 327 - Abfrage auf ADC < 380
      21. 'Oben: 143 - Abfrage auf ADC < 195
      22. 'Rechtst: 0 - Abfrage auf ADC < 50
      23. '---------- Konfiguration -----------------------------------------------------
      24. $regfile = "m328pdef.dat"
      25. $crystal = 16000000
      26. $hwstack = 100
      27. $swstack = 100
      28. $framesize = 100
      29. '---------- LCD -----------------------------------------------------
      30. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
      31. Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
      32. Config Lcd = 16 * 2
      33. Cursor Off Noblink
      34. Cls
      35. '---------- ADC -----------------------------------------------------
      36. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      37. Start Adc
      38. '---------- Beleuchtung LCD---------------------------------------------
      39. Config Portb.2 = Output 'PinB.2 als Ausgang für das LCD Backlight
      40. PortB.2 = 1
      41. '---------- Variablen -----------------------------------------------------
      42. Dim Wert_von_tastatur As Word 'aktueller ADC-Wert
      43. Dim Keycode As byte
      44. '---------- Kauptprogramm -----------------------------------------------------
      45. do
      46. locate 1,1
      47. lcd "ADC: "
      48. locate 1,10
      49. lcd Wert_von_tastatur ;"
      50. Gosub Key
      51. locate 2,1
      52. lcd keycode ;"
      53. if Keycode = 0 then gosub Rechts
      54. if Keycode = 1 then gosub Oben
      55. if Keycode = 2 then gosub Unten
      56. if Keycode = 3 then gosub Links
      57. if Keycode = 4 then gosub Sct
      58. gosub Keine
      59. waitms 600
      60. locate 1,6
      61. lcd " "
      62. locate 2,1
      63. lcd " "
      64. loop
      65. end
      66. '---------- Funktion Key -----------------------------------------------------
      67. Key:
      68. do
      69. Wert_von_tastatur = Getadc(0) 'adc-Wert einlesen
      70. Select Case Wert_von_tastatur
      71. Case 0 to 5 'Taste Rechts
      72. Keycode = 0
      73. Case 98 To 102 'Taste Oben
      74. Keycode = 1
      75. Case 254 To 258 'Taste Unten
      76. Keycode = 2
      77. Case 408 To 412 'Taste Links
      78. Keycode = 3
      79. Case 635 To 645 'Taste Select
      80. Keycode = 4
      81. Case Is > 1000 'keine Taste
      82. Keycode = 99
      83. End Select
      84. Loop until Keycode < 99
      85. Return
      86. '---------- Sub Rechts -----------------------------------------------------
      87. Rechts:
      88. Locate 2, 10
      89. LCD "Rechts"
      90. waitms 600
      91. return
      92. '---------- Sub Links -----------------------------------------------------
      93. Links:
      94. Locate 2, 10
      95. LCD "Links"
      96. waitms 600
      97. return
      98. '---------- Sub Oben -----------------------------------------------------
      99. Oben:
      100. Locate 2, 10
      101. LCD "Oben"
      102. waitms 600
      103. return
      104. '---------- Sub Unten -----------------------------------------------------
      105. Unten:
      106. Locate 2, 10
      107. LCD "Unten"
      108. waitms 600
      109. return
      110. '---------- Sub Sct -----------------------------------------------------
      111. Sct:
      112. Locate 2, 10
      113. LCD "Select"
      114. waitms 600
      115. return
      116. '---------- Sub Keine -----------------------------------------------------
      117. Keine:
      118. Locate 2, 10
      119. LCD "Keine "
      120. return
      Display All