RS485 Kommunikation

So eine klein Projektvorstellung.
Ich werde meine Wohnung mit einem kleinen Hausbusystem ausstatten. Das Grundgerüst steht.
Ich habe eine Master Arduino Nano mit einem 5110 Display ausgerüstet und ein kleines Menu gebastelt.
Zudem habe ich noch zwei Slaves (im Moment schaltet sie nur ausgänge).
Am Ende wird ein Slave im Keller sein der unsere Wärmepumpe überwacht (5Temperaturen über MAX127, und Laufzeit der Hz.) und den Zähler unserer Wohnung überwacht. Das alles wird dann in dann bei Anfrage des Masters zu dem gesendet.
Dann kommen in beide Fußbodenheizungsverteiler je ein Slave zum Ansteuern der einzelnen Räume.#
Die Slaves werden noch auf attiny84 portieren, da ich die Performance der ATMEGA328 auf den Slaves nicht brauche.
Für die Teste war auch je 20m Kabel zwischen den Slaves bzw Master und Slaves. Abschlußwiderstand 220Ohm je Seite
Hier mal eine kleines Vorabvideo.
Die RS 485 Lib ist von einem User hier aus dem Forum:
http://www.gammon.com.au/forum/?id=11428
Die Hardware:
2
Arduino nano V3
1freeduino nano
3
SN75176 RS232=>RS485 Wandler
1*LCD Shield 5110 von nuelectronics

P1040080.MOV (3.04 MB)

Codes:
Master:

#include <nokia_3310_lcd.h>
#include "WConstants.h"
#include <NewSoftSerial.h>
#include "RS485_protocol.h"

#define ENABLE_PIN 4      // Enable Pin (High= Senden aktiv LOW empsfanen aktiv

int RINT1,RINT2,RINT3,Wert=0;
boolean links,hoch,rechts,runter,cbut,clock,lastclock=false;
boolean L1,L2,L3=true;
boolean lrechts=false;
boolean Send=false;
unsigned long pm1;
unsigned long pm2;
byte ref1=100;
byte ref2=33;
byte State,page,line,ebene,ebeneold=0;
byte Adresse=1;
byte AdresseSlave=0;
byte sndbuffer [4];                              // Buffer für Daten max 20 Byte

void fWrite (const byte what)                // Handler für RS485 Lib
{
  rs485.print (what);  
}

int fAvailable ()
{
  return rs485.available ();  
}

int fRead ()
{
  return rs485.read ();  
}

Nokia_3310_lcd lcd=Nokia_3310_lcd();
NewSoftSerial rs485 (2, 3);  // Initalisierung SoftSerial für RS485  (receive pin, transmit pin)


void setup (){
  lcd.LCD_3310_init();  //Display Intialiseiern
  lcd.LCD_3310_clear();  // Display löschen
  // Serial.begin(9600);
  rs485.begin(9600);
  pinMode (ENABLE_PIN, OUTPUT);  // Pin als Ausgang setzten
}

byte msg[4];

void loop(){
  if (millis()-pm2 > ref2){
    pm2=millis();
    lcd.LCD_3310_clear();  // Display löschen
  }
  if (millis()-pm1 > ref1){
    pm1=millis();
    clock = !clock;
  }
  if (clock==true){
    key_in();
    key();
  }
  if(rechts==true&&lrechts==false){ 
   if (page==0)
    page=line+1;
   
    lrechts=true;
    line=0;
  }
  if (links==true){
    page=0;
  }
  switch (page){
  case 0:
    Menu();
    break;
  case 1:
    Seite1();
    break;
  case 2:
    Seite2();
    break;
  case 3:
    Seite3();
    break;  
  case 4:
    Seite4();
    break;  
  case 5:
    Seite5();
    break;
  case 6:
    Seite6();
    break;
  }

  if (line <=0){
    line=0;
  }
  if (line >=5){
    line=5;
  }

  if(Send==true){                              // Senden der Anforderung
    // Buffer für Daten max 20 Byte
    msg[0]=AdresseSlave;                      // Adresse vom Slave
    msg[1]=0xAA;                               // Anfoderung Daten Senden BIN 1010101=0xf
     digitalWrite(ENABLE_PIN,HIGH);            // Treiber Aktivieren
    sendMsg (fWrite, msg, sizeof msg);        // Daten Senden
    digitalWrite(ENABLE_PIN,LOW);             // Treiber deaktiviern Empfänger akvivieren
    Send=false;
  }
}

/* byte received = recvMsg (fAvailable, fRead, buf, sizeof (buf) - 1,50);
 if (received)
 {
 if (buf [0] != Adresse)        // Ist das meine Adresse
 return;  // not my device
 RINT1=(buf[1]<<8)|(buf[2]);    // Zusammensetzten des Empfangenen Bytes
 RINT2=(buf[3]<<8)|(buf[4]);
 RINT3=(buf[5]<<8)|(buf[6]);
 }
 */


void key(){
  if (State==1 && links==false){                    //links
    links=true;
    if (ebene>=1){
      ebene=ebene--;
    }  
  }
  if (State==3 && rechts==false){                    //rechts
    rechts=true;
    if (ebene<=1){
      ebene=ebene++;
    }
  }
  if (State==2 && hoch==false){                    // Hoch
    line=line--;
    hoch=true;
  }
  if (State==4 && runter==false){                    // Runter
    line=line++;
    runter=true;
  }
  if (State==5 && cbut==false){
    if (page==2){
      AdresseSlave=1;
      if (line==0){
        L1=!L1;
        msg[2]=12;  // Ausgang am Slave
        msg[3]=L1;  // Status des Ausgang
        Send=true;  
      }
      if (line==1){
        L2=!L2;
        msg[2]=11;   // Ausgang am Slave
        msg[3]=L2;   // Status des Ausgangs
        Send=true;  
      }
    }
    if (page==3){
      AdresseSlave=2;
      if (line==0){
        L3=!L3;   
        msg[2]=12;   // Ausgang am Slave
        msg[3]=L3;   // Status des Ausgangs
        Send=true;
      }
    }
    cbut=true;
  }
  if (State==0){
    links=false;
    hoch=false;
    rechts=false;
    runter=false;
    cbut=false;
    lrechts=false;
  }
}

void key_in(){
  Wert=analogRead(A0);
  if (Wert<20)
    State=1;                            //links                                                            //Links
  if (Wert<550 && Wert>475)
    State=2;                            //oben                             //Oben
  if (Wert<780 && Wert>650)
    State=3;                            //rechts                            //Rechts
  if (Wert<370 && Wert>300)
    State=4;                            //unten                          // Unten
  if (Wert>980)
    State=0;                            // nichts
  if (Wert<200 && Wert>100)
    State=5;                            // Gedrückt
}

Tab2:

void Menu(){
  lcd.LCD_3310_write_string(0,line,">",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,0,"Master",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,1,"Slave1",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,2,"Slave2",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,3,"Seite 4",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,4,"Seite 5",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,5,"Seite 6",MENU_NORMAL);
}


void Seite1(){
  lcd.LCD_3310_write_string(0,0,"RS485 Test",MENU_NORMAL);
  lcd.LCD_3310_write_string(0,1,"Master bin ",MENU_NORMAL);
  lcd.LCD_3310_write_string(0,2,"ICH ICH ICH",MENU_NORMAL);
}

void Seite2(){
  lcd.LCD_3310_write_string(0,line,">",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,0,"LED rt",MENU_NORMAL);
  if (L1==true)
    lcd.LCD_3310_write_string(50,0,"Ein",MENU_HIGHLIGHT);
  else
    lcd.LCD_3310_write_string(50,0,"Aus",MENU_NORMAL); 
  lcd.LCD_3310_write_string(6,1,"LED gn",MENU_NORMAL);
  if (L2==true)
    lcd.LCD_3310_write_string(50,1,"Ein",MENU_HIGHLIGHT);
  else
    lcd.LCD_3310_write_string(50,1,"Aus",MENU_NORMAL);  
  lcd.LCD_3310_write_string(6,5," Slave 1 ",MENU_NORMAL);
}

void Seite3(){
  lcd.LCD_3310_write_string(0,line,">",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,0,"LED rt",MENU_NORMAL);
  if (L3==true)
    lcd.LCD_3310_write_string(50,0,"Ein",MENU_HIGHLIGHT);
  else
    lcd.LCD_3310_write_string(50,0,"Aus",MENU_NORMAL);   

  lcd.LCD_3310_write_string(6,5," Slave 2 ",MENU_NORMAL);
}

Und dann noch die Slaves 1+2.
Sind gleich bis auf die Adresse:

#include "WConstants.h"
#include "RS485_protocol.h"
#include <NewSoftSerial.h>

#define ENABLE_PIN  4
#define LED 13


NewSoftSerial rs485 (2, 3);  // receive pin, transmit pin

// callback routines

void fWrite (const byte what)
{
  rs485.print (what);  
}

int fAvailable ()
{
  return rs485.available ();  
}

int fRead ()
{
  return rs485.read ();  
}

void setup()
{
  rs485.begin (9600);
  pinMode (ENABLE_PIN, OUTPUT);  // driver output enable
  pinMode (LED, OUTPUT);  // built-in LED
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
}  // end of setup


void loop()
{
  byte buf [10];                              // Buffer für Daten max 10 Byte
  byte received = recvMsg (fAvailable, fRead, buf, sizeof (buf) - 1,50);
  if (received){
    if (buf [0] != 2)
      return;  // not my device
    digitalWrite(buf[2],buf[3]);
  }

}

Hallo,

kann es sein das der Code nicht unter der Arduino 1.0.1 Software läuft? Oder liegt es daran das ich die Tab2 anderes einfügen muss? Ich habe den Code am Ende des eigentlichen Master Codes angehängt.

Gruss MX738

Das war unter der 0023 habe es mit 1.0 versucht bin dann auf der 0023 geblieben. Habe es jetzt aber für die 1.0.1 geändert (es gibt eine NewSoftSerial) die heisst jet Software Serial.
Hier der Code der 1.0.1 läuft denke auch das der unter 1.0 läuft da habe ich aber probleme mit I2C die bei der 1.0.1 behoben sind

#include <nokia_3310_lcd.h>
#include "Arduino.h"
#include <SoftwareSerial.h>
#include "RS485_protocol.h"

#define ENABLE_PIN 4      // Enable Pin (High= Senden aktiv LOW empsfanen aktiv

int RINT1,RINT2,RINT3,Wert=0;
boolean links,hoch,rechts,runter,cbut,clock,lastclock=false;
boolean L1,L2,L3,L4=false;
boolean lrechts=false;
boolean Anfrage,Send,bereit=false;
unsigned long pm1;
unsigned long pm2;
byte ref1=100;
byte ref2=33;
byte State,page,line,ebene,ebeneold=0;
byte Adresse=1;
byte AdresseSlave=0;
byte msg[4];
int WertSlave1=0;
int WertSlave2=0;



Nokia_3310_lcd lcd=Nokia_3310_lcd();
SoftwareSerial rs485 (2, 3);  // Initalisierung SoftSerial für RS485  (receive pin, transmit pin)

void fWrite (const byte what)
{
  rs485.write (what);  
}

int fAvailable ()
{
  return rs485.available ();  
}

int fRead ()
{
  return rs485.read ();  
}


void setup (){
  lcd.LCD_3310_init();  //Display Intialiseiern
  lcd.LCD_3310_clear();  // Display löschen
  rs485.begin(9600);
  pinMode (ENABLE_PIN, OUTPUT);  // Pin als Ausgang setzten
}


void loop(){
  if (bereit==true){
    byte buf [10];                              // Buffer für Daten max 20 Byte
    byte received = recvMsg (fAvailable, fRead, buf, sizeof (buf) - 1,25);
    if(received){        // Was empangen dann empfansbereitschaft aus
      bereit=false;
    }  
  }
  if (millis()-pm2 > ref2){
    pm2=millis();
    lcd.LCD_3310_clear();  // Display löschen
  }
  if (millis()-pm1 > ref1){
    pm1=millis();
    clock = !clock;
  }
  if (clock==true){
    key_in();
    key();
  }
  if(rechts==true&&lrechts==false){ 
    if (page==0)
      page=line+1;
    if (line==4){
      Anfrage=true;
      AdresseSlave=1;
    }
    if (line==5){
      Anfrage=true;
      AdresseSlave=2;
    }
    lrechts=true;
    line=0;
  }
  if (links==true){
    page=0;
  }
  switch (page){
  case 0:
    Menu();
    break;
  case 1:
    Seite1();
    break;
  case 2:
    Seite2();
    break;
  case 3:
    Seite3();
    break;  
  case 4:
    Seite4();
    break;  
  case 5:
    Seite5();
    break;
  case 6:
    Seite6();
    break;
  }

  if (line <=0){
    line=0;
  }
  if (line >=5){
    line=5;
  }

  if(Send==true){                              // Senden der Anforderung
    msg[0]=AdresseSlave;                      // Adresse vom Slave
    if(Anfrage=true){
      msg[1]=0xAA;                               // Anfoderung Daten Senden BIN 1010101=0xf
      bereit=true;  
    }
    else
      msg[1]=0x00;
    digitalWrite(ENABLE_PIN,HIGH);            // Treiber Aktivieren
    sendMsg (fWrite, msg, sizeof msg);        // Daten Senden
    digitalWrite(ENABLE_PIN,LOW);             // Treiber deaktiviern Empfänger akvivieren
    Send=false;
  }
}



void key(){
  if (State==1 && links==false){                    //links
    links=true;
    if (ebene>=1){
      ebene=ebene--;
    }  
  }
  if (State==3 && rechts==false){                    //rechts
    rechts=true;
    if (ebene<=1){
      ebene=ebene++;
    }
  }
  if (State==2 && hoch==false){                    // Hoch
    line=line--;
    hoch=true;
  }
  if (State==4 && runter==false){                    // Runter
    line=line++;
    runter=true;
  }
  if (State==5 && cbut==false){
    if (page==2){
      AdresseSlave=1;
      if (line==0){
        L1=!L1;
        msg[2]=12;  // Ausgang am Slave
        msg[3]=L1;  // Status des Ausgang
        Send=true;  
      }
      if (line==1){
        L2=!L2;
        msg[2]=11;   // Ausgang am Slave
        msg[3]=L2;   // Status des Ausgangs
        Send=true;  
      }
    }
    if (page==3){
      AdresseSlave=2;
      if (line==0){
        L3=!L3;   
        msg[2]=0;   // Ausgang am Slave
        msg[3]=L3;   // Status des Ausgangs
        Send=true;
      }
      if (line==1){
        L4=!L4;
        msg[2]=1;   // Ausgang am Slave
        msg[3]=L4;   // Status des Ausgangs
        Send=true;  
      }  
    }
    cbut=true;
  }
  if (State==0){
    links=false;
    hoch=false;
    rechts=false;
    runter=false;
    cbut=false;
    lrechts=false;
  }
}

void key_in(){
  Wert=analogRead(A0);
  if (Wert<20)
    State=1;                            //links                                                            //Links
  if (Wert<550 && Wert>475)
    State=2;                            //oben                             //Oben
  if (Wert<780 && Wert>650)
    State=3;                            //rechts                            //Rechts
  if (Wert<370 && Wert>300)
    State=4;                            //unten                          // Unten
  if (Wert>980)
    State=0;                            // nichts
  if (Wert<200 && Wert>100)
    State=5;                            // Gedrückt
}

und der tab 2 (Displayseiten)

void Menu(){
  lcd.LCD_3310_write_string(0,line,">",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,0,"Master",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,1,"MegaSlave",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,2,"Attiny",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,3,"Mega Istwert",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,4,"Tiny Istwert",MENU_NORMAL);
  //lcd.LCD_3310_write_string(6,5,"Seite 6",MENU_NORMAL);
}


void Seite1(){
  lcd.LCD_3310_write_string(0,0,"RS485 Test",MENU_NORMAL);
  lcd.LCD_3310_write_string(0,1,"Master bin ",MENU_NORMAL);
  lcd.LCD_3310_write_string(0,2,"ICH ICH ICH",MENU_NORMAL);
}

void Seite2(){
  lcd.LCD_3310_write_string(0,line,">",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,0,"LED rt",MENU_NORMAL);
  if (L1==true)
    lcd.LCD_3310_write_string(50,0,"Ein",MENU_HIGHLIGHT);
  else
    lcd.LCD_3310_write_string(50,0,"Aus",MENU_NORMAL); 
  lcd.LCD_3310_write_string(6,1,"LED gn",MENU_NORMAL);
  if (L2==true)
    lcd.LCD_3310_write_string(50,1,"Ein",MENU_HIGHLIGHT);
  else
    lcd.LCD_3310_write_string(50,1,"Aus",MENU_NORMAL);  
  lcd.LCD_3310_write_string(6,5," Mega 1 ",MENU_NORMAL);
}

void Seite3(){
  lcd.LCD_3310_write_string(0,line,">",MENU_NORMAL);
  lcd.LCD_3310_write_string(6,0,"LED rt",MENU_NORMAL);
  if (L3==true)
    lcd.LCD_3310_write_string(50,0,"Ein",MENU_HIGHLIGHT);
  else
    lcd.LCD_3310_write_string(50,0,"Aus",MENU_NORMAL);   
  lcd.LCD_3310_write_string(6,1,"LED rt",MENU_NORMAL);
  if (L4==true)
    lcd.LCD_3310_write_string(50,1,"Ein",MENU_HIGHLIGHT);
  else
    lcd.LCD_3310_write_string(50,1,"Aus",MENU_NORMAL);   

  lcd.LCD_3310_write_string(6,5," Attiny 2 ",MENU_NORMAL);
}

void Seite4(){
  char buf1[10];
  itoa(buf
  lcd.LCD_3310_write_string(0,0,"Mega Istwert",MENU_NORMAL);
  lcd.LCD_3310_write_string_big( 4, 1, buf1, MENU_NORMAL);
  lcd.LCD_3310_write_string(0,line,">",MENU_NORMAL);

}

void Seite5(){
  lcd.LCD_3310_write_string(0,0,"Tiny Istwert",MENU_NORMAL);
  lcd.LCD_3310_write_string(0,1,"fuenfte Seite",MENU_NORMAL);
}

void Seite6(){
  lcd.LCD_3310_write_string(0,0,"Das ist die",MENU_NORMAL);
  lcd.LCD_3310_write_string(0,1,"sechste Seite",MENU_NORMAL);
}

Hier kommt noch der Salve 1 (Arduino Nano V3) Ist einfach mit 2 LED bestückt

/*In Arduino 1.0.1*/

#include "Arduino.h"
#include "RS485_protocol.h"
#include <SoftwareSerial.h>

#define ENABLE_PIN  4
#define LED 13


SoftwareSerial rs485 (2, 3);  // receive pin, transmit pin

// callback routines

void fWrite (const byte what)
{
  rs485.write (what);  
}

int fAvailable ()
{
  return rs485.available ();  
}

int fRead ()
{
  return rs485.read ();  
}

void setup()
{
  rs485.begin (9600);
  pinMode (ENABLE_PIN, OUTPUT);  // driver output enable
  pinMode (LED, OUTPUT);  // built-in LED
  pinMode(2,INPUT);
  pinMode(3,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
}  // end of setup


void loop()
{
  byte buf [10];                              // Buffer für Daten max 20 Byte
  byte received = recvMsg (fAvailable, fRead, buf, sizeof (buf) - 1,50);
  if (received){
    if (buf [0] != 1)
     return;  // not my device
   
    digitalWrite(buf[2],buf[3]);
  }
}  // end of loop

Hier ist der Attiny84 mit dem SlaveProgramm
Der Cores sind von hier
http://hlt.media.mit.edu/?p=1695
Aktualisiert

/*
Achtung Sektch für den ATTINY84A als RS485 Node In 1.0.1
 */

#include <SoftwareSerial.h>
#include "Arduino.h"
#include "RS485_protocol.h"

#define ENABLE_PIN  8
#define LED1 0
#define LED2 1

boolean Anfrage=true;
int Wert=2612;          // Sendewert
byte HB1,LB1=0;
byte msg[4];
byte MasterAdr=0;

SoftwareSerial rs485 (10, 9);  // receive pin, transmit pin

// callback routines

void fWrite (const byte what)
{
  rs485.write (what);  
}

int fAvailable ()
{
  return rs485.available ();  
}

int fRead ()
{
  return rs485.read ();  
}

void setup()
{
  rs485.begin (9600);
  pinMode (ENABLE_PIN, OUTPUT);  // driver output enable
  pinMode (LED1,OUTPUT);  // built-in LED
  pinMode (LED2,OUTPUT);
}  // end of setup


void loop()
{
  byte buf [10];                              // Buffer für Daten max 20 Byte
  byte received = recvMsg (fAvailable, fRead, buf, sizeof (buf) - 1,50);
  if (received){
    if (buf [0] != 2)
      return;  // not my device
    if (buf[1]==0x00){
      digitalWrite(buf[2],buf[3]);
    }
    if (buf[1]==0xAA){
      Anfrage=true;
    }
  }
  if (Anfrage==true){
    HB1=highByte(Wert);
    LB1=lowByte(Wert);
    msg[0]=MasterAdr;
    msg[1]=HB1;
    msg[2]=LB1;
    digitalWrite(ENABLE_PIN,HIGH);            // Treiber Aktivieren
    sendMsg (fWrite, msg, sizeof msg);        // Daten Senden
    digitalWrite(ENABLE_PIN,LOW);             // Treiber deaktiviern Empfänger akvivieren
  }
}  // end of loop

Hallo Volvodani,

danke für den neuen Code. Bin erst jetzt dazu gekommen es zu testen. Beim Überprüfen des Master Codes wird ein Fehler angezeigt:

Neue_Version1_0_1.cpp: In function »void Seite4()«: Neue_Version1_0_1.cpp:282: Fehler: »buf« wurde in diesem Gültigkeitsbereich nicht definiert

Kannst mir da bitte weiter helfen? Danke.

Gruss MX738

Da ist beim hinundher kopieren ein Fehler passiert. itoa Interger to Asci Conversation ein Fehler passiert. Kommentiere mal die Zeile aus mit // dann müsstes du es kompilieren können

Welche Nokia_3310 libaray hast Du benutzt? Meine scheint noch für die IDE0023 zu sein, beim überprüfen bekomme ich jetzt x Fehler. Geht los mit WConstants.h (das ist doch noch bei der IDE0023, oder) neu heisst die doch Arduino.h. Musst die Nokia_3310 angepasst werden oder gibt es die passend für die IDE1.0.1?

Ich glaube ich habe schon mal ein paar Änderungen der Libary gemacht muss erst mal schauen. :-)

hab es raus gefunden. In der n3310_lcd.c den #include "WConstants.h" Eintrag in #include "Arduino.h" geändert und läuft. Danke.

Hallo,

Per zufall bin ich auf dein Projekt "gekommen". Wurde es versuchen aber...

Kleine Bitte, kannst Du mir genau schreiben wo ich:

1*LCD Shield 5110 von nuelectronics finde ?

Wie heisst genau das NOKIA 5110 oder link (auch wegen der bibliothek)

Vielen Dank Georges

Das hat jetzt eher nichts mit diesem 3 Jahre alten Thread zu tun.

Trotzdem zum 5110 findest du zig Informationen Hier sind einige Links gesammelt: http://alhin.de/arduino/index.php?n=23

Hallo Georges. nuelectronics sind sei zwei Jahren Pleite die waren in England. Ich habe sonst auch kein LCD Shields mit 3110 gesehen. Ich denke auch das die "Zeit" dieser Shields mit den Nokia Shields vorbei ist. Ansonsten der Link von michael

Gruß DerDani

Ich denke auch das die "Zeit" dieser Nokia Shields vorbei ist

Na ja, so reichlich und billig wie es die via ebay aus China gibt, werden sie wohl noch irgendwo hergestellt.

Wenn es dir auf ein paar mehr Zeichen als bei einem 16x2 LCD ankommt, die Lesbarkeit weniger, aber der "low budget Faktor" eine Rolle spielt, viel Spass mit dem Display. Die "Vollgrafik-Fähigkeiten" solltest du nicht überbewerten ;)

Vielen Dank an michael_x und volvodani für rasche Antwort.

Wie steht es mit dem Projekt von volvodani zur Zeit ? zu frienden mit der RS 485 Übertragung? Welche sind die entgülgige Antworten -Bemerkungen über dies Projekt? (änderungen beim code) Darf man den entgültigen Code bekommen... Paar Bilder währe schön...

Michael_x ich habe noch ein 20x4 LCD "klassiker" wird bestimmt reichen, oder ?

-habe bestimmt noch was vergessen.....

ich habe noch ein 20x4 LCD "klassiker" wird bestimmt reichen, oder ?

Ja, musst halt das Menu und die Anzeige an deine Bedürfnisse anpassen.