/////////////////////////// M.Kirchner 2017 ////////////////////////////
////////////////////////////////////////////////////////////////////////
#include //TSIC Bibliothek von http://www.arduinolibraries.info/libraries/tsic
#define LED 2 //Port der angeschlossenen LED
#define LEDON digitalWrite(LED, HIGH); // LED einschalten
#define LEDOFF digitalWrite(LED, LOW); //LED Ausschalten
#define FaktorV1 0.2248 //Faktor für einen Spannungsteiler mit 1k / 20 k Widerstände
#define FaktorV2 0.2248 //Faktor für einen Spannungsteiler mit 1k / 20 k Widerstände
static byte RXbyte1 = 0;
static byte RXbyte2 = 0;
float V1; // Spannungswert 1
float V2; // Spannungswert 2
uint16_t dtemp1 = 0; // Digitaler Temperaturwert des ersten TSIC Sensors
float T1 = 0; // Temperaturwert in °C des Sensors 1
uint16_t dtemp2 = 0; // Digitaler Temperaturwert des zweiten TSIC Sensors
float T2 = 0; // Temperaturwert in °C des Sensors 2
TSIC Sensor1(7,9); // Ein TSIC Sensor an PIN 7 mit Vss an PIN 9
TSIC Sensor2(8,9); // Ein TSIC Sensor an PIN 8 mit Vss an PIN 9
byte Nachricht[45] = { // Die Nachricht
0x7C,0x8D,0x00,0xD0,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0x00,0x7D,0x00};
//-------------------------------------------------------------------------------
void SEND_MSG() // Nachricht an den Empfänger senden
{
Nachricht[44] = CALCsm(Nachricht); // Checksumme einfügen
for(int i = 0; i < 45; i++)
{
Serial.write (Nachricht[i]); // Nachricht Byteweise versenden
delayMicroseconds(1600);
Serial.read(); // Selbstgesendete Zeichen aus dem Lesebuffer entfernen
}
}
//-------------------------------------------------------------------------------
byte CALCsm (byte *data) // Checksumme berechnen
{
byte sum = 0;
for (byte index = 0; index <= 43; index++) {sum = sum + data [index];}
return sum;
}
//-------------------------------------------------------------------------------
void SETV1(float Spannung) // Wert der Spannung 1 (A0) in 2 Byte zerlegen und in die Nachricht schreiben
{
uint16_t val = (uint16_t) (Spannung * 10);
byte BYTE_low = (byte) (val&255);
byte BYTE_high = (byte)(val >> 8);
Nachricht[12] = BYTE_low;
Nachricht[13] = BYTE_high;
}
//-------------------------------------------------------------------------------
void SETV2(float Spannung) // Wert der Spannung 2 (A1) in 2 Byte zerlegen und in die Nachricht schreiben
{
uint16_t val = (uint16_t) (Spannung * 10);
byte BYTE_low = (byte) (val&255);
byte BYTE_high = (byte)(val >> 8);
Nachricht[14] = BYTE_low;
Nachricht[15] = BYTE_high;
}
//-------------------------------------------------------------------------------
float ReadV1() // Spannung 1 messen und mit Faktor versehen
{
uint16_t Vd = analogRead(0);
float V=((float)Vd/10)*FaktorV1;//Mit Faktor der genutzten Widerstände des Spannungsteilers verrechnen
return V;
}
//-------------------------------------------------------------------------------
float ReadV2() // Spannung 2 messen und mit Faktor versehen
{
uint16_t Vd = analogRead(1);
float V=((float)Vd/10)*FaktorV2;//Mit Faktor der genutzten Widerstände des Spannungsteilers verrechnen
return V;
}
//-------------------------------------------------------------------------------
void setup() {
// put your setup code here, to run once:
Serial.begin (19200); // Serielle Schnitstelle mit 19200 BAUD starten
pinMode(LED, OUTPUT); // Port für LED auf OUTPUT stellen
analogReference(INTERNAL); //Auswahl der analogen Referenzspannung
}
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
void loop()
{//Start Loop
if (Serial.available() >=0) // Wenn mindestens ein Byte im Empfangsspeicher bereit liegt
{//Byte Empfangen
RXbyte1 = Serial.read(); // Ein Byte lesen
if ((RXbyte1==0x80)) // Wenn das Byte den wert 0x80 hat
{//Byte 1 gelesen // Ws wird nicht ausgewertet welches Modulk vom Empfänger angefragt wurde
// Dieses Verfahren hat sehr gut funktioniert
//Mit der Auswertung des zweiten Bytes (0x8D etc) gab es bei manchen Empfängern Schwierigkeiten
LEDON //Einschalten der LED
V1=ReadV1(); // Messen der Spannung V1 an A0
V2=ReadV2(); // Messen der Spannung V2 an A1
SETV1(V1); // Die Spannungswerte für V1 in die entsprechenden Bytes der Nachricht schreiben
SETV2(V2); // Die Spannungswerte für V2 in die entsprechenden Bytes der Nachricht schreiben
if (Sensor1.getTemperature(&dtemp1)) {T1 = Sensor1.calc_Celsius(&dtemp1);} //Temperatur des ersten TSIC Sensors einlesen und auf Gültigkeit überprüfen
if (Sensor2.getTemperature(&dtemp2)) {T2 = Sensor1.calc_Celsius(&dtemp2);} //Temperatur des zweiten TSIC Sensors einlesen und auf Gültigkeit überprüfen
Nachricht[16]=(byte)T1+20; // Temp 1 mit Offsett versehen und in das entsprechende Byte schreiben
Nachricht[17]=(byte)T2+20; // Temp 2 mit Offsett versehen und in das entsprechende Byte schreiben
delay(5);
SEND_MSG(); //Die komplette Nachricht an den Empfänger schicken
delay(10);
LEDOFF //LED Ausschalten
delay(10);
}//Byte 1 gelesen
}//Byte Empfangen
}//End Loop
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
|