Hab mich mal bei gemacht, meine Schaltung etwas zu erweitern. Möchte jetzt auch meinen PC per Handy ausschalten, benutze dazu ein Relais. Meine Idee dazu ist, wenn ich den PC-Knopf am Handy drücke, soll sich der PC runterfahren (Relais wird für 100millis geschalten), desweiteren soll der Arduino einen Impuls von der Diode im Powerschalter am PC bekommen und nach ca. 30 Sek die Funksteckdose ausschalten. Habe dazu erstmal einen Testsketch zusammengebastelt, der aber nicht alle Wünsche erfüllt. Die Steckdose wird leider sofort mit geschalten, ohne Verzögerung. Das mit der LED habe ich hier erstmal noch weggelassen.
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h> // this is new
#include <EthernetServer.h> // so is this
#include <RCSwitch.h>
#include <IRremote.h>
byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36
byte ip[] = { 192, 168, 0, 99 }; // IP-Adresse
EthernetServer server(80);
RCSwitch mySwitch = RCSwitch();
IRsend irsend = IRsend();
const int ledPin = 13;
int ledPinState = 0;
void setup() {
Serial.begin(9600);
Serial.println("ARDUINO - STEUERUNG");
Serial.println();
Serial.println("Verbraucher schalten");
pinMode(ledPin, OUTPUT);
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server it at");
Serial.println(EthernetClient());
mySwitch.enableTransmit(7);
}
void loop()
{
char* command = httpServer();
if (strcmp(command, "3an=") == 0)
{
digitalWrite(ledPin, HIGH);
delay (100);
}
else{
digitalWrite(ledPin, LOW);
}
ledPinState = digitalRead(ledPin);
if (ledPinState == HIGH)
{
mySwitch.switchOn("01111", "10000");
}
}
/**
* HTML-Seite die dem Client zurückgeschickt wird.
*/
void httpResponse(EthernetClient c) {
c.println("HTTP/1.1 200 OK");
}
/**
* Verarbeitet Client Anfragen und gibt falls vorhanden den GET Query
* String, also alles was in der URL hinter dem ? steht, zurück
*/
char* httpServer() {
EthernetClient client = server.available();
if (client) {
char sReturnCommand[20];
int nCommandPos=-1;
sReturnCommand[0] = '\0';
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if ((c == '\n') || (c == ' ' && nCommandPos>-1)) {
httpResponse(client);
break;
}
if (nCommandPos>-1) {
sReturnCommand[nCommandPos++] = c;
}
if (c == '?' && nCommandPos == -1) {
nCommandPos = 0;
}
}
}
if (nCommandPos!=-1) {
sReturnCommand[nCommandPos] = '\0';
}
// give the web browser time to receive the data
delay(1);
client.stop();
return sReturnCommand;
}
return '\0';
}
Ich hab es hier schon mit delay und auch mit without delay probiert. Das erste Delay ist für das Relais, das funktioniert auch. Wenn ich aber an der Stelle wo die Steckdose geschalten werden soll ein delay einsetze und 1000 eingebe, dann schaltet das Relais auch so lange. Das Relais soll aber nur einen Impuls geben, und dann nichts mehr tun.
Wer hat da vieleicht einen Tip für mich?
Ok, vielen Dank für die Hilfe. Hab jetzt eine Lösung für das Problem mit der Zeitschaltung gefunden und den Sketch dahingehend umgeschrieben. Nun ist es möglich den PC per Handytaste runter zufahren und die Steckdose wird dann nach einer eingestellten Zeit ausgeschalten.
Um dieses für meine Zwecke umzusetzen hab ich hier im Forum einen Thread über Zeitschaltuhr gefunden in dem mit "Flag" gearbeitet wird. Es funktioniert schon mal so wie ich es haben will. Vielen Dank "maverick1509".
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h> // this is new
#include <EthernetServer.h> // so is this
#include <RCSwitch.h>
#include <IRremote.h>
byte mac[] = {
0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36
byte ip[] = {
192, 168, 0, 99 }; // IP-Adresse
EthernetServer server(80);
RCSwitch mySwitch = RCSwitch();
IRsend irsend = IRsend();
const int ledPin = 13;
int ledPinState = 0;
int flag,i;
void setup() {
pinMode(ledPin, OUTPUT);
Ethernet.begin(mac, ip);
server.begin();
mySwitch.enableTransmit(7);
}
void loop()
{
int val = digitalRead(ledPin);
char* command = httpServer();
if (strcmp(command, "3an=") == 0)
{
digitalWrite(ledPin, HIGH);
delay (100);
}
else
{
digitalWrite(ledPin, LOW);
}
/**hier fängt der Teil an, an dem die Zeit verzögert wird. Wa bewirkt es? Taste wird gedrückt,
Relais wird geschalten, 10 sek warten, Steckdose wird eingeschalten.
*/
if (val == HIGH){
if(flag==1){
flag=0;
delay (10000);
mySwitch.switchOn("01111", "10000");
}
else
{
flag=1;
digitalWrite(ledPin, HIGH);
}
}
}
/**
* HTML-Seite die dem Client zurückgeschickt wird.
*/
void httpResponse(EthernetClient c) {
c.println("HTTP/1.1 200 OK");
}
/**
* Verarbeitet Client Anfragen und gibt falls vorhanden den GET Query
* String, also alles was in der URL hinter dem ? steht, zurück
*/
char* httpServer() {
EthernetClient client = server.available();
if (client) {
char sReturnCommand[20];
int nCommandPos=-1;
sReturnCommand[0] = '\0';
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if ((c == '\n') || (c == ' ' && nCommandPos>-1)) {
httpResponse(client);
break;
}
if (nCommandPos>-1) {
sReturnCommand[nCommandPos++] = c;
}
if (c == '?' && nCommandPos == -1) {
nCommandPos = 0;
}
}
}
if (nCommandPos!=-1) {
sReturnCommand[nCommandPos] = '\0';
}
// give the web browser time to receive the data
delay(1);
client.stop();
return sReturnCommand;
}
return '\0';
}
Nun muss ich mal sehen wie ich den Impuls von der Power-LED mit integriere. Die Zeit soll ja erst dann laufen wenn der PC runter gefahren ist.
Anders herum wirds dann wohl etwas einfacher, Steckdose an, Sekunde warten Power-Knopf an.
Ich würde mich auch weiterhin freuen wenn der eine oder andere Verbesserungsvorschläge machen würde. Zu meist probiere ich alles aus was ich an Input bekomme.
Das delay würde ich auch gern durch millis ersetzen, nur meiin erster Versuch damit ging leider schonmal schief.
Endlich, der Testsketch für den PC-Shutdown ist fertig. Funktioniert so wie gewollt. Drücken, runterfahren, ausschalten.
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h> // this is new
#include <EthernetServer.h> // so is this
#include <RCSwitch.h>
#include <IRremote.h>
byte mac[] = {
0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36
byte ip[] = {
192, 168, 0, 99 }; // IP-Adresse
EthernetServer server(80);
RCSwitch mySwitch = RCSwitch();
IRsend irsend = IRsend();
const int relaisPin = 13;
const int PowerledIn = 2;
/**int val = 0;*/
int val2 = 0;
int flag,i;
void setup() {
pinMode(relaisPin, OUTPUT);
pinMode(PowerledIn, INPUT);
Ethernet.begin(mac, ip);
server.begin();
mySwitch.enableTransmit(7);
}
void loop()
{
/** int val = digitalRead(ledPin);*/
int val2 = digitalRead(PowerledIn);
char* command = httpServer();
if (strcmp(command, "3an=") == 0)
{
digitalWrite(relaisPin, HIGH);
delay (100);
}
else
{
digitalWrite(relaisPin, LOW);
}
/**hier fängt der Teil an, an dem die Zeit verzögert wird. Wa bewirkt es? Taste wird gedrückt,
Relais wird geschalten, 10 sek warten, Steckdose wird eingeschalten.
*/
if (val2 == LOW){
if(flag==1){
flag=0;
delay (10000);
mySwitch.switchOff("01111", "10000");
}
else
{
flag=1;
digitalWrite(relaisPin, HIGH);
}
}
}
/**
* HTML-Seite die dem Client zurückgeschickt wird.
*/
void httpResponse(EthernetClient c) {
c.println("HTTP/1.1 200 OK");
}
/**
* Verarbeitet Client Anfragen und gibt falls vorhanden den GET Query
* String, also alles was in der URL hinter dem ? steht, zurück
*/
char* httpServer() {
EthernetClient client = server.available();
if (client) {
char sReturnCommand[20];
int nCommandPos=-1;
sReturnCommand[0] = '\0';
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if ((c == '\n') || (c == ' ' && nCommandPos>-1)) {
httpResponse(client);
break;
}
if (nCommandPos>-1) {
sReturnCommand[nCommandPos++] = c;
}
if (c == '?' && nCommandPos == -1) {
nCommandPos = 0;
}
}
}
if (nCommandPos!=-1) {
sReturnCommand[nCommandPos] = '\0';
}
// give the web browser time to receive the data
delay(1);
client.stop();
return sReturnCommand;
}
return '\0';
}
Jetzt brauch ich das ganze nur noch in den ersten Sketch einzubinden, mal sehen was danach noch funktioniert.
Nochmal vielen Dank an alle die ihr Know How im WWW anderen mit weniger Kenntnissen zur Verfügung stellen. So kommt auch ein Laie ans gewünschte Ziel, auch wenns für die Großen unter euch vielleicht etwas nervig ist.
hab mir nen Arduino micro gekauft und wollte nun die RC switch Reciver Demo testen. Und, komischer weise funktionierte erstmal garnix. Hab alle Pins durchgetestet und nix. In dem Sketch steht drin, interupt (0) gleich pin 2. Hab dann hier mal spaßenshalber interupt(1) eingegeben und hochgeladen, auf einmal funktioniert es.
Den Arduino Micro hab ich mir geholt, weil er das Relais für den Powerknopf an meinem PC über Funk steuern soll.
Muss jetzt nur noch den Sketch dafür zusammen basteln und das ganze dann einbauen.
Ja na sicher, am Tage muss ich ja arbeiten. Jetzt liegt Frauchen im Bett, meine Wauzis lassen mich auch grad in ruh, so hab ich um die Zeit wenigstens ruhe.
Wie weit bist du eigentlich mit deinen Steckdosen?
Hab eine Steckdose auseinander gebaut und an den Lichtschalter angeschlossen. Per Fernbedienung geht das wohl aber ich hab ein Taster gekauft der den alten Schalter ersetzen soll. Und ich weiß nicht wie man mit dem Taster, der Dose beibringen kann das Licht anzuschalten.Ich habe 10 Sender und 10 Empfänger. Ich dachte, in jedem Zimmer kommt ein Empfänger und am Arduino nur ein Sender. Ich weiß aber nicht wie man dem Empfänger sagen soll, der soll nur beim code 10000 10000 angehen und im zimmer nebenan nur beim code 00001 00001. Also im Moment empfängt jeder Empfänger jeden code und schaltet.
Ich hab leider keine lernbaren Schalter,damit kenne ich mich noch gar nicht aus. Wenn du da irgendwas erreichen solltest würde ich mich freuen ,wenn du mich auf dem laufenden halten würdest.
Ich muss jetzt erstmal meinem Arduino micro beibringen,das er bei einem 433 Signal irgendeinen Pin schaltet. Wie das nun wieder geht, hab ich erstmal keinen Plan. Das einzige Lebenszeichen was er momentan in Bezug auf 433 MHz von sich gibt ist in zusammenarbeit mit der seriellen Schnittstelle. Das er nur auf ein 433 Signal schaltet wird wohl nicht das Problem sein, das er aber auf ein klar definiertes Signal schaltet, wohl schon eher.
Ich möchte mit einer 433 MHz Funkfernbedienung einen Pin an meinem Arduino steuern. Der Pin soll einfach nur wenn die Taste an der Fernbedienung gedrückt wird für ein paar millisekunden an bleiben. Ich weis zwar wie ich einiges über den Seriellen Monitor abrufen kann, jedoch weis ich nicht wie ich auf diese Daten zugreifen kann um damit etwas zu schalten.
/*
Example for receiving
http://code.google.com/p/rc-switch/
If you want to visualize a telegram copy the raw data and
paste it into http://test.sui.li/oszi/
Need help? http://forum.ardumote.com
*/
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
mySwitch.enableReceive(0); // Receiver on inerrupt 1 => that is pin #2
}
void loop() {
if (mySwitch.available()) {
output(mySwitch.getReceivedValue(), mySwitch.getReceivedBitlength(), mySwitch.getReceivedDelay(), mySwitch.getReceivedRawdata(),mySwitch.getReceivedProtocol());
mySwitch.resetAvailable();
}
}
Versuche schon seit Stunden hier dran rum zu basteln, es kommt nur nix bei raus.
Es ist mir im Endeffekt egal wie er den FB Code empfängt und am ende verarbeitet, ob HEX, Dual, Tristat usw. ist nicht wichtig.
Es soll nur beim richtigen Code ein Relais schalten. Mehr nicht.
Bitte, bitte jede Info wäre hier hilfreich.
Wenn mich jemand sucht, ich bin bei Google.
Hast das schon gelöst oder beiseite gepackt?
Ich weiß jetzt nicht ob du das meinst, aber ich habs mal so gemacht mit einem Taster der den Code von der Steckdose nicht kennt:
void loop() {
if (mySwitch.available()) {
if (mySwitch.getReceivedValue() == 899715139) {
mySwitch.switchOn("11001", "01010");
}
if (mySwitch.getReceivedValue() == 966824003) {
mySwitch.switchOff("11001", "01010");
}
}
}
Ich hab einmal ein Empfänger und ein Sender am Arduino hängen, fals der Empfänger 899715139 empfängt, schaltet er die Steckdose oder ein PIN.
Mein Problem ist nun, da ich nur Steckdose ohne den dazugehörigen Fernbedienung habe, kenne ich weder den Dezimal code noch den Binären. Ich kann nur über die DIPs "10110" senden, da ich kein anderen Code kenne.
Habe im Netz mal probiert umzurechnen aber nix gescheites dabei herausgekommen:
/* See Example: TypeA_WithDIPSwitches */
mySwitch.switchOn("11111", "00010");
delay(1000);
mySwitch.switchOff("11111", "00010");
delay(1000);
/* Same switch as above, but using decimal code */
mySwitch.send(5393, 24);
delay(1000);
mySwitch.send(5396, 24);
delay(1000);
/* Same switch as above, but using binary code */
mySwitch.send("1010100010001");
delay(1000);
mySwitch.send("000000000001010100010100");
delay(1000);
Hab das mit der Funkübertragung auf den zweiten Ardu erstmal bei Seite gelegt. Meine Lösung sieht jetzt erstmal ne Kabelverbindung vor. So laufen auch gleich beide Ardus über ein Netzteil. PC lässt sich jetzt übers Handy ausschalten.
Meine neueste Errungenschaft in Sachen Automatisierung ist jetzt ein Funklichtschalter von Conrad. Der hat keine Dips, ist lernbar, auch auf 433 Mhz. Hat auf Anhieb funktioniert. Hab ihn über meine Fernbedienung programmiert und dann nur noch den Code im Sketch nachgetragen und das Programm für das Handy um zwei Tasten erweitert.
Der Sketchteil den du zeigst wäre dann für den Client oder?
Meine Idee zur Funkübertragung von Aru zu Ardu war ja, das der Mega das ganze Senden übernimmt. Der Micro soll dann den PC ausschalten. Ich merke grad, da fehlt was. Ich brauch ja auch einen Rückkanal, um den Wert der LED am Mega dann auszuwerten, das der dann die Steckdose ausschalten kann. Also müssen dann beide mit Sender und Empfänger ausgerüstet werden.
Werde das mit der LED erstmal über Kabel lösen. Da das schalten des Relais ja ohne Probleme schon funktioniert, sollte der Rest nicht so schwer sein.
Ja ist für den Client.
Wie hast du dass mit der lernbaren Steckdose gemacht? Wie hast du den Code herausgefunden? Ist der auf 433 oder 433,92 Mhz?
Meiner ist nämlich 433,92.
Im Datenblatt steht 433 Mhz, sollte aber egal sei, ob 433 oder 433,92. Zumindest soweit ich überall gelesen habe.
An dem Schalter ist ein ON/OFF Schalter, denn muss man ein paar Sek gedrückt halten, bis er blinkt und dann auf den Knopf auf der Fernbedienung drücken. Schon is das ding programmiert. Die Kanaleinstellung übernimmst du ja dann von deiner Fernbedienung. Ich habe aber auch an meinen Steckdosen festgestellt, das nicht jede Einstellung mit dem Ardu funktioniert, aber mit der Fernbedienung. Wenn ich alle Dips an der Fernbedienung auf ON stelle, dann funktioniert es komischerweise nicht über den Ardu. Weis nicht ob das immer so sein wird. Musst du probieren.
Wollte nur mal kund tun, das ich mit meinem Projekt immernoch beschäftigt bin. Hab mir jetzt ein neues Spielzeug dafür zugelegt.
Alles weitere könnt ihr im Video sehen wenn ihr wollt.
Ja cooles Gadget die Uhr. Ich hab die Sony (alte Version) und bekomme es einfach nicht hin eine app für die Uhr zu schreiben. Ich verzweifle an eclipse und unter b4a gibt es leider keine Unterstützung dazu, für Anfänger wie ich einer bin.
Darf ich Fragen wie du die app geschrieben hast. Und wie ist die Unterstützung vom Hersteller?
Grüße aus Tempelhof
Die App hab ich nich geschrieben, dafür is ein anderer verantwortlich. Musst mal unter NetIO bei http://netio.davideickhoff.de/ schauen, da findest du alles zu der App. Is aber nur für Android und Apple. Individuell einstellen kannst du sie dann selbst auf der Website.
Was die Uhr von Samsung anbelang, da is der Support eher nicht vorhanden, die versuchen einem eher noch Steine in den Weg zu legen sich ein Gerät zu schaffen welches einen echten Mehrwert hat.
Auf meiner Uhr läuft ein modifiziertes Android, das Orginal ist einfach zusehr eingeschränkt. Alles rund ums Handy und seinen Möglichkeiten findest du bei den XDA-Developers http://www.xda-developers.com/.
Bin leider im Programieren auch keine Leuchte. Mir liegt da das Finden von Möglichkeiten im Netz eher.