本帖最后由 syjjx 于 2017-10-6 10:38 编辑
看到@step0766的帖子,利用树莓派发射射频信号,打算采集下家里的杜亚窗帘的射频码,结果发现并不行,后来查了相关资料,发现用arduino默认的rc-switch的库是不行的,所以根据杜亚的射频信号修改了一下。
附件中是修改后的rc-switch库
以下是采集和测试发送的代码
---------采集-----------------int logfile[40]; int i = 0; float lastTime = 0; boolean capturing = false; boolean checking = false; boolean dataIncoming = false;
void setup() { Serial.begin(9600); Serial.println("start..."); pinMode(2, INPUT); attachInterrupt(0, handleInterrupt, CHANGE); }
void loop() { }
void handleInterrupt() {
if (!capturing) { //wenn keine Aufnahme läuft if (!checking) { //wenn nicht gerade auf "Start-Signal" geprüft wird if (digitalRead(2) == HIGH) { //wenn Wechsel von LOW nach (jetzt) HIGH lastTime = micros(); checking = true; } }
else { //wenn gerade auf Start-Signal geprüft wird if ((micros() - lastTime > 4000) && (digitalRead(2) == LOW)) { //wenn HIGH-Phase länger als 4ms war und wir jetzt LOW sind //das war das Start-Signal checking = false; capturing = true; lastTime = micros(); }
else { //das war nicht das Start-Signal checking = false; } } }
else { //es läuft eine Aufnahme if (!dataIncoming) { //bisher noch keine Nutzdaten empfangen if ((micros() - lastTime > 1000) && digitalRead(2) == HIGH) { //das war die lange LOW-Phase vor Beginn der Übertragung dataIncoming = true; //ab jetzt kommen Daten lastTime = micros(); } }
else { //jetzt wird es interessant, jetzt kommen die Daten //wenn steigene Flanke (also jetzt HIGH) if (digitalRead(2) == HIGH) { //Beginn der HIGH-Phase merken lastTime = micros(); }
//wenn fallende Flanke (also jetzt LOW) else if (digitalRead(2) == LOW) { //=> prüfe wie lange HIGH war if (micros() - lastTime > 500) { //long logfile = 1; }
else { //short logfile = 0; }
if (i < 39) { //solange noch nicht alle Bits empfangen wurden i++; }
else { //wir sind fertig noInterrupts(); //Interrupts aus damit Ausgabe nicht gestört wird Serial.println("Empfangene Daten:"); //Ausgabe als "quad-bit" for (i = 0; i <= 38; i = i + 2) { if ((logfile == 0) && (logfile[i+1] == 0)) Serial.print("0");
else if ((logfile == 0) && (logfile[i+1] == 1)) Serial.print("F");
else if ((logfile == 1) && (logfile[i+1] == 0)) Serial.print("Q");
else if ((logfile == 1) && (logfile[i+1] == 1)) Serial.print("1"); } Serial.println(); i = 0; dataIncoming = false; capturing = false; interrupts(); //Interrupts wieder an return; //und alles auf Anfang } }
} } } ---------采集-----------------
---------发送-----------------
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() { Serial.begin(9600); Serial.println("Starting..."); mySwitch.enableTransmit(12); mySwitch.setProtocol(4); }
void loop() { Serial.println("Up...");
mySwitch.sendQuadState("0F0F00FQ00FQQ10F0F0F"); mySwitch.sendQuadState("0F0F00FQ00FQQ10F0F1Q");
delay(2000);
Serial.println("Stop..."); mySwitch.sendQuadState("0F0F00FQ00FQQ10FFFFF");
delay(2000);
Serial.println("Down...");
mySwitch.sendQuadState("0F0F00FQ00FQQ10F0101"); mySwitch.sendQuadState("0F0F00FQ00FQQ10F0110");
delay(2000);
Serial.println("Stop..."); mySwitch.sendQuadState("0F0F00FQ00FQQ10FFFFF");
delay(2000); }
----------发送-------------
rc-switch.zip
(36.88 KB, 下载次数: 234)
|