AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« on: June 07, 2012, 04:21:44 pm » |
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=11428Die Hardware: 2* Arduino nano V3 1*freeduino nano 3* SN75176 RS232=>RS485 Wandler 1*LCD Shield 5110 von nuelectronics
|
|
|
|
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« Reply #1 on: June 07, 2012, 04:28:18 pm » |
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); }
|
|
|
|
« Last Edit: June 11, 2012, 04:38:26 am by volvodani »
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« Reply #2 on: June 07, 2012, 04:30:42 pm » |
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]); }
}
|
|
|
|
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #3 on: July 31, 2012, 02:43:51 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« Reply #4 on: August 01, 2012, 07:14:38 am » |
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 }
|
|
|
|
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« Reply #5 on: August 01, 2012, 07:18:32 am » |
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); }
|
|
|
|
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« Reply #6 on: August 01, 2012, 07:27:52 am » |
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/* 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
|
|
|
|
« Last Edit: August 01, 2012, 07:29:49 am by volvodani »
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #7 on: August 06, 2012, 01:46:35 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« Reply #8 on: August 06, 2012, 02:12:42 pm » |
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
|
|
|
|
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #9 on: August 07, 2012, 02:13:16 pm » |
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?
|
|
|
|
|
Logged
|
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 807
I am 1 of 10 who understands binary
|
 |
« Reply #10 on: August 07, 2012, 02:25:26 pm » |
Ich glaube ich habe schon mal ein paar Änderungen der Libary gemacht muss erst mal schauen. :-)
|
|
|
|
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #11 on: August 07, 2012, 02:32:58 pm » |
hab es raus gefunden. In der n3310_lcd.c den #include "WConstants.h" Eintrag in #include "Arduino.h" geändert und läuft. Danke.
|
|
|
|
|
Logged
|
|
|
|
|
|