Hallo,
Ich habe mir in der Bucht 433 mhz, cc1101 Empfänger bestellt ( https://www.ebay.de/itm/311720156783 ). Ich möchte mit diesen Teilen bestimmte Aktion vom Arduino ausführen lassen. Die Teile sollen auf handelsübliche Funkfernbedienungen für Steckdosen (Funksteckdosen) reagieren, wenn auf diesen an oder aus gedrückt wird. Die eine Funkfernbedienung die ich habe arbeitet auf 433,92 MHz. Die andere ist in 4 Stufen einstellbar auf 433,05-433,79Mhz. Ich habe das Teil jetzt entsprechend mit dem arduino verkabelt.
Arduino CC1101
VCC 3,3 V VDD / PIN 1
PIN D11 SI (MOSI) / PIN 3
PIN D13 SCK / PIN 4
PIN D12 SO (MISO) / PIN 5
PIN D02 GDO2 / PIN 6
PIN D10 CSn (SS) / PIN 7
PIN D03 GDO0 / PIN 8
PIN GND GND / PIN 9
unbelegt PIN 2 & 10
Als Libary nutze ich die "Panstamp" (siehe Anhang). Als Testprogramm habe ich jetzt folgendes laufen um zu sehen ob die Teile überhaupt mit dem Arduino kommunizieren.
#include "EEPROM.h"
#include "cc1101.h"
// The LED is wired to the Arduino Output 4 (physical panStamp pin 19)
#define LEDOUTPUT 4
// The connection to the hardware chip CC1101 the RF Chip
CC1101 cc1101;
byte b;
byte i;
byte syncWord = 199;
long counter=0;
byte chan=0;
// a flag that a wireless packet has been received
boolean packetAvailable = false;
void blinker(){
digitalWrite(LEDOUTPUT, HIGH);
delay(100);
digitalWrite(LEDOUTPUT, LOW);
delay(100);
}
/* Handle interrupt from CC1101 (INT0) gdo0 on pin2 */
void cc1101signalsInterrupt(void){
// set the flag that a package is available
packetAvailable = true;
}
void setup()
{
Serial.begin(38400);
Serial.println("start");
// setup the blinker output
pinMode(LEDOUTPUT, OUTPUT);
digitalWrite(LEDOUTPUT, LOW);
// blink once to signal the setup
blinker();
// initialize the RF Chip
cc1101.init();
cc1101.setSyncWord(&syncWord, false);
cc1101.setCarrierFreq(CFREQ_433);
cc1101.disableAddressCheck(); //if not specified, will only display "packet received"
//cc1101.setTxPowerAmp(PA_LowPower);
Serial.print("CC1101_PARTNUM "); //cc1101=0
Serial.println(cc1101.readReg(CC1101_PARTNUM, CC1101_STATUS_REGISTER));
Serial.print("CC1101_VERSION "); //cc1101=4
Serial.println(cc1101.readReg(CC1101_VERSION, CC1101_STATUS_REGISTER));
Serial.print("CC1101_MARCSTATE ");
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);
attachInterrupt(0, cc1101signalsInterrupt, FALLING);
Serial.println("device initialized");
}
void ReadLQI()
{
byte lqi=0;
byte value=0;
lqi=(cc1101.readReg(CC1101_LQI, CC1101_STATUS_REGISTER));
value = 0x3F - (lqi & 0x3F);
Serial.print("CC1101_LQI ");
Serial.println(value);
}
void ReadRSSI()
{
byte rssi=0;
byte value=0;
rssi=(cc1101.readReg(CC1101_RSSI, CC1101_STATUS_REGISTER));
if (rssi >= 128)
{
value = 255 - rssi;
value /= 2;
value += 74;
}
else
{
value = rssi/2;
value += 74;
}
Serial.print("CC1101_RSSI ");
Serial.println(value);
}
void loop()
{
if(packetAvailable){
Serial.println("packet received");
// Disable wireless reception interrupt
detachInterrupt(0);
ReadRSSI();
ReadLQI();
// clear the flag
packetAvailable = false;
CCPACKET packet;
if(cc1101.receiveData(&packet) > 0){
if(!packet.crc_ok) {
Serial.println("crc not ok");
}
if(packet.length > 0){
Serial.print("packet: len ");
Serial.print(packet.length);
Serial.print(" data: ");
for(int j=0; j<packet.length; j++){
Serial.print(packet.data[j],HEX);
Serial.print(" ");
}
Serial.println(".");
}
}
// Enable wireless reception interrupt
attachInterrupt(0, cc1101signalsInterrupt, FALLING);
}
}
Im Serial-Monitor kommt jetzt auch mehrfach pro sekunde folgende Meldung:
packet received
CC1101_RSSI 98
CC1101_LQI 63
Wobei der Wert für rssi und LOI Immer unterschiedlich ist.
Nun bin ich aber ratlos, wie ich die Signale / Kennung von der Funkfernbedienung erfassen / auslesen kann. Hat jemand von euch Erfahrung mit den Dingern und kann mir beim Programmcode helfen?
Es gibt da so ein Beispiel für Infrarot-Fernbedienungen ( Besispiel Infrarot Fernbedienung ) so ähnlich würde ich das gern mit der Funkfernbedienung realisieren.
Vielen Dank für Eure Unterstützung.
Panstamp.zip (125 KB)