Hallo in die Runde,
weil ich ein paar Beiträge vorher etwas von "Senden mit dem Empfänger" und "Empfangen mit dem Sender" gelesen habe.
Ich habe ganz aktuell für ein Projekt an der Uni die Sketches umgeschrieben, damit der Empfänger der via UART am Raspberry hängt parallel auch senden kann und ein Sender sowohl empfängt als auch Daten sendet.
Hier mal die Sketches (sind noch nicht ganz sauber und ordentlich, funktionieren aber fürs erste
)
Receiver (+ UART lesen & Funk senden)
// RFM12B Receiver for RaspberryPI
//
// Basiert zum Teil auf der Arbeit von Nathan Chantrell
//
// modified by meigrafd @ 16.12.2013 - for UART on RaspberryPI
// modified by bigdane69 @ 27.01.2015 - for UART read and send 433mhz
//------------------------------------------------------------------------------
#include <RFM12B.h>
#include <avr/sleep.h>
#include <SoftwareSerial.h>
//------------------------------------------------------------------------------
// You will need to initialize the radio by telling it what ID it has and what network it's on
// The NodeID takes values from 1-127, 0 is reserved for sending broadcast messages (send to all nodes)
// The Network ID takes values from 0-255
// By default the SPI-SS line used is D10 on Atmega328. You can change it by calling .SetCS(pin) where pin can be {8,9,10}
#define NODEID 22 //network ID used for this unit
#define NETWORKID 210 //the network ID we are on
#define ACK_TIME 2000 // # of ms to wait for an ack
#define SERIAL_BAUD 9600
#define SENDTO 23
#define requestACK true
//------------------------------------------------------------------------------
// PIN-Konfiguration
//------------------------------------------------------------------------------
// UART pins
#define rxPin 7 // D7, PA3
#define txPin 3 // pin an den der 433 Mhz Sender angeschlossen ist (D3, PA7)
// LED pin
#define LEDpin 8 // D8, PA2 - set to 0 to disable LED
/*
+-\/-+
VCC 1| |14 GND
(D0) PB0 2| |13 AREF (D10)
(D1) PB1 3| |12 PA1 (D9)
RESET 4| |11 PA2 (D8)
INT0 PWM (D2) PB2 5| |10 PA3 (D7)
PWM (D3) PA7 6| |9 PA4 (D6)
PWM (D4) PA6 7| |8 PA5 (D5) PWM
+----+
*/
//encryption is OPTIONAL
//to enable encryption you will need to:
// - provide a 16-byte encryption KEY (same on all nodes that talk encrypted)
// - to call .Encrypt(KEY) to start en
// - to stop encrypting call .Encrypt(NULL)
//#define KEY "ABCDABCDABCDABCD"
// Initialise UART
SoftwareSerial mySerial(rxPin, txPin);
// Need an instance of the Radio Module
RFM12B radio;
//char msg[26];
String inputString = "";
//##############################################################################
static void activityLED (byte mode) {
pinMode(LEDpin, OUTPUT);
digitalWrite(LEDpin, mode);
}
// blink led
static void blink (byte pin, byte n = 3) {
pinMode(pin, OUTPUT);
for (byte i = 0; i < 2 * n; ++i) {
delay(100);
digitalWrite(pin, !digitalRead(pin));
}
}
// init Setup
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
mySerial.begin(SERIAL_BAUD);
radio.Initialize(NODEID, RF12_433MHZ, NETWORKID);
#ifdef KEY
radio.Encrypt((byte*)KEY); //comment this out to disable encryption
#endif
if (LEDpin) {
activityLED(1); // LED on
delay(1000);
activityLED(0); // LED off
}
}
// Loop
void loop() {
if (radio.ReceiveComplete()) {
if (radio.CRCPass()) {
//node ID of TX, extracted from RF datapacket. Not transmitted as part of structure
mySerial.print(radio.GetSender(), DEC);
mySerial.print(" ");
int i;
for (byte i = 0; i < *radio.DataLen; i++) //can also use radio.GetDataLen() if you don't like pointers
mySerial.print((char) radio.Data[i]);
if (LEDpin) {
blink(LEDpin, 2);
}
if (radio.ACKRequested()) {
radio.SendACK();
}
} else {
mySerial.print("BAD-CRC");
if (LEDpin) {
activityLED(1); // LED on
delay(1000);
activityLED(0); // LED off
}
}
mySerial.println();
}
while (mySerial.available()>0){
char inChar = (char)mySerial.read();
inputString += inChar;
}
if (inputString != ""){
char msg[inputString.length() + 1];
inputString.toCharArray(msg,inputString.length() + 1);
activityLED(1); // LED on
radio.Send(SENDTO, (uint8_t *)msg, strlen(msg), requestACK);
radio.SendWait(2);
activityLED(0); // LED off
inputString = "";
//strcpy(msg,"");
msg[0] = (char)0;
}
}
Display More
Externer Sender / Empfänger (wird bei mir zur Steuerung der Kaffeemaschine verwendet, empfängt Daten, reagiert darauf und meldet Daten zurück)
// RFM12B Receiver for RaspberryPI
//
// Basiert zum Teil auf der Arbeit von Nathan Chantrell
//
// modified by meigrafd @ 16.12.2013 - for UART on RaspberryPI
// modified by bigdane69 @ 27.01.2015 - for receiving and sending with a sender board
//------------------------------------------------------------------------------
#include <RFM12B.h>
#include <avr/sleep.h>
#include <SoftwareSerial.h>
//------------------------------------------------------------------------------
// You will need to initialize the radio by telling it what ID it has and what network it's on
// The NodeID takes values from 1-127, 0 is reserved for sending broadcast messages (send to all nodes)
// The Network ID takes values from 0-255
// By default the SPI-SS line used is D10 on Atmega328. You can change it by calling .SetCS(pin) where pin can be {8,9,10}
#define NODEID 23 //network ID used for this unit
#define NETWORKID 210 //the network ID we are on
#define ACK_TIME 2000 // # of ms to wait for an ack
#define SERIAL_BAUD 9600
#define GATEWAYID 22
#define requestACK false
//------------------------------------------------------------------------------
// PIN-Konfiguration
//------------------------------------------------------------------------------
// LED pin
#define LEDpin 8 // D8, PA2 - set to 0 to disable LED
// Coffee pins
#define Powerpin 7
#define Cookpin 3
#define Readypin 0
// Need an instance of the Radio Module
RFM12B radio;
// Variables
char myChar;
String inputString;
boolean ready;
//##############################################################################
static void redLED (byte mode) {
pinMode(LEDpin, OUTPUT);
digitalWrite(LEDpin, mode);
}
static void cookCoffee () {
pinMode(Cookpin, OUTPUT);
digitalWrite(Cookpin, 1);
digitalWrite(Cookpin, 0);
delay(500);
digitalWrite(Cookpin, 1);
}
static void power (byte mode) {
pinMode(Powerpin, OUTPUT);
digitalWrite(Powerpin, mode);
}
// init Setup
void setup() {
radio.Initialize(NODEID, RF12_433MHZ, NETWORKID);
#ifdef KEY
radio.Encrypt((byte*)KEY); //comment this out to disable encryption
#endif
pinMode(Powerpin, OUTPUT);
digitalWrite(Powerpin, 1);
pinMode(Cookpin, OUTPUT);
digitalWrite(Cookpin, 1);
if (LEDpin) {
redLED(1); // LED on
delay(500);
redLED(0); // LED off
delay(500);
redLED(1); // LED on
delay(500);
redLED(0); // LED off
delay(500);
redLED(1); // LED on
delay(500);
redLED(0); // LED off
}
}
// Loop
void loop() {
if (radio.ReceiveComplete()) {
if (radio.CRCPass()) {
//node ID of TX, extracted from RF datapacket. Not transmitted as part of structure
int i;
for (byte i = 0; i < *radio.DataLen; i++) //can also use radio.GetDataLen() if you don't like pointers
myChar = (char)radio.Data[i];
inputString += myChar;
if (inputString == "n") {
power(0);
ready = false;
while (ready == false) {
ready = true;
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(500);
}
String message = "ready";
char msg[message.length() + 1];
message.toCharArray(msg,message.length() + 1);
radio.Send(GATEWAYID, (uint8_t *)msg, strlen(msg),requestACK);
radio.SendWait(2);
}
if (inputString == "f") {
power(1);
}
if (inputString == "c") {
redLED(1);
ready = false;
while (ready == false) {
ready = true;
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(500);
}
cookCoffee();
delay(3000);
ready = false;
while (ready == false) {
ready = true;
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(200);
if (digitalRead(Readypin) == HIGH) { ready = false; }
delay(500);
}
String message = "finished";
char msg[message.length() + 1];
message.toCharArray(msg,message.length() + 1);
radio.Send(GATEWAYID, (uint8_t *)msg, strlen(msg),requestACK);
radio.SendWait(2);
redLED(0);
}
if (radio.ACKRequested()) {
radio.SendACK();
}
inputString = "";
}
}
}
Display More
Vielleicht hilft es ja jemandem weiter, habe zuvor noch keine Sketches gefunden die diese Anforderungen erfüllen.
Die Stromversorgung für den externen Sender (der nun auch empfängt) ist ein echter Knackpunkt. Da er nicht schlafen geht wird er wesentlich mehr Strom ziehen. Das muss ich nun mal beobachten.
Für Verbesserungsvorschläge bin ich immer dankbar.
Beste Grüße
bigdane