Go Down

Topic: Vorstellung Zeitgesteuerte Funkschalter für Weihnachtsbeleuchtung (Read 5627 times) previous topic - next topic

volvodani

Hallo Zusammen,
ich habe mal ein kleines "Guten Abend Projekt" bzw Weekender umgesetzt.
Ich hatte die Nase voll wenn die Weihnachtsbeleuchtungen am Haus zu unterschiedlichen Zeiten angehen so innerhalb von 1-2 Minuten.
Also musste eine Zentraluhr her in Verbindung mit Funksteckdosen. Basis ist die neuste  RCSwitch Lib von sui77 >HIER<. Mit dieser Lib konnte ich auch die neusten A*L*D*I* South Funkdosen (GT-FSI-07 von QUIGG) mit dem Arduino steuern. Es Funktioniert bisher einwandfrei.
Da es nur ein Abend war sind die Schaltzeiten im Moment noch Fest-codiert werden aber demnächst über Display und Encoder einstellbar gemacht und im EEPROM gespeichert. Die Uhr wird natürlich auch einstellbar und via LCD angezeigt werden.
Hier ist im Code noch einiges an Potential zum ändern. Ich nutze für die RTC keine Lib. Ich habe die RTC vorher mit einem anderen Code eben gesetzt und hier wird sie nur gelesen.
Material:
-Arduino Nano
-433Mhz Feld-Wald-Wiesensender
-DS3231 RTC  
-Global Tronics Funksteckdosen (GT-FSI-07 QUIGG)

Hier der Code:
Code: [Select]
#include <Wire.h>
#include <RCSwitch.h>
#include "INTERVAL.h"



#define CH1_on  1601856
#define CH1_off 1353632
#define CH2_on  1883508
#define CH2_off 1441428
#define CH3_on  1883516
#define CH3_off 1441436
#define CH4_on  1115666
#define CH4_off 1656242
#define ALL_on  1115674
#define ALL_off 1883514

#define RTC_ADDRESS 0x68

RCSwitch mySwitch = RCSwitch();  // Klasse Erzeugen für RC Switch

byte ss, mm,  hh = 0;   // Save Variables for time
boolean sendOn=false;
boolean sendOff=false;

boolean sendenOn=false;
boolean sendenOff=false;
boolean schongesendet=false;
byte CNT_send_on=0;
byte CNT_send_off=0;


/*
Schaltzeit Abends 16:30-0:30
Schaltzeit Morgens 06:00-09:00
*/

byte Ein_morgens_hh=6;
byte Ein_morgens_mm=30;
byte Aus_morgens_hh=9;
byte Aus_morgens_mm=30;

byte Ein_abends_hh=16;
byte Ein_abends_mm=30;
byte Aus_abends_hh=00;
byte Aus_abends_mm=30;

void SendOnCh1() {
  if (CNT_send_on<=2){
    mySwitch.send(CH1_on,24);
    CNT_send_on++;
  }
}

void SendOffCh1(){
  if (CNT_send_off<=2){
    mySwitch.send(CH1_off,24);
    CNT_send_off++;
  }
}

/*
RTC Funktionen zur Steuerung der RTC DS3231
*/
void TimeRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 3);
  ss= bcdToDec(Wire.read());
  mm= bcdToDec(Wire.read());
  hh= bcdToDec(Wire.read());
}


void RTC_Set(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.write(decToBcd(mm));
  Wire.write(decToBcd(hh));      // If you want 12 hour am/pm you need to set
  Wire.endTransmission();
}

void RTC_Start(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.endTransmission();
}

byte decToBcd(byte val)
{
  return ((val/10)<<4)+(val%10);
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ((val>>4)*10)+val%16;
}


void setup() {
  Wire.begin();                 // Start I2C Kommunikation
  Wire.beginTransmission(RTC_ADDRESS);      // Beginn Kommunikation auf  Adresse 0x68
  Wire.write(0x0E);                               // Pointer auf Control Register 0x07
  Wire.write(0x00);                               // Controlbyte for RTC to set the sqw Output to 1Hz
  Wire.endTransmission();             // Beenden der I2C Kommunitkation
  TimeRead();
  RTC_Start();
  mySwitch.enableTransmit(10);
  mySwitch.setProtocol(5);
  Serial.begin(9600);
  Serial.print("start");
}

void loop() {
  INTERVAL(1000UL){                 //Jede  Minute nach Zeit schauen
    TimeRead();
    Serial.print(hh);
    Serial.print(":");
    Serial.println(mm);
    
  }
  if ((hh==Ein_morgens_hh && mm==Ein_morgens_mm)||(hh==Ein_abends_hh && mm==Ein_abends_mm )){   // Einschalten
    INTERVAL (200UL){
      CNT_send_off=0;
      SendOnCh1();
    }
  }
  if (hh==Aus_morgens_hh && mm>=Aus_morgens_mm||(hh==Aus_abends_hh&& mm>=Aus_abends_mm)){   // Ausschalten
    INTERVAL(200UL){
      CNT_send_on=0;
      SendOffCh1();
    }
  }
}


IM Code sind auch noch die defines für die anderen Kanäle so kann ich also hier die unterschiedlichen Kanäle nutzten.
Ein paar Bilder:



"Komm wir essen Opa!" - Satzzeichen retten Leben!

Klaus_ww

Sehr fein - ich mag diese eigentlich überflüssigen aber netten Projekte  :)
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

volvodani

Ist das nicht der Unterschied zwischen Nerd\Freak und Bastler?
Gruß
DerDani
"Komm wir essen Opa!" - Satzzeichen retten Leben!

uxomm

Ist das nicht der Unterschied zwischen Nerd\Freak und Bastler?
Und dann gibt's ja auch noch "maker" :) :)
Always decouple electronic circuitry.

garagenloeter

klasse Sache, gefällt mir u kann ich gut gebrauchen. TOP.

der hit wäre nun, wenn die Sonnen aufgang/untergang routine noch drinne wäre.
war doch mal in einem anderen fred.

dann braucht man nicht ewig die zeitschaltuhren neu stellen.

und die aldi dosen hab ich auch. waren die nicht für 14,99 für 4 stück?

DL2MWB

Hallo und Danke für das Projekt.

Mein Problem die IDE findet die "INTERVAL.h" nicht. Kann mir da jemand helfen? Bin da recht NEU.

Gruß Wolfi

HotSystems

Hallo und Danke für das Projekt.

Mein Problem die IDE findet die "INTERVAL.h" nicht. Kann mir da jemand helfen? Bin da recht NEU.

Gruß Wolfi

Guckst du hier
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

DL2MWB

Danke das Problem mit der INTERVAL.h scheint nun behoben. Allerdings scheint es so das ich eine faksche RCSwitch.h habe.

Code: [Select]
Arduino: 1.6.13 (Windows 7), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

C:\Users\DL2MWB\AppData\Local\Temp\cc2X7Vpg.ltrans0.ltrans.o: In function `global constructors keyed to 65535_0_XMAS_UHR_FUNK.ino.cpp.o.1964':

cc2X7Vpg.ltrans0.o:(.text.startup+0x74): undefined reference to `RCSwitch::RCSwitch()'

C:\Users\DL2MWB\AppData\Local\Temp\cc2X7Vpg.ltrans0.ltrans.o: In function `main':

cc2X7Vpg.ltrans0.o:(.text.startup+0x1fc): undefined reference to `RCSwitch::enableTransmit(int)'

cc2X7Vpg.ltrans0.o:(.text.startup+0x208): undefined reference to `RCSwitch::setProtocol(int)'

cc2X7Vpg.ltrans0.o:(.text.startup+0x366): undefined reference to `RCSwitch::send(unsigned long, unsigned int)'

cc2X7Vpg.ltrans0.o:(.text.startup+0x3ee): undefined reference to `RCSwitch::send(unsigned long, unsigned int)'

collect2.exe: error: ld returned 1 exit status

exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Mega or Mega 2560.

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.


Gruß Wolfi

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

DL2MWB

Hallo Tommy. Ich verswende den Sketch von oben 1:1 ..

Aber hier nochmal:

Code: [Select]
#include <Wire.h>
#include <RCSwitch.h>
#include "INTERVAL.h"



#define CH1_on  1601856
#define CH1_off 1353632
#define CH2_on  1883508
#define CH2_off 1441428
#define CH3_on  1883516
#define CH3_off 1441436
#define CH4_on  1115666
#define CH4_off 1656242
#define ALL_on  1115674
#define ALL_off 1883514

#define RTC_ADDRESS 0x68

RCSwitch mySwitch = RCSwitch();  // Klasse Erzeugen für RC Switch

byte ss, mm,  hh = 0;   // Save Variables for time
boolean sendOn=false;
boolean sendOff=false;

boolean sendenOn=false;
boolean sendenOff=false;
boolean schongesendet=false;
byte CNT_send_on=0;
byte CNT_send_off=0;


/*
Schaltzeit Abends 16:30-0:30
Schaltzeit Morgens 06:00-09:00
*/

byte Ein_morgens_hh=6;
byte Ein_morgens_mm=30;
byte Aus_morgens_hh=9;
byte Aus_morgens_mm=30;

byte Ein_abends_hh=16;
byte Ein_abends_mm=30;
byte Aus_abends_hh=00;
byte Aus_abends_mm=30;

void SendOnCh1() {
  if (CNT_send_on<=2){
    mySwitch.send(CH1_on,24);
    CNT_send_on++;
  }
}

void SendOffCh1(){
  if (CNT_send_off<=2){
    mySwitch.send(CH1_off,24);
    CNT_send_off++;
  }
}

/*
RTC Funktionen zur Steuerung der RTC DS3231
*/
void TimeRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 3);
  ss= bcdToDec(Wire.read());
  mm= bcdToDec(Wire.read());
  hh= bcdToDec(Wire.read());
}


void RTC_Set(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.write(decToBcd(mm));
  Wire.write(decToBcd(hh));      // If you want 12 hour am/pm you need to set
  Wire.endTransmission();
}

void RTC_Start(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.endTransmission();
}

byte decToBcd(byte val)
{
  return ((val/10)<<4)+(val%10);
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ((val>>4)*10)+val%16;
}


void setup() {
  Wire.begin();                 // Start I2C Kommunikation
  Wire.beginTransmission(RTC_ADDRESS);      // Beginn Kommunikation auf  Adresse 0x68
  Wire.write(0x0E);                               // Pointer auf Control Register 0x07
  Wire.write(0x00);                               // Controlbyte for RTC to set the sqw Output to 1Hz
  Wire.endTransmission();             // Beenden der I2C Kommunitkation
  TimeRead();
  RTC_Start();
  mySwitch.enableTransmit(10);
  mySwitch.setProtocol(5);
  Serial.begin(9600);
  Serial.print("start");
}

void loop() {
  INTERVAL(1000UL){                 //Jede  Minute nach Zeit schauen
    TimeRead();
    Serial.print(hh);
    Serial.print(":");
    Serial.println(mm);
   
  }
  if ((hh==Ein_morgens_hh && mm==Ein_morgens_mm)||(hh==Ein_abends_hh && mm==Ein_abends_mm )){   // Einschalten
    INTERVAL (200UL){
      CNT_send_off=0;
      SendOnCh1();
    }
  }
  if (hh==Aus_morgens_hh && mm>=Aus_morgens_mm||(hh==Aus_abends_hh&& mm>=Aus_abends_mm)){   // Ausschalten
    INTERVAL(200UL){
      CNT_send_on=0;
      SendOffCh1();
    }
  }
}


Gruß Wolfi

HotSystems

Warum zeigst uns nicht die ganzen Fehlermeldungen.
Kannstdu in den Einstellungen aktivieren.

Und der Link zur richtigen RCSwitch ist im ersten Post angegeben.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

DL2MWB

HotSystems, der komplette ist hier zu lang.

>> The message exceeds the maximum allowed length (9000 characters).

Gruß Wolfi

Edit: Stimmt mit dem Link zur RCSwitch.h ... Genau die hab ich.

HotSystems

Hotsystems, der komplette ist hier zu lang.

>> The message exceeds the maximum allowed length (9000 characters).

Gruß Wolfi

Dann ist da ja grundsätzlich was falsch und wir haben keine Chance weiter zu helfen.
Teile es auf.
Hast du die Library getauscht ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

DL2MWB

Errorreport Part1:

Code: [Select]
Arduino: 1.6.13 (Windows 7), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

I:\Tools\Arduino\arduino-builder -dump-prefs -logger=machine -hardware I:\Tools\Arduino\hardware -tools I:\Tools\Arduino\tools-builder -tools I:\Tools\Arduino\hardware\tools\avr -built-in-libraries I:\Tools\Arduino\libraries -libraries C:\Users\DL2MWB\Documents\Arduino\libraries -fqbn=arduino:avr:mega:cpu=atmega2560 -vid-pid=0X2341_0X0042 -ide-version=10613 -build-path C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=I:\Tools\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=I:\Tools\Arduino\hardware\tools\avr -verbose C:\Users\DL2MWB\Documents\Arduino\XMAS_UHR_FUNK\XMAS_UHR_FUNK.ino
I:\Tools\Arduino\arduino-builder -compile -logger=machine -hardware I:\Tools\Arduino\hardware -tools I:\Tools\Arduino\tools-builder -tools I:\Tools\Arduino\hardware\tools\avr -built-in-libraries I:\Tools\Arduino\libraries -libraries C:\Users\DL2MWB\Documents\Arduino\libraries -fqbn=arduino:avr:mega:cpu=atmega2560 -vid-pid=0X2341_0X0042 -ide-version=10613 -build-path C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=I:\Tools\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=I:\Tools\Arduino\hardware\tools\avr -verbose C:\Users\DL2MWB\Documents\Arduino\XMAS_UHR_FUNK\XMAS_UHR_FUNK.ino
Using board 'mega' from platform in folder: I:\Tools\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: I:\Tools\Arduino\hardware\arduino\avr
Detecting libraries used...
"I:\Tools\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10613 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR   "-II:\Tools\Arduino\hardware\arduino\avr\cores\arduino" "-II:\Tools\Arduino\hardware\arduino\avr\variants\mega" "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\sketch\XMAS_UHR_FUNK.ino.cpp" -o "nul"
"I:\Tools\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10613 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR   "-II:\Tools\Arduino\hardware\arduino\avr\cores\arduino" "-II:\Tools\Arduino\hardware\arduino\avr\variants\mega" "-II:\Tools\Arduino\hardware\arduino\avr\libraries\Wire\src" "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\sketch\XMAS_UHR_FUNK.ino.cpp" -o "nul"
"I:\Tools\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10613 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR   "-II:\Tools\Arduino\hardware\arduino\avr\cores\arduino" "-II:\Tools\Arduino\hardware\arduino\avr\variants\mega" "-II:\Tools\Arduino\hardware\arduino\avr\libraries\Wire\src" "-II:\Tools\Arduino\libraries\RCSwitch" "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\sketch\XMAS_UHR_FUNK.ino.cpp" -o "nul"
"I:\Tools\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10613 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR   "-II:\Tools\Arduino\hardware\arduino\avr\cores\arduino" "-II:\Tools\Arduino\hardware\arduino\avr\variants\mega" "-II:\Tools\Arduino\hardware\arduino\avr\libraries\Wire\src" "-II:\Tools\Arduino\libraries\RCSwitch" "-II:\Tools\Arduino\libraries\INTERVAL" "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\sketch\XMAS_UHR_FUNK.ino.cpp" -o "nul"
Using cached library dependencies for file: I:\Tools\Arduino\hardware\arduino\avr\libraries\Wire\src\Wire.cpp
Using cached library dependencies for file: I:\Tools\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c
Using cached library dependencies for file: I:\Tools\Arduino\libraries\INTERVAL\INTERVAL.cpp
Generating function prototypes...
"I:\Tools\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10613 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR   "-II:\Tools\Arduino\hardware\arduino\avr\cores\arduino" "-II:\Tools\Arduino\hardware\arduino\avr\variants\mega" "-II:\Tools\Arduino\hardware\arduino\avr\libraries\Wire\src" "-II:\Tools\Arduino\libraries\RCSwitch" "-II:\Tools\Arduino\libraries\INTERVAL" "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\sketch\XMAS_UHR_FUNK.ino.cpp" -o "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\preproc\ctags_target_for_gcc_minus_e.cpp"
"I:\Tools\Arduino\tools-builder\ctags\5.8-arduino10/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\preproc\ctags_target_for_gcc_minus_e.cpp"
Sketch wird kompiliert...
"I:\Tools\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10613 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR   "-II:\Tools\Arduino\hardware\arduino\avr\cores\arduino" "-II:\Tools\Arduino\hardware\arduino\avr\variants\mega" "-II:\Tools\Arduino\hardware\arduino\avr\libraries\Wire\src" "-II:\Tools\Arduino\libraries\RCSwitch" "-II:\Tools\Arduino\libraries\INTERVAL" "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\sketch\XMAS_UHR_FUNK.ino.cpp" -o "C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\sketch\XMAS_UHR_FUNK.ino.cpp.o"
Compiling libraries...
Compiling library "Wire"
Zuvor kompilierte Datei wird verwendet: C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\libraries\Wire\Wire.cpp.o
Zuvor kompilierte Datei wird verwendet: C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\libraries\Wire\utility\twi.c.o
Compiling library "RCSwitch"
Compiling library "INTERVAL"
Zuvor kompilierte Datei wird verwendet: C:\Users\DL2MWB\AppData\Local\Temp\arduino_build_945181\libraries\INTERVAL\INTERVAL.cpp.o

Go Up