Senderprogramm für Attiny
Für Attiny gibt es hier ein leicht abgeändertes Senderprogramm, da sich nämlich folgendes herausstellte: Sobald echte Messwerte von Sensoren über die I2C-Schnittstelle mit der Attiny-Library "TinyWireM" abgeholt werden, funktioniert das Sendeprogramm nicht, da sich offensichtlich TinyWireM und Metro nicht "vertragen" (Timerproblem?). Daher nun eine Version ohne Metro, wo die Messwertabfrage (hier am Beispiel eines Temperatursensors MCP9808) und die Messwertübertragung alle 5 Sekunden stattfinden. Da der Attiny in der Zwischenzeit wirklich nichts zu tun hat, wird die Zeitverzögerung bis zum nächsten Durchlauf mit "delay(5000)" realisiert.
Sendeprogramm für Attiny mit Verwendung von Pointer:
//Projekt Funkuebertragung
//Code fuer Attiny85
//Author Retian
//Version 2.0
#include <VirtualWire.h>
#include <MyMCP9808.h>
//Temperatursensor MCP9808
MyMCP9808 My9808(0x18);
float Temp9808;
#define LED 4
#define txPin 1 //Ausgang zum Sendemodul
String SlaveAdresse = "#2"; //ID des Senders
const int anzBytes = 27; //Telegrammlaenge
byte Sendebuffer[anzBytes];
byte buflen = anzBytes;
byte checkSum = 0;
//Definiton des Sendertelegramms
#define SenderIDByteAnf 0 //Byte 0-1
#define SenderIDByteEnd 1
#define MessungIDByte 2 //Byte 2 derzeit Reserve (=0)
#define Messwert1ByteAnf 3 //Byte 3-6
#define Messwert1ByteEnd 6
#define Messwert2ByteAnf 7 //Byte 7-10
#define Messwert2ByteEnd 10
#define Messwert3ByteAnf 11 //Byte 11-14
#define Messwert3ByteEnd 14
#define Messwert4ByteAnf 15 //Byte 15-18
#define Messwert4ByteEnd 18
#define Messwert5ByteAnf 19 //Byte 19-22
#define Messwert5ByteEnd 22
//#define Reserve 23
//#define Reserve 24
//#define Reserve 25
#define CheckSumByte 26 //Byte 26
#define CheckSumByteAnf 0
#define CheckSumByteEnd 25
float Messwert[5];
byte* pdummy = NULL; //Pointer mit 1 Byte Laenge auf NULL
//Pointer auf Messwert[0]
float* pMesswert = &Messwert[0];
void setup() {
TinyWireM.begin();
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);//Deklarationen Library VirtualWire
vw_set_tx_pin(txPin); //Setze tx-Pin
vw_setup(1000); //Uebertragungsrate 1000 Bit/Sekunde
}
void loop() {
//Ermittlung der Messwerte
//Temperaturfuehler MCP9808
if (My9808.isReady()) Temp9808 = My9808.readTemp();
//Hier werden spaeter weitere Messwerte abgefragt bzw. ermittelt
//Uebermittlung an Empfaenger
//Beschreiben des Sendetelegramms Sendebuffer[i]
//Sender-ID ins Telegramm schreiben
char ZwiBuf[3];
SlaveAdresse.toCharArray(ZwiBuf, 3); //String "SlaveAdresse" in CharArray umwandeln
for (int i = SenderIDByteAnf; i <= SenderIDByteEnd; i++) Sendebuffer[i] = (char)ZwiBuf[i];Sendebuffer[MessungIDByte] = 0;//Reserve, derzeit nicht in Verwendung
//Messwerte ins Telegramm schreiben
//Kopieren der Messergebnisse zu "Messwert[0] - [4]"
Messwert[0] = Temp9808;;
Messwert[1] = 0;
Messwert[2] = 0;
Messwert[3] = 0;
Messwert[4] = 0;pdummy = (byte*)pMesswert; //Pointer von dummy auf Adresse von Messwert setzen
//4 * 5 Bytes von Messwert[0]-[4] in Sendebuffer[i] kopieren
for (int i = Messwert1ByteAnf; i <= Messwert5ByteEnd; i++)
{
Sendebuffer[i] = *pdummy;
pdummy++;
}//Ermittlung der Checksumme
checkSum = 0;
for (byte i = CheckSumByteAnf; i <= CheckSumByteEnd; i++)
{
CheckByte(Sendebuffer[i], i);
}
Sendebuffer[CheckSumByte] = checkSum;//Wenn Telegramm gesendet wird, LED 1x blinken
digitalWrite(LED, HIGH);
delay(10);
digitalWrite(LED, LOW);//Senden des Telegramms und warten bis alle Daten gesendet sind
vw_send((byte*)Sendebuffer, buflen);
vw_wait_tx();delay(5000);
}
//Checksummenbildung
void CheckByte(byte buf, byte i)
{
for (int j = 0; j < 8; j++)
{
if (bitRead(buf, j) == 1) checkSum += (i + j + 1);
}
}