16 bit Eingang Dual in LCD darstellen

Hallo,

ich bin der Andreas und Arduino Neuling. Ich würde gerne mit dem Arduino eine LCD-Anzeige realisieren.
Arduino Mega 2560 und zweizeiliges LCD-Shield ist vorhanden.

Es gibt 16 LED´s die ein "Wort" anzeigen. Diese werden über einen 4 Stelligen Schalter (0-9,a-f) gesteuert werden.
Ich möchte diese 16 LEDs (also dessen Spannung 0 oder 3,3 Volt) an 16 Eingänge am MEGA 2560 einspeisen und abfragen.

Am LCD würde ich gerne von rechts nach links den jeweiligen Status (0 oder1) ausgeben und angezeigt bekommen.

Es sollte dann am LCD so aussehen (siehe angehängtes Bild):

0000000000000000
..4...|..3...|..2...|..1..

Ich kann alles verdrahten aber nicht programmieren.

Vielleicht gibt es ja irgendwo ein fertiges Sketch.

Bitte, wer kann mir helfen.

Andi

LCD_Anzeige.JPG

Hallo,

meinetwegen.

void formatiere2Byte (unsigned int data)
{
  Serial.print(F("data: "));
  for (char i=15;i>=12;i--) {
    Serial.print( (data >> i) & 0x01);
  }
  Serial.print("'");
  for (char i=11;i>=8;i--) {
    Serial.print( (data >> i) & 0x01);
  }
  Serial.print('.');
  for (char i=7;i>=4;i--) {
    Serial.print( (data >> i) & 0x01);
  }
  Serial.print("'");
  for (char i=3;i>=0;i--) {
    Serial.print( (data >> i) & 0x01);
  }
  Serial.println();
}

Hallo Doc_Arduino,

danke, das ging ja schnell.
Nützt mir aber nichts. Wie gesagt ich kann löten aber nicht programmieren.
Ich brauch ein fertiges Programm.
Und wenn das fünf Weissbier und einen Schweinsbraten kosten soll, dann ist es eben so :slight_smile:

Andi

Hallo,

du musst nur mit einer zum LCD passenden Lib das Display zum laufen bekommen. Es liegen eigentlich immer Bsp. dabei.
Wenn das klappt änderst du in der gezeigten Funktion das Serial zu lcd oder wie der Klassenname eben dann heißt ab.
Serial.print >> lcd.print
Dann nur noch den cursor immer neu auf Anfang setzen.
Sollte relativ schnell funktionieren.

Ich habe im Eingangspost nun ein Bild angehängt

Hallo,

na geht doch. Wo war jetzt das Problem?

Das ist nur ein Foto wie es aussehen soll.

Wie gesagt, ich habe weder Ahnung vom programmieren, noch weiss ich wo ich was anschliessen muss.

Nochmal ich kann nicht programmieren.

Ich kann nach Anleitung die Eingänge an vorgegebene Pins anschliessen, ich kann einen Sketch auf den Arduino hochladen und dann eigentlich nur zuschaun obs geht.

Hallo,

weiß auch nicht warum ich das jetzt mache.

/*
  Doc_Arduino - german Arduino Forum
  IDE 1.8.12
  avr-gcc 9.2.0
  Arduino Mega2560
  dd.mm.2020
*/

const byte ANZAHL_PINS = 16;      // Anzahl der Eingangspins
const byte ersterPin = 22;        // ab welchen Pin gehts los?
byte pin[ANZAHL_PINS];


void setup(void)
{
  Serial.begin(9600);
  Serial.println("\nStart");

  for (byte i = 0; i < ANZAHL_PINS; ++i)
  {
    pin[i] = ersterPin + i;             // Pinnummern einsortieren
    pinMode(pin[i], INPUT_PULLUP);      // und konfigurieren
  }
}


void loop(void)
{
  // Pin nacheinander einlesen und ausgeben in einem Rutsch
  for (byte i = 0; i < ANZAHL_PINS; ++i)
  {
    Serial.print( digitalRead(pin[i]) );
  }

  // neue Zeile wegen Seriellen Monitor
  Serial.println();

  // bremst loop, sonst kann man schlecht lesen
  delay(100);
}

lcd bringste selbst zum laufen und änderst das wie gesagt ab. Und sage jetzt nicht nochmal "ich habe weder Ahnung vom programmieren". Das ist jetzt nur noch anpassen. Verstehen lernen, abändern.

Vielleicht habe ich das lcd auch bewusst weggelassen ... ??? 'grübel'

doc hats ja bis auf 4 Zeilen fix und fertig gemacht.

Jetzt liegt es an dir ... du brauchst jetzt erst mal eines der HelloWorld Beispiele für das LCD.
Das musst du schaffen, denn nur du hast die Hardware vor dir liegen.

Klappt das schon?

@noiasca

ich probier es derzeit, wird a bisserl dauern

Dieses Shield (siehe Anhang) habe ich vor ca 2 Jahren bei Amazon gekauft (3 Stück).

Ich habe es jetzt auf den Mega aufgesteckt. Es funktioniert. Nun suche ich noch nach einem "Hello World" Sketch.

Hallo,

dein LCD sollte mit der Standard Lib der IDE im 4Bit Mode laufen.
IDE > Datei > Beispiele > LiquidCrystal > HelloWorld
Link im Kommentar lesen und die Pins entsprechend deiner Verkabelung konfigurieren.

puh, sowas hatte ich auch mal,

ohne Gewährleistung aus einem uralten Sketch:

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
const int pin_BL = 10;

Meine Code Zeilen sehen jetzt so aus. Und es wird auch im Display angezeigt.

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); // diese Pins werden benutzt


void setup()
{
 
  lcd.clear();      // LCD löschen
  lcd.begin(16, 2); // verfügbare Spalten und Zeilen
 
  lcd.setCursor(0,0);        // 0. Spalte (= ganz links) und 0. Zeile (= oben)
  lcd.print("Hello World!");
 
  lcd.setCursor(0,1);
  lcd.print("Hallo Welt!");

}
void loop()
{

}

gut.

jetzt nimmst mal den Sketch #7 so wie er ist und schaust dass der macht was du willst.

Wenn du was ändern musstest, stell ihn wieder hier ein.

gib bescheid wenn du soweit bist.

Hab ich jetzt mal eingefügt, funzt aber noch nicht. Es gibt eine Fehlermeldung

exit status 1
a function-definition is not allowed here before '{' token

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); // diese Pins werden benutzt

const byte ANZAHL_PINS = 16;      // Anzahl der Eingangspins
const byte ersterPin = 22;        // ab welchen Pin gehts los?
byte pin[ANZAHL_PINS];

void setup(void)
{
 
  lcd.clear();      // LCD löschen
  lcd.begin(16, 2); // verfügbare Spalten und Zeilen
 
  lcd.setCursor(0,0);        // 0. Spalte (= ganz links) und 0. Zeile (= oben)
  lcd.print("Hello World!");
 
  lcd.setCursor(0,1);
  lcd.print("Hallo Welt!");


Serial.begin(9600);
  Serial.println("\nStart");

  for (byte i = 0; i < ANZAHL_PINS; ++i)
  {
    pin[i] = ersterPin + i;             // Pinnummern einsortieren
    pinMode(pin[i], INPUT_PULLUP);      // und konfigurieren
}
void loop(void)
{
// Pin nacheinander einlesen und ausgeben in einem Rutsch
  for (byte i = 0; i < ANZAHL_PINS; ++i)
  {
    Serial.print( digitalRead(pin[i]) );
  }

  // neue Zeile wegen Seriellen Monitor
  Serial.println();

  // bremst loop, sonst kann man schlecht lesen
  delay(100);
}

drück mal strg-t in der IDE und achte auf die Klammern

du musst die for zumachen und die setup. da fehlt was.

Jetzt bekomme ich keine Fehlermeldung mehr. Aber es wird IN Zeile 1 Hello World und in Zeile 2 Hallo Welt angezeigt. Was mache ich nur falsch ?

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); // diese Pins werden benutzt

const byte ANZAHL_PINS = 16;      // Anzahl der Eingangspins
const byte ersterPin = 22;        // ab welchen Pin gehts los?
byte pin[ANZAHL_PINS];

void setup(void)
{

  lcd.clear();      // LCD löschen
  lcd.begin(16, 2); // verfügbare Spalten und Zeilen

  lcd.setCursor(0, 0);       // 0. Spalte (= ganz links) und 0. Zeile (= oben)
  lcd.print("Hello World!");

  lcd.setCursor(0, 1);
  
  lcd.print("Hallo Welt!");


  Serial.begin(9600);
  Serial.println("\nStart");

  for (byte i = 0; i < ANZAHL_PINS; ++i)
  {
    pin[i] = ersterPin + i;             // Pinnummern einsortieren
    pinMode(pin[i], INPUT_PULLUP);      // und konfigurieren
  }
}  
  void loop(void)
  {
    // Pin nacheinander einlesen und ausgeben in einem Rutsch
    for (byte i = 0; i < ANZAHL_PINS; ++i)
    {
      Serial.print( digitalRead(pin[i]) );
    }

    // neue Zeile wegen Seriellen Monitor
    Serial.println();

    // bremst loop, sonst kann man schlecht lesen
    delay(100);
  }

macht genau was im Code steht. Würde nichts anderes erwarten!

jetzt änderst du noch im loop die for auf:

  lcd.setCursor(0, 0);
  for (byte i = 0; i < ANZAHL_PINS; ++i)
  {
    byte result = digitalRead(pin[i]); // in eine zwischenvariable einlesen damit verlässlich auf der Seriellen und am LCD der gleiche Werte angezeigt wird
    Serial.print( result );
    lcd.print(result)
  }

und drücke STRG-T!!!

Hi

Nichts?

Du sendest die beiden Hallo-Welt ans Display - danach aber Nichts mehr.

Wenn Du nun allerdings die Serial.print in lcd.print ...
Vll. vorher noch wieder auf ein Zeilenanfang den Cursor gesetzt ...

MfG

... genau, was Dir noiasca vorgebetet hat ... schade eigentlich ...