Hallo in die Runde,
für ein kleines Projekt möchte ich gerne folgende Werte über die seriellen Schnittstelle einlesen, zerstückeln und dann bei Thingspeak hochschieben.
#00 200428173601 428 379 2000 80 2640 R--?
Hinter dem beiden "-- " kommt noch ein CR und LF
Habe mir überall was zusammen gesucht und nach besten Gewissen und Wissen zusammengeschustert.
Läuft auch soweit rund nur leider nicht über mehrere Tage
Hier der Code dazu:
// Libraries
#define debug // debug ein/aus
#include <EthernetENC.h> // Ethernet shield
#include <ThingSpeak.h> // Thinkspeak
// SETTINGS - SETTINGS
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xFB, 0x80 }; // MAC
IPAddress ip(192, 168, 0, 15); // Feste IP
EthernetClient client; // Ethernet Library als Cleint initialisieren
unsigned long myChannelNumber = xxx; // ThingSpeak Channel
const char * myWriteAPIKey = "xxx"; // ThingSpeak WriteAPI
int f_druck = 0;
int f_percent = 0;
int f_height = 0;
int f_volume = 0;
String daten = ""; // eingelesene serielle daten
String html_daten = "no data to display !"; // html webseitendaten
String key = ""; // #00 Erkennung
//SETUP - SETUP
void setup() {
Serial.begin(9600); // Serielle Kommunikation starten
Serial.setTimeout(1500); // RX Buffer Timeout
pinMode(9, OUTPUT); // OnBoard LED auf Output
Serial.println(""); // CR über Serial
Ethernet.begin(mac, ip); // Ethernet Verbindung mit fester IP initialisieren
#ifdef debug
Serial.print("Arudino gestartet. IP: "); // IP des Arduinos ausgeben
Serial.println(Ethernet.localIP()); // IP des Arduinos ausgeben
#endif
ThingSpeak.begin(client); // Initialize ThingSpeak
}
// LOOP - LOOP
void loop() {
while (Serial.available() > 0) { // checken ob mehr als ein Zeichen im Serial Buffer is
digitalWrite(9, HIGH); // led on
delay(500); // etwas warten
digitalWrite(9, LOW); // led off
delay(1500); // etwas warten
daten = Serial.readString(); // liest ankommende daten in "daten"
#ifdef debug
Serial.println(" ");
Serial.println(daten.length()); //wie viele Zeichen wurden gelesen
Serial.print("Inhalt :");
Serial.println(daten); //anzeigen der eingelesenen Daten
#endif
key = daten.substring(0, 3); //erkennen ob mit #00 beginnt
if (key == "#00") {
html_daten = daten.substring(3, 44); // Daten selektieren
digitalWrite(9, HIGH);
delay(100);
digitalWrite(9, LOW);
delay(100);
digitalWrite(9, HIGH);
delay(100);
digitalWrite(9, LOW);
delay(100);
digitalWrite(9, HIGH);
delay(100);
digitalWrite(9, LOW);
auswertung(); // --> Auswertung
ThingSpeak.setField(1, f_percent); // Feld 1 mit Prozent
ThingSpeak.setField(2, f_druck); // Feld 2 mit Druckwert
ThingSpeak.setField(3, f_height); // Feld 3 mit Fuellhoehe
ThingSpeak.setField(4, f_volume); // Feld 4 mit Fuellmenge
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); // write to the ThingSpeak channel
#ifdef debug
if (x == 200) {
Serial.println("Channel update successful.");
}
else {
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
#endif
}
}
}
void auswertung(void) {
String field;
uint8_t field_len;
field = daten.substring(31, 34); // prozente
field_len = field.length() + 1;
char field_char1[field_len];
field.toCharArray(field_char1, field_len);
f_percent = atoi(field_char1);
field = daten.substring(26, 30); // fuellhoehe
field_len = field.length() + 1;
char field_char2[field_len];
field.toCharArray(field_char2, field_len);
f_height = atoi(field_char2);
field = daten.substring(36, 40); // fuellmenge
field_len = field.length() + 1;
char field_char3[field_len];
field.toCharArray(field_char3, field_len);
f_volume = atoi(field_char3);
field = daten.substring(17, 20); // druckwert
field_len = field.length() + 1;
char field_char4[field_len];
field.toCharArray(field_char4, field_len);
f_druck = atoi(field_char4);
}
Das Ganze läuft auf einem Nano mit Ethernet Shield ENC28J60
Was mit schon aufgefallen ist, dass der serielle RX Buffer teils "kleiner" wird.
Heipt es kommt nciht der ganze String an, daher auch meine Abfrage nach den eingelesenen Zeichen. Das wurde besser durch den höheren Timeout kommt aber immer noch vor.
Bin für jeden Tipp und Anregung dankbar
Zusammenfassung
Dieser Text wird ausgeblendet