Go Down

Topic: RS485 Kommunikation (Read 5943 times) previous topic - next topic

volvodani

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 (5*Temperaturen ü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
1*freeduino nano
3* SN75176 RS232=>RS485 Wandler
1*LCD Shield 5110 von nuelectronics


So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

volvodani

#1
Jun 07, 2012, 11:28 pm Last Edit: Jun 11, 2012, 11:38 am by volvodani Reason: 1
Codes:
Master:
Code: [Select]

#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:
Code: [Select]
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);
}


So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

volvodani

Und dann noch die Slaves 1+2.
Sind gleich bis auf die Adresse:
Code: [Select]
#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]);
  }





So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

mx738

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

volvodani

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

Code: [Select]
#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
}
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

volvodani

und der tab 2 (Displayseiten)
Code: [Select]
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);
}
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

volvodani

#6
Aug 01, 2012, 02:27 pm Last Edit: Aug 01, 2012, 02:29 pm by volvodani Reason: 1
Hier kommt noch der Salve 1 (Arduino Nano V3) Ist einfach mit 2 LED bestückt

Code: [Select]

/*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
Code: [Select]

/*
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
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

mx738

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

volvodani

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
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

mx738

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?

volvodani

Ich glaube ich habe schon mal ein paar Änderungen der Libary gemacht muss erst mal schauen. :-)
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

mx738

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

Go Up