Ich baue die Schaltung heute nochmal auf, aber bin sehr beschäftigt.
Eventuell komme ich erst am Abend dazu.
Du solltest auf jeden Fall auch ein Auge auf die LEDs werfen.
6 Standard-LEDs mit jeweils 20mA sind evtl. auch für den Arduino schon zuviel (Gesamtlast bei gleichzeitigem leuchten).
Wenn Du die Vorwiderstände pro LED einfügst. Mit Deiner bisherigen Schaltung überlastest Du nicht nur den Arduino, sondern auch die LEDs.
Entweder den Vorwiderstand auf ca. 470 Ohm (pro LED) erhöhen, sodass ca. 10mA pro LED verwendet werden oder gleich "Low-Current-LEDs" verwenden. Die brauchen nur rund 2mA. Dann kannst Du die Vorwiderstände auf 2.7 kOhm erhöhen.
dasrogl:
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)
Bei Angaben zu Beiteilen ist ein Link zur Webseite immer besser.
Ich habe ausprobiert:
- 9-12V mit Labornetzteil an Vin (der Spannungsregler am Arduino wurde ein bisschen warm)
- 5V mit Labornetzteil an 5V-Pin
Hat nicht funktioniert... Das heißt: an der Spannungsversorgung liegt es nicht
Hast du denn auch mal die 5 Volt direkt am Arduino gemessen?
Hier können schnell Fehler durch schlechte Kabel oder schlechten Kontakt entstehen.
GND nicht richtig verbunden.
slartibartfast:
Du solltest auf jeden Fall auch ein Auge auf die LEDs werfen.
6 Standard-LEDs mit jeweils 20mA sind evtl. auch für den Arduino schon zuviel (Gesamtlast bei gleichzeitigem leuchten).
Wenn Du die Vorwiderstände pro LED einfügst. Mit Deiner bisherigen Schaltung überlastest Du nicht nur den Arduino, sondern auch die LEDs.
Entweder den Vorwiderstand auf ca. 470 Ohm (pro LED) erhöhen, sodass ca. 10mA pro LED verwendet werden oder gleich "Low-Current-LEDs" verwenden. Die brauchen nur rund 2mA. Dann kannst Du die Vorwiderstände auf 2.7 kOhm erhöhen.
Warum überlaste ich die LED´s und den Arduino?
Die LED´s, welche ich habe zumindest, sind für 2,25V/20mA und wenn ich eine externe Spannungsversorgung benutze überlaste ich den Arduino auch nicht. Ein höherer Widerstand wäre doch eigentlich dumm, da er die überschüssige Energie ja in Wärme umwandelt und die LED dadurch nicht mehr so hell ist, oder?
Hier die Links HotSystems:
Die 5 Volt mess ich jetzt gleich. Danke für den Tipp
dasrogl:
Warum überlaste ich die LED´s und den Arduino?Die LED´s, welche ich habe zumindest, sind für 2,25V/20mA und wenn ich eine externe Spannungsversorgung benutze überlaste ich den Arduino auch nicht. Ein höherer Widerstand wäre doch eigentlich dumm, da er die überschüssige Energie ja in Wärme umwandelt und die LED dadurch nicht mehr so hell ist, oder?
Der Strom fließt auch durch den Controller. Jeder Ausgang sollte nicht mit mehr als 20 mA belastet werden, insgesamt nicht mehr als 200 mA.
Du kannst für die Leds ruhig ein etwas größeren Widerstand nehmen, so schnell werden die nicht merklich dunkler und das mit der Wärme ist in diesem Fall vernachlässigbar.
Die Teile sind ok. Ist ein Standard LCD und ein ebenso guter I2C-Adapter.
Wenn du das Display richtig angeschlossen hast, sollte es funktionieren.
Bitte prüfe auch, ob die Led für das Display einen Vorwiderstand hat, hatte ich schon geschrieben.
Alles neu aufgebaut. Led Modul wieder getestet. Geht. Aber der Master lest den Wert des Slaves nicht aus... Warum?!
dasrogl:
Alles neu aufgebaut. Led Modul wieder getestet. Geht. Aber der Master lest den Wert des Slaves nicht aus... Warum?!
Da fällt uns die Antwort schwer..
Alle Verbindungen erneut prüfen. ![]()
dasrogl:
Alles neu aufgebaut. Led Modul wieder getestet. Geht. Aber der Master lest den Wert des Slaves nicht aus... Warum?!
Irgendein Fehler??
dasrogl:
Warum überlaste ich die LED´s und den Arduino?Die LED´s, welche ich habe zumindest, sind für 2,25V/20mA und wenn ich eine externe Spannungsversorgung benutze überlaste ich den Arduino auch nicht. Ein höherer Widerstand wäre doch eigentlich dumm, da er die überschüssige Energie ja in Wärme umwandelt und die LED dadurch nicht mehr so hell ist, oder?
LED haben keinen linearen Widerstand sondern der Widerstand wächst logaritmisch.
Wenn Du LED mit 2,25V Durchlaßspannung bei 20mA an 5V anschließt dann fließen nicht 40mA sondern über 200-300mA (geschätzt)
Am Arduino fließen dann nicht 200mA sondern ca 80 mA, weil der Ausgangstransistor nicht niederohmig genug ist, damit mehr fließen. Die Spannung von ca 2V (am Led werden Schätzungsweise 3V sein) bei 80 mA also 160mW werdem in der Ausgangsstufe des Kontrollers verbraten. Es ist nicht so, daß wenn Du keinen Vorwiderstand montierst, keine Verlustleistung erzeugt wird. Diese 160mW heizen den Kontroller. Bei 6 LED sind das dann fast 1W. Dass überfordert den Kontroller der soviel Abwärme nicht über das Gehäuse ableiten kann.
Darum braucht es UMBEDINGT einen Vorwiderstand in serie der LED (oder eine andere Vorrichtung zB Konstantstromquelle) der/die den Strom durch die LED begrenzt.
Grüße Uwe
Ich weis, dass man einen Vorwiderstand braucht. Ich meinte nur halt nicht mit zu großem.
Das LED-Modul geht nun wieder. Fehler im Code (2x Telegram[0]).
Aber dafür ein anderer Slave(2) nicht. An diesem hängt ein hx711 Wägezellenverstärker und unabhängig vom Master würde es (wie das LED-Modul) auch gehen. Im Master Code sieht man ihn bei au16data[8-10]
EDIT: Zeile "master.query(telegram[3]);" eingefügt und geht.
Ich hab nur noch ein kleines Problem. Der maxwert soll (wenn er nicht nochmal steigt) 15s lang angezeigt werden und dann wieder verschwinden. Das funktioniert bei mir auch, aber nach dem 2. Mal bleibt der maxwert dann auf 0.
Hier nochmal der neue Code:
#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 zeithilfe;
int tasterplusZeit;
int tasterplusGedrueckt;
int tasterminusZeit;
int tasterminusGedrueckt;
// addr, en,rw,rs,d4,d5,d6,d7,bl,backlight-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[2].u8id = 1; // slave address
telegram[2].u8fct = 3; // function code (this one is registers read)
telegram[2].u16RegAdd = 1; // start address in slave
telegram[2].u16CoilsNo = 1; // number of elements (coils or registers) to read
telegram[2].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 write
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(){
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;
}
master.poll();
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
master.query(telegram[3]);
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;
}
if(kg >= maxwert){
maxwert = kg;
zeithilfe = millis();
}
if(millis() - zeithilfe > 15000 && kg <= maxwert){
maxwert = 0;
zeithilfe = millis();
}
//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(" ");
}
else if(stellen(maxwert) == 2){
lcd.print(" ");
}
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;
}
EDIT2:
au16data[9] & au16data[10] funktionieren auch noch nicht
dasrogl:
Ich weis, dass man einen Vorwiderstand braucht. Ich meinte nur halt nicht mit zu großem.
Auch mit einem 10kOhm Widerstand sieht man die LED leuchten.
Ich würde Widerstände für 5-10mA wählen.
Grüße Uwe
Ok danke uwefed.
So zum derzeitigen Stand:
Das LED-Modul funktioniert. (auch mit ModBus-Master)
Das Wägezellen-Modul funktioniert, aber ich kann nur das Gewicht auslesen und die zwei anderen Werte (von digitalRead) 10&11,12 nicht schreiben. Diese brauche ich zum kalibrieren und tarieren der Waage von der Steuerungseinheit aus.
Zusätzlich funktioniert die maxwert Funktion nur 2x. Dann setzt der Wert sich dauerhaft auf 0