Keine Spannung auf Pins, wenn LCD angehängt [SOLVED]

Wieder Hallo,

Mein Zweites Problem heute... ich hoffe ich bin nicht zu aufdringlich :blush:.

Ich möchte einen ModbusMaster mit 6 LED´s, 4 Tastern und einem LCD Display(16x2 + I2C Adapter) betreiben.
Doch mir ist aufgefallen, dass wenn ich im Programm klar digitalWrite(3, HIGH); schreibe (und diesen Pin im Setup als OUTPUT definiert habe) nur ca. 1V Spannung an diesem Pin anliegen.
Das selbe wenn ich den LCD ausstecke.

Streiche ich jedoch im Programm den Code für den LCD, so liegen wieder 5V an wenn ich denn Pin auf HIGH setze.

Kann es sein, dass der Arduino überfordert ist? Ich habe gemessen, dass der LCD nur 20mA zieht... und das auf 5V und Gnd. Das sollte es normalerweise ja nichts geben.

Ich hoffe ihr könnt mir (heute wiedermal) helfen! Und wie immer schon Danke im Voraus an die, die sich mit meinen Problemen beschäftigen und Antworten schreiben!

Hier der Code, falls es daran liegt:

#include <ModbusRtu.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

/*  Modbus object declaration
   node id = 0 for master, = 1..247 for slave
   u8serno : serial port (use 0 for Serial)
   u8txenpin : 0 for RS-232 and USB-FTDI 
             or any pin number > 1 for RS-485 */

Modbus master(0,0,2); // this is master and RS-232 or USB-FTDI
modbus_t telegram[5];
unsigned long u32wait;
uint16_t au16data[16]; //!< data array for modbus network sharing
uint8_t u8state; //!< machine state
uint8_t u8query; //!< pointer to message query
int sprayungen;
int kg;
int kali;
int schalter;
int a = 0;
int maxwert ; 
int tasterplusZeit;
int tasterplusGedrueckt;
int tasterminusZeit;
int tasterminusGedrueckt;

//                    addr, en,rw,rs,d4,d5,d6,d7,bl,backligh-polarity
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 3, 4, 5, 6, 7, POSITIVE);

void setup() {
 lcd.begin(16, 2);
 lcd.backlight();
//         (Zeichen, Zeile)
   lcd.setCursor(0,0); 
 
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, INPUT);
 pinMode(10, INPUT);
 pinMode(11, INPUT);
 pinMode(12, INPUT);

 // telegram 0: read registers
 telegram[0].u8id = 3; // slave address
 telegram[0].u8fct = 3; // function code (this one is registers read)
 telegram[0].u16RegAdd = 0; // start address in slave
 telegram[0].u16CoilsNo = 6; // number of elements (coils or registers) to read
 telegram[0].au16reg = au16data; // pointer to a memory array in the Arduino

 //telegram 1: write a single register
 telegram[1].u8id = 1; // slave address
 telegram[1].u8fct = 6; // function code (this one is write a single register)
 telegram[1].u16RegAdd = 0; // start address in slave
 telegram[1].u16CoilsNo = 1; // number of elements (coils or registers) to read
 telegram[1].au16reg = au16data+6  ; // pointer to a memory array in the Arduino 

 telegram[0].u8id = 1; // slave address
 telegram[0].u8fct = 3; // function code (this one is registers read)
 telegram[0].u16RegAdd = 1; // start address in slave
 telegram[0].u16CoilsNo = 1; // number of elements (coils or registers) to read
 telegram[0].au16reg = au16data+7;
   
 telegram[3].u8id = 2; // slave address
 telegram[3].u8fct = 3; // function code (this one is registers read)
 telegram[3].u16RegAdd = 0; // start address in slaven 
 telegram[3].u16CoilsNo = 1; // number of elements (coils or registers) to read
 telegram[3].au16reg = au16data+8; // pointer to a memory array in the Arduino

 telegram[4].u8id = 2; // slave address
 telegram[4].u8fct = 10; // function code
 telegram[4].u16RegAdd = 1; // start address in slave
 telegram[4].u16CoilsNo = 2; // number of elements (coils or registers) to read
 telegram[4].au16reg = au16data+9; // pointer to a memory array in the Arduino
 
 master.begin( 115200 );
 master.setTimeOut( 1000 ); // if there is no answer in 1000 ms, roll over
 u32wait = millis() + 1000;
 u8state = u8query = 0; 

}

void loop(){

   digitalWrite(3, HIGH);

 switch( u8state ) {
 case 0: 
   if (millis() > u32wait) u8state++; // wait state
   break;
 case 1: 
   master.query( telegram[u8query] ); // send query (only once)
   u8state++;
 u8query++;
 if (u8query > 2) u8query = 0;
   break;
 case 2:
   master.poll(); // check incoming messages
   if (master.getState() == COM_IDLE) {  //IDLE = Leerlauf   
     u8state = 0;
     u32wait = millis() + 1000; 
   }
   break;
 }
 digitalWrite(3, au16data[0]);   //LED(3)
 digitalWrite(4, au16data[1]);
 digitalWrite(5, au16data[2]);
 digitalWrite(6, au16data[3]);
 digitalWrite(7, au16data[4]);
 digitalWrite(8, au16data[5]);
 
 au16data[6] = digitalRead(9);  //Sprayer(1)
 sprayungen = au16data[7]; //Spray-Zaehler
 
 kg = au16data[8];               //Waegezelle(2)

  if(digitalRead(10) == HIGH){
   tasterplusZeit = millis();     
   tasterplusGedrueckt = 1;       
 }

 if((millis() - tasterplusZeit > 100) && tasterplusGedrueckt == 1){
     au16data[9] += 1;             
     tasterplusGedrueckt = 0;     
   }

    if(digitalRead(11) == HIGH){
   tasterminusZeit = millis();    
   tasterminusGedrueckt = 1;      
 }

 if((millis() - tasterminusZeit > 100) && tasterminusGedrueckt == 1){
     au16data[9] -= 1;             
     tasterminusGedrueckt = 0;     
   }
 
 if(digitalRead(12) == HIGH){  //Tare
   au16data[10] = 1;
 }

 //maxwert berechnen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


 
 //LCD
 //lcd.clear();
 lcd.setCursor(0,0);

 if(stellen(kg) == 1){   //KG(derzeit)
   lcd.print("  ");
 }
 else if(stellen(kg) == 2){
   lcd.print(" ");
 }
 lcd.print(kg);
 lcd.print("kg");
 lcd.print("  max:");
 

 if(stellen(maxwert) == 1){   //KG(max)
   lcd.print(" ");
   lcd.print(maxwert);
 }
 else if(stellen(maxwert) == 2){
   lcd.print(maxwert);
 }
 lcd.print(maxwert);
 lcd.print("kg");
 lcd.setCursor(0,1);

 
 if(stellen(sprayungen) == 1){  //Sprayungen
   lcd.print("    ");
 }
 else if(stellen(sprayungen) == 2){
   lcd.print("   ");
 }
 else if(stellen(sprayungen) == 3){
   lcd.print("  ");
 }
 else if(stellen(sprayungen) == 4){
   lcd.print(" ");
 }                                                 
 lcd.print(sprayungen);
 lcd.print(" Sprayungen");    
}


 int stellen(int x){
   if ( x < 10 )
     return 1;
   else if ( x < 100 )
     return 2;
   else if ( x < 1000 )
     return 3;
   else if ( x < 10000)
     return 4;
 }

Dann sag uns doch mal, welchen Inhalt die Variable "au16data[0]" hat, die bestimmt doch welcher Level an Pin 3 anliegt.

Die wird von einem anderen Microcontroller mit Tastern über ModBus gesteuert.
Diesen habe ich aber schon einmal getestet und dieser hat mit dem Master auch funktioniert, bevor ich den LCD integriert habe.
Jedoch habe ich das selbe Problem, wenn ich in die Loop direkt digitalWrite(3, HIGH); schreibe.

Poste doch mal Deinen Schaltplan!
6 LEDs? Was sind das für LEDs? Welche Vorwiderstände?
Wie sieht die Spannungsversorgung aus?

Entschuldige... durch deine vorherige Antwort hab ich mir es noch einmal angeschaut.
Ich habe vorher vergessen das digitalWrite(3, au16data[0]); auszukommentieren.
...
Wüsstest du trotzdem eine Lösung, denn bevor ich den LCD integriert habe, funktionierte es.

Schaltpläne habe ich auf dem Computer noch nie gezeichnet... könntest du mir evtl. ein Programm empfehlen?

Du kannst die Schaltpläne auch mit Stift und Papier zeichen und dann einscannen oder fotografieren.

LowTech funktioniert immer noch :wink: :wink:
Grüße Uwe

Das ist der Code des ModBus Slaves. Den Schaltplan zeichne ich noch. Ich mache normal keine Schaltpläne von meinen Projekten... Ich weiß, dass man es tun sollte. Deswegen habe ich auch oft Schlampigkeitsfehler :-\ . Ich möchte mir einen schöneren Stil Projekte anzugehen angewöhnen!

#include <SoftwareSerial.h>
#include <SimpleModbusSlaveSoftwareSerial.h>

enum{     
  LED_1,
  LED_2,
  LED_3,
  LED_4, 
  LED_5,
  LED_6
};
unsigned int holdingRegs[6];

void setup() {
  modbus_configure(115200, 3, 2, 6);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(8, INPUT);
}

void loop() {
  holdingRegs[0] = digitalRead(3);
  holdingRegs[1] = digitalRead(4);
  holdingRegs[2] = digitalRead(5);
  holdingRegs[3] = digitalRead(6);
  holdingRegs[4] = digitalRead(7);
  holdingRegs[5] = digitalRead(8);
  modbus_update(holdingRegs);
}

Leider ist dein Sketch für dritte ein wenig unübersichtlich.

Daher noch die Frage, was hast du an die serielle Schnittstelle angeschlossen.
Welche Pins nutzt du dafür?
Wie hast du das Display angeschlossen?

dasrogl:
Das ist der Code des ModBus Slaves. Den Schaltplan zeichne ich noch. Ich mache normal keine Schaltpläne von meinen Projekten... Ich weiß, dass man es tun sollte. Deswegen habe ich auch oft Schlampigkeitsfehler :-\ . Ich möchte mir einen schöneren Stil Projekte anzugehen angewöhnen!

Das solltest du unbedingt machen, dadurch wird die Fehlersuche einfacher.

Hier der angekündigte Schaltplan... Ich weis er ist nicht schön ... Ich muss noch lernen. :wink:

Schaltbild ist nicht super, aber ok. :wink:
Wenn du alle Module aus den 5 Volt des Arduino betreibst, kann das ohne weiteres zu viel für den Onboard-Regler sein.

Eine andere Idee habe ich aktuell nicht.
Nimm mal die Spannung für die Displaybeleuchtung weg.
Edit
Das mit der Parallelschaltung der Leds an der Katode ist keine gut Lösung, damit werden die dunkler, je mehr an sind.

Bezülich Deines Schaltplans:

  • 5V an Vin sind zu wenig Da braucht es mindestens 7V.
  • Alle Taster/Schalter brauchen Pulldownwiderstände
  • Alle LED brauchen Vorwiderstände; Jedes seinen eigenen.
  • Bist Du sicher daß die Hintergrundbeleuchtung des Displays keinen Vorwiderstand braucht?
  • Der 5V Spannungsstabilisator auf dem Arduino kann nicht genug Strom für alles liefern.

Grüße Uwe

Zu uwefed:

1.Zu dem Vin ich habe ihn einfach an USB gehängt ... also denk dir, dass es an 5v ist.
2.Hat doch der Arduino meines Wissens integrierte Pull-Down Widerstände.
3.Ok. Ich wollte wieder mal meinen inneren Sparfuchs beruhigen ;).
4. Später werde ich ehh einen 12v auf 5v Festspannungsregler benutzen. Ich probier es morgen sobald ich kann mit diesem. Bei einem anderen Slave habe ich einfach nen 1000µF Elko drangesteckt und es ging :wink:

Zu HotSystems:

1.Wie gesagt probiere ich es morgen gleich mit einem Festspannungsregler.
2.Also einfach lcd.noBacklight(); im Programm (wegen I2C Adapter)?
3. Meinen inneren Sparfuchs habe ich auch bereits erwähnt. Danke für die Erklärung warum die Parallelschaltung schlecht ist!

ACHTUNG: Gefährliches Halbwissen in den Antworten enthalten! Ich übernehme keine Haftung für Verletzen von sich auf den Kopfklatschenden! ;D
An euch beide nochmal extra danke, dass ihr eure Zeit für mich aufopfert!

Ja, "nobacklight" sollte funktionieren.
Den zusätzlichen Hinweis von Uwe solltest du berücksichtigen.
Es gibt tatsächlich Displays die keinen Vorwiderstand für die Beleuchtung haben. Das solltest du zusätzlich prüfen.

dasrogl:
Zu uwefed:

1.Zu dem Vin ich habe ihn einfach an USB gehängt ... also denk dir, dass es an 5v ist.
2.Hat doch der Arduino meines Wissens integrierte Pull-Down Widerstände.
3.Ok. Ich wollte wieder mal meinen inneren Sparfuchs beruhigen ;).
4. Später werde ich ehh einen 12v auf 5v Festspannungsregler benutzen. Ich probier es morgen sobald ich kann mit diesem. Bei einem anderen Slave habe ich einfach nen 1000µF Elko drangesteckt und es ging :wink:

  1. Es ist egal von wo die 5V kommen ; An Vin braucht es mindestens 7V.
  2. Nein, der Kontroller hat interne Pullup-Widerstände.

Zu HotSystems:

1.Wie gesagt probiere ich es morgen gleich mit einem Festspannungsregler.
2.Also einfach lcd.noBacklight(); im Programm (wegen I2C Adapter)?
3. Meinen inneren Sparfuchs habe ich auch bereits erwähnt. Danke für die Erklärung warum die Parallelschaltung schlecht ist!

ACHTUNG: Gefährliches Halbwissen in den Antworten enthalten! Ich übernehme keine Haftung für Verletzen von sich auf den Kopfklatschenden! ;D
An euch beide nochmal extra danke, dass ihr eure Zeit für mich aufopfert!

Wenn die Hintergrundbeleüchtung für 5V spezifiziert ist dann braucht es keinen Vorwiderstand. Bei 4,2V schon.

Grüße Uwe

uwefed:
2) Nein, der Kontroller hat interne Pullup-Widerstände.

Die aber im Setup speziell konfiguriert werden.

Zum Display: (das steht auf der Website)

Displays - LCD-Modul 16x2 HD44780 schwarz auf weiß
LCD-Modul mit 16x2 Zeichen.

Farbe: schwarz mit weißer Hintergrundbeleuchtung

Das Display besitzt einen HD44780-kompatiblen Controller und kann somit direkt über 4- oder 8-Bit angesteuert werden.

Versorgungsspannung: 5V

Abmessungen: 80mm x 36mm x 11,5mm

Zeichengröße: 2,95mm x 5,15mm

Stromaufnahme: 1,5mA (ohne Hintergrundbeleuchtung)

uwefed:

  1. Es ist egal von wo die 5V kommen ; An Vin braucht es mindestens 7V.

Wie funktioniert es dann bei USB mit 5V? ... einfach Stecker dran und angehängt... hab es auch mit 2A Netzteil versucht

Ich habe ausprobiert:

  1. 9-12V mit Labornetzteil an Vin (der Spannungsregler am Arduino wurde ein bisschen warm)
  2. 5V mit Labornetzteil an 5V-Pin

Hat nicht funktioniert... Das heißt: an der Spannungsversorgung liegt es nicht :confused:

Den Attiny-Teil der Schaltung habe ich noch einmal getestet (mit qModMaster am Computer und RS485 Adapter). Das bedeutet der Fehler liegt in der Arduino Uno (Master) Schaltung.

Hier ein Code nur mit LED´s ... geht auch nicht

#include <ModbusRtu.h>

uint16_t au16data[16]; //!< data array for modbus network sharing
uint8_t u8state; //!< machine state
uint8_t u8query; //!< pointer to message query


/*  Modbus object declaration
    node id = 0 for master, = 1..247 for slave
    u8serno : serial port (use 0 for Serial)
    u8txenpin : 0 for RS-232 and USB-FTDI 
              or any pin number > 1 for RS-485 */
 
Modbus master(0,0,2); // this is master and RS-232 or USB-FTDI

modbus_t telegram[3];

unsigned long u32wait;

void setup() {
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  
  // telegram 0: read registers
  telegram[0].u8id = 3; // slave address
  telegram[0].u8fct = 3; // function code (this one is registers read)
  telegram[0].u16RegAdd = 0; // start address in slave
  telegram[0].u16CoilsNo = 6; // number of elements (coils or registers) to read
  telegram[0].au16reg = au16data; // pointer to a memory array in the Arduino

 
  master.begin( 115200 );
  master.setTimeOut( 1000 ); // if there is no answer in 1000 ms, roll over
  u32wait = millis() + 1000;
  u8state = u8query = 0; 
}

void loop() {
  
  switch( u8state ) {
  case 0: 
    if (millis() > u32wait) u8state++; // wait state
    break;
  case 1: 
    master.query( telegram[u8query] ); // send query (only once)
    u8state++;
  u8query++;
  if (u8query > 2) u8query = 0;
    break;
  case 2:
    master.poll(); // check incoming messages
    if (master.getState() == COM_IDLE) {  //IDLE = Leerlauf   
      u8state = 0;
      u32wait = millis() + 1000; 
    }
    break;
  }

    digitalWrite(3, au16data[0]);
    digitalWrite(4, au16data[1]);
    digitalWrite(5, au16data[2]);
    digitalWrite(6, au16data[3]);
    digitalWrite(7, au16data[4]);
    digitalWrite(8, au16data[5]);

    au16data[6] = digitalRead(10);
  
}

Eigentlich kann ich mich erinnern, dass es mit diesem Code schon einmal ging... Geh jetzt aber auch nicht:

 #include <SimpleModbusMaster.h>

enum{LED1};       
Packet packets[1];     
unsigned int regs[1];


void setup(){              
  pinMode(3, OUTPUT); 


  modbus_construct(&packets[LED1], 3, READ_HOLDING_REGISTERS, 0, 1, 0);
  modbus_configure(&Serial, 115200, SERIAL_8N2, 1000, 100, 100, 2, packets, 1, regs);  
}

void loop(){                 
  digitalWrite(3, regs[0]);
    modbus_update();
}

Dann solltest du die Schaltung erneut Aufbauen, da ist bestimmt irgendwo ein Schaltfehler.
Und als erstes würde ich versuchen, das Display zum Laufen zu bringen
Also nur des Code, der das Display betrifft.

dasrogl:
Zum Display: (das steht auf der Website)

Da fehlt leider der notwendige Angabe mit welcher Spannung die Hintergrundbeläuchtung funktioniert. Schalte mal einen 68 Ohm Widerstand in serie zur Hintergrundbeleuchtung.

Wie funktioniert es dann bei USB mit 5V? ... einfach Stecker dran und angehängt... hab es auch mit 2A Netzteil versucht

5V über USB ist ja in Ordnung.
Du hast auf dem Schaltplan die 5V aber mit dem Pin "Vin" verbunden und das geht nicht. Das habe ich Dir gesagt.

Grüße Uwe