Hallo an alle Forummitglieder
Ich habe immer noch nur einfachste Grundkentnisse mit Arduino.
Ich möchte den Eigenverbrauch meiner Photovoltaikanlage erhöhen und lese meinen Semax Smartmeter mit DMSR v5.0.2- Protokll über ein RJ12 Kabel und Arduino Uno aus. Mein Ziel ist es, über Relais (an Pin 2,3,4,5,6,7,11,12), Verbraucher anzusteuern.
Dank dem Forum (Dezimalzahl aus Char-Datensatz auslesen) kann ich die nötigen Daten erfolgreich auslesen, aber komme mit der Ansteuerung der Relais nicht weiter.
Mein Ziel ist es, nach jeder einzelnen If-Bedingung (Relais ein oder aus) einen neuen Datensatz abzuwarten:
if (leistung > 1.300) {
digitalWrite(Relais1_10A_Shield_2, HIGH);
*//neuer Datensatz abwarten*
}
if (leistung > 0.200) {
digitalWrite(Relais2_10A_Shield_2, HIGH);
*//neuer Datensatz abwarten*
}
Vom Stromzähler wird alle 10s einen neuen Datensatz gesendet.
Ich habe das Mal damit versucht:
while (!altSerial.available());
Ich glaube jedoch, dass sich diese Bedingung auch auf den vorgängigen Datensastz bezieht, anstatt auf einen neu gesendeten. Daher kam mir der Gedanke den alten Datensatz mit memset zu löschen. Aber ich hatte mit meinen Versuchen als Anfänger wenig erfolg.
Wie würdet ihr vorgehen? Habt ihr ein Beispiel, dass mir weiterhelfen könnte?
Ich hoffe ihr könnt mir weiterhelfen.
Grüße
Hier noch der aktuelle komplette Sketch:
#include <AltSoftSerial.h>
#define RX_PIN 8
#define TX_PIN 9
AltSoftSerial altSerial;
char c;
int Relais1_3A_Shield_1=7;
int Relais2_3A_Shield_1=6;
int Relais3_3A_Shield_1=5;
int Relais4_3A_Shield_1=4;
int Relais1_10A_Shield_2=2;
int Relais2_10A_Shield_2=3;
int Relais3_10A_Shield_2=11;
int Relais4_10A_Shield_2=12;
void setup() {
Serial.begin(115200);
Serial.println("\nStart");
//altSerial.begin(115200);
altSerial.begin(115200);
pinMode(2, OUTPUT); //Relais 1 10A Shield2
pinMode(3, OUTPUT); //Relais 2 10A Shield2
pinMode(4, OUTPUT); //Relais 4 3A Shield1
pinMode(5, OUTPUT); //Relais 3 3A Shield1
pinMode(6, OUTPUT); //Relais 2 3A Shield1
pinMode(7, OUTPUT); //Relais 1 3A Shield1
pinMode(11, OUTPUT);//Relais 3 10A Shield2
pinMode(12, OUTPUT);//Relais 4 10A Shield2
}
void recvWithEndMarker(float &leistung) {
const byte maxChars = 32;
static char receivedChars[maxChars] = {'\0'};
static byte ndx = 0;
const char endMarker = '\n';
char rc;
if (altSerial.available()) {
c = altSerial.read();
c &= ~(1 << 7);
char inChar = (char)c;
Serial.print(c);
if (c != endMarker) {
if (ndx < maxChars - 1) {
receivedChars[ndx] = c;
ndx++;
receivedChars[ndx] = '\0';
}
} else {
//Serial.println(receivedChars);
if (!strncmp(receivedChars, "1-0:2.7.0(", 10))
{
char* zeigerKlammerAuf = strchr(receivedChars, '(');
leistung = strtod(zeigerKlammerAuf + 1, NULL); // stoppt automatisch beim *
}
receivedChars[ndx] = '\0'; // terminate the string
ndx = 0;
}
}
}
void loop() {
float leistung = -1; // doch wieder jeden loop neu:
recvWithEndMarker(leistung);
if (leistung >= 0) {
Serial.print(F("Leistung = "));
Serial.println(leistung, 3);
if (leistung > 0.000) {
Serial.println("true");
} else {
Serial.println("false");
}
if (leistung > 1.300) {
digitalWrite(Relais1_10A_Shield_2, HIGH);
delay (12000);
}
if (leistung > 0.200) {
digitalWrite(Relais2_10A_Shield_2, HIGH);
delay (12000);
}
if (leistung > 1.500) {
digitalWrite(Relais3_10A_Shield_2, HIGH);
delay (12000);
}
if (leistung < 0.200) {
digitalWrite(Relais3_10A_Shield_2, LOW);
delay (12000);
}
if (leistung < 0.100) {
digitalWrite(Relais2_10A_Shield_2, LOW);
delay (12000);
}
if (leistung < 0.010) {
digitalWrite(Relais1_10A_Shield_2, LOW);
delay (12000);
}
}
}