Go Down

Topic: Problem mit Code für RCSwitch und Tempauslesen (Read 1 time) previous topic - next topic

currymuetze

Hallo,
ich habe mir die aktuelle library zum schalten von FUnksteckdosen besorgt und es funktioniert einwandfrei mit dem Testcode.
Jetzt möchte ich das ganze über die Temperatur steuern, leider schaltet sie nicht. Und den Fehler finde ich einfach nciht.
Die Temperatur wird korrekt gelesen, aber wenn ich den Fühler erwärme sollte ja aigentlich die FUnkdose abgeschaltet werden. Klappt halt nicht.

Hier mein Code:
Code: [Select]
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch(0, 340); //HX2262: 10 ist der Pin am Arduino und 340 ist 1/8 Bitlänge in Mikrosekunden. Das variiert je nach Fernbedienung zwischen 300 und 400


//DALLAS DS18B20 Temperature
#include <WProgram.h>
#include <Wire.h>

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS A3

OneWire oneWire(ONE_WIRE_BUS);
float TempLED1;
float TempLED2;
float TempWasser;
float TempLuft;
DallasTemperature sensors(&oneWire);

#include "Tlc5940.h"
int i=0;
int UV=7;
int luft1=10;
int luft2=8;
int moon=13;
void setup()
{
   sensors.begin();
 Tlc.init();
 Serial.begin(9600);
 pinMode(UV, OUTPUT);
 pinMode(moon, OUTPUT);
 pinMode(luft1, OUTPUT);
 pinMode(luft2, OUTPUT);
 
}

void loop()
{
 getTemp();
   digitalWrite(moon, HIGH);
   digitalWrite(luft1, HIGH);
   digitalWrite(luft2, HIGH);
   analogWrite(UV,0);  //UV
   //li  KK1  |  KK2  |  KK3  |  KK4  |  KK5    re//
    Tlc.clear();
    Tlc.set(0, 4095); // blau KK2
    Tlc.set(1, 0); // blau 10W
    Tlc.set(2, 4095);  // rot links
    Tlc.set(3, 4095);  // LEER
    Tlc.set(4, 0);  // weiß 10W
    Tlc.set(5, 4095);  // blau KK1
    Tlc.set(6, 4095);  // weiß KK3
    Tlc.set(7, 4095);  // weiß KK4
    Tlc.set(8, 4095);  //grün rechts
    Tlc.set(9, 4095);  // weiß KK2
    Tlc.set(10, 4095);  // weiß KK5
    Tlc.set(11, 4095);  // blau KK 5
    Tlc.set(12, 4095);  // rot rechts
    Tlc.set(13, 4095);  // grün links
    Tlc.set(14, 4095); // blau KK 4
    Tlc.set(15, 4095);  //LEER
   Tlc.update();
Serial.println(TempLED1, DEC);
delay(1000);
if (TempLED1>25.5) {
  mySwitch.switchOff("00111", 4);
  delay(1000);
  }
if (TempLED1<24.5) {
  mySwitch.switchOn("00111", 4);
  delay(1000);
  }

}
void getTemp() {
 sensors.requestTemperatures();
 TempLED1 = sensors.getTempCByIndex(0);

}

currymuetze

läss mir keine ruhe. Habe es noch mal getestet. Hier der Testcode für den RCswitch. Ich nutze übrigens ein RF434 Modul von Watterott.
Wie gesagt, mit diesem Code funzt es:
Code: [Select]
#include <RCSwitch.h>
//RCSwitch mySwitch = RCSwitch(10);  // SC5262: Sender is connected to Pin #10 am Arduino
RCSwitch mySwitch = RCSwitch(0, 340); //HX2262: 10 ist der Pin am Arduino und 340 ist 1/8 Bitlänge in Mikrosekunden. Das variiert je nach Fernbedienung zwischen 300 und 400

void setup() {
}

void loop() {
  // Steckdose mit 10 DIP Schaltern (HX2262)
  // Beispiel:
  // Systemcode (Die ersten 5 DIP Schalter sind auf off, on, on, on, on)
  // Steckdose Nummer 1 (Die letzten 5 DIP Schalter sind auf on, off, off, off, off)
  mySwitch.switchOn("00111", 4);
  delay(2000);
  mySwitch.switchOff("00111", 4);
  delay(2000); 
 
 
  // Steckdose mit zwei Drehschaltern mit je 4 Stellungen (SC5262)
  // Systemcode (Erster Schalter ist auf 4, D oder IV)
  // Steckdose Nummer 2 (Zweiter Schalter auf 2, B oder II)
 
  /* mySwitch.switchOn(4, 2);
  delay(2000);
  mySwitch.switchOff(4, 2);
  delay(2000);
  */
}


Jetzt habe ich meinen code noch mal erweitert um eine printfunktion um sicher zustellen, dass die if-klausel erfüllt wird. auch das passt alles:
Code: [Select]
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch(); //HX2262: 10 ist der Pin am Arduino und 340 ist 1/8 Bitlänge in Mikrosekunden. Das variiert je nach Fernbedienung zwischen 300 und 400


//DALLAS DS18B20 Temperature
#include <WProgram.h>
#include <Wire.h>

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS A3

OneWire oneWire(ONE_WIRE_BUS);
float TempLED1;
float TempLED2;
float TempWasser;
float TempLuft;
DallasTemperature sensors(&oneWire);

#include "Tlc5940.h"
int i=0;
int UV=7;
int luft1=10;
int luft2=8;
int moon=13;
void setup()
{
    sensors.begin();
  Tlc.init();
  Serial.begin(9600);
  pinMode(UV, OUTPUT);
  pinMode(moon, OUTPUT);
  pinMode(luft1, OUTPUT);
  pinMode(luft2, OUTPUT);
    mySwitch.enableTransmit(0);
}

void loop()
{
  getTemp();
    digitalWrite(moon, HIGH);
    digitalWrite(luft1, HIGH);
    digitalWrite(luft2, HIGH);
    analogWrite(UV,255);  //UV
    //li  KK1  |  KK2  |  KK3  |  KK4  |  KK5    re//
     Tlc.clear();
     Tlc.set(0, 0); // blau KK2
     Tlc.set(1, 0); // blau 10W
     Tlc.set(2, 0);  // rot links
     Tlc.set(3, 0);  // LEER
     Tlc.set(4, 0);  // weiß 10W
     Tlc.set(5, 0);  // blau KK1
     Tlc.set(6, 0);  // weiß KK3
     Tlc.set(7, 0);  // weiß KK4
     Tlc.set(8, 0);  //grün rechts
     Tlc.set(9, 0);  // weiß KK2
     Tlc.set(10, 0);  // weiß KK5
     Tlc.set(11, 0);  // blau KK 5
     Tlc.set(12, 0);  // rot rechts
     Tlc.set(13, 0);  // grün links
     Tlc.set(14, 0); // blau KK 4
     Tlc.set(15, 0);  //LEER
    Tlc.update();
Serial.println(TempLED1, DEC);
delay(1000);
if (TempLED1>26) {
   mySwitch.switchOff("00111", 4);
   Serial.println(">26");
   delay(1000);
   }
if (TempLED1<24) {
   mySwitch.switchOn("00111", 4);
      Serial.println("<24");
   delay(1000);
   }

}
void getTemp() {
  sensors.requestTemperatures();
  TempLED1 = sensors.getTempCByIndex(0);
  TempLED2 = sensors.getTempCByIndex(1);
  TempWasser = sensors.getTempCByIndex(2);
  TempLuft = sensors.getTempCByIndex(3);
}


außerdem habe ich bei google noch ein update gefunden, wo der PIN in der void setup definiert wird, auch das hat nix gebracht:
Code: [Select]
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  // Transmitter is connected to Arduino Pin 0 
  mySwitch.enableTransmit(0);
 
}

void loop() {

  mySwitch.switchOn("00111", 4);

  // Wait a second
  delay(1000);
 
  // Switch off
  mySwitch.switchOff("00111", 4);
 
  // Wait another second
  delay(1000);
 
}


hoffe irgendwer hat mal nen hilfreichen Tipp für mich....

erni-berni

Ich habe versucht zu verstehen, welcher Programmcode funktioniert und welcher nicht.
Das ist mir nicht gelungen.
Erklär doch bitte nochmal, bei welchem Programm was genau nicht funktioniert.

currymuetze


Funktioniert:
Code: [Select]
#include <RCSwitch.h>
//RCSwitch mySwitch = RCSwitch(10);  // SC5262: Sender is connected to Pin #10 am Arduino
RCSwitch mySwitch = RCSwitch(0, 340); //HX2262: 10 ist der Pin am Arduino und 340 ist 1/8 Bitlänge in Mikrosekunden. Das variiert je nach Fernbedienung zwischen 300 und 400

void setup() {
}

void loop() {
  // Steckdose mit 10 DIP Schaltern (HX2262)
  // Beispiel:
  // Systemcode (Die ersten 5 DIP Schalter sind auf off, on, on, on, on)
  // Steckdose Nummer 1 (Die letzten 5 DIP Schalter sind auf on, off, off, off, off)
  mySwitch.switchOn("00111", 4);
  delay(2000);
  mySwitch.switchOff("00111", 4);
  delay(2000); 
 
 
  // Steckdose mit zwei Drehschaltern mit je 4 Stellungen (SC5262)
  // Systemcode (Erster Schalter ist auf 4, D oder IV)
  // Steckdose Nummer 2 (Zweiter Schalter auf 2, B oder II)
 
  /* mySwitch.switchOn(4, 2);
  delay(2000);
  mySwitch.switchOff(4, 2);
  delay(2000);
  */
}


Funktioniert nicht:
Code: [Select]
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch(); //HX2262: 10 ist der Pin am Arduino und 340 ist 1/8 Bitlänge in Mikrosekunden. Das variiert je nach Fernbedienung zwischen 300 und 400


//DALLAS DS18B20 Temperature
#include <WProgram.h>
#include <Wire.h>

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS A3

OneWire oneWire(ONE_WIRE_BUS);
float TempLED1;
float TempLED2;
float TempWasser;
float TempLuft;
DallasTemperature sensors(&oneWire);

#include "Tlc5940.h"
int i=0;
int UV=7;
int luft1=10;
int luft2=8;
int moon=13;
void setup()
{
    sensors.begin();
  Tlc.init();
  Serial.begin(9600);
  pinMode(UV, OUTPUT);
  pinMode(moon, OUTPUT);
  pinMode(luft1, OUTPUT);
  pinMode(luft2, OUTPUT);
    mySwitch.enableTransmit(0);
}

void loop()
{
  getTemp();
    digitalWrite(moon, HIGH);
    digitalWrite(luft1, HIGH);
    digitalWrite(luft2, HIGH);
    analogWrite(UV,255);  //UV
    //li  KK1  |  KK2  |  KK3  |  KK4  |  KK5    re//
     Tlc.clear();
     Tlc.set(0, 0); // blau KK2
     Tlc.set(1, 0); // blau 10W
     Tlc.set(2, 0);  // rot links
     Tlc.set(3, 0);  // LEER
     Tlc.set(4, 0);  // weiß 10W
     Tlc.set(5, 0);  // blau KK1
     Tlc.set(6, 0);  // weiß KK3
     Tlc.set(7, 0);  // weiß KK4
     Tlc.set(8, 0);  //grün rechts
     Tlc.set(9, 0);  // weiß KK2
     Tlc.set(10, 0);  // weiß KK5
     Tlc.set(11, 0);  // blau KK 5
     Tlc.set(12, 0);  // rot rechts
     Tlc.set(13, 0);  // grün links
     Tlc.set(14, 0); // blau KK 4
     Tlc.set(15, 0);  //LEER
    Tlc.update();
Serial.println(TempLED1, DEC);
delay(1000);
if (TempLED1>26) {
   mySwitch.switchOff("00111", 4);
   Serial.println(">26");
   delay(1000);
   }
if (TempLED1<24) {
   mySwitch.switchOn("00111", 4);
      Serial.println("<24");
   delay(1000);
   }

}
void getTemp() {
  sensors.requestTemperatures();
  TempLED1 = sensors.getTempCByIndex(0);
  TempLED2 = sensors.getTempCByIndex(1);
  TempWasser = sensors.getTempCByIndex(2);
  TempLuft = sensors.getTempCByIndex(3);
}



currymuetze

noch etwas das komisch ist:
Solange der FUnksender am Arduino angesteckt ist, kann ich meine FUnkfernbedienung, die ich zusätzlich im Wohnzimmer nutze, die allerdings auf eine andere Frequenz eingestellt ist, nicht nutzen.
Irgendwie komisch alles ..... :~ :~ :~

currymuetze

hallo,
also fehler gefunden: die baudrate vom serial.print. einfach deaktiviert, schon gings.
Falls mir noch jemand den zusammenhang erklären kann, wäre super.

Gruß

MueThoS

Hab zwar selber keine Ahnung aber vielleicht ist die Seriel-Ausgabe zu Zeitaufwendig und stört Zeitkritische Abläufe in deinem Programm.
Ich glaube ich hatte das auch mal.
Kannst ja auch mal versuchen die Baudrate zu erhöhen obs dann auch noch geht.


Go Up