Go Down

Topic: Serielle Daten lesen und verarbeiten, aber wie? (Read 1 time) previous topic - next topic

noiasca

so in etwa mit LCD:

Code: [Select]


// Empfang einer Zeile über Serial und Ausgabe am LCD I2C
//http://forum.arduino.cc/index.php?topic=535427.0
//
// Auf Basis Beispiel 2: https://forum.arduino.cc/index.php?topic=396450.0 Example 2 - Receive with an end-marker

const byte numChars = 70;
char receivedChars[numChars];   // an array to store the received data
boolean newData = false;

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2); // set the LCD address for a 16 chars and 2 line display

uint32_t previousBlink = 0;
uint32_t previousMillis = 0;
uint32_t intervall = 30000;       // millis bevor ein Alarm ausgelöst wird, wenn kein Signal kommt
const uint32_t frequenceLow = 500;     // schnelles blinken
const uint32_t frequenceMedium = 200;  // mittle
const uint32_t frequenceHigh = 100;    // schnelles Blinken
const byte ledPinGruen = 5;
const byte ledPinRot = LED_BUILTIN;

enum {OK,                         // 0 Signal kommt und scheint plausibel
      SignalFehlt,                // 1 kein Signal für eine bestimmte Zeit
      NOK,                        // 2 Fehler im Signal
      AlarmExtern                 // 3 Alarm durch externen Sensor (noch nicht realisiert)
     };               

byte status = SignalFehlt;       // setzen wir den Startwert vorsichtshalber auf signalFehlt

void setup() {
  Serial.begin(115200);
  //Serial.println(F("<Arduino is ready>"));

  pinMode(ledPinRot, OUTPUT);
  pinMode(ledPinGruen, OUTPUT);

  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print(F("Arduino is ready"));

}

void loop() {
  recvWithEndMarker();
  showNewData();


  //überprüfung wann das letzte Signal gekommen ist und gegebenenfalls Status ändern
  if (millis() - previousMillis >= intervall)
  {
    status = SignalFehlt;
  }
 
  showStatus();
 
  //BlinkWithoutDelay - wenn notwendig

  if (status == SignalFehlt)
  {
    if (millis() - previousBlink >= frequenceHigh)
    {
      previousBlink=millis();
      if (digitalRead(ledPinRot) == LOW)
      {
        digitalWrite(ledPinRot, HIGH);
      }
      else
      {
        digitalWrite(ledPinRot, LOW);
      }
    }
   
  }
  else if (status == NOK)
  {
    if (millis() - previousBlink >= frequenceMedium)
    {
      previousBlink=millis();
      if (digitalRead(ledPinRot) == LOW) {
        digitalWrite(ledPinRot, HIGH);
      } else {
        digitalWrite(ledPinRot, LOW);
      }
    }
  }

}

void showStatus()
{
  switch (status)
  {
    case OK:
      lcd.setCursor(0, 0);  // Zeile 1
      //           1234567890123456
      lcd.print(F(" Signalempfang  "));
      digitalWrite(ledPinGruen, HIGH);
      break;
    case SignalFehlt:
      lcd.setCursor(0, 0);
      //           1234567890123456
      lcd.print(F("* Kein Signal * "));
      digitalWrite(ledPinGruen, LOW);
      break;
    case NOK:
      lcd.setCursor(0, 0);
      //           1234567890123456
      lcd.print(F("* Signal NOK *  "));
      digitalWrite(ledPinGruen, LOW);
      break;
  }
}

void recvWithEndMarker() {
  static byte ndx = 0;
  char endMarker = '\n';
  char rc;

  while (Serial.available() > 0 && newData == false) {
    rc = Serial.read();

    if (rc != endMarker) {
      receivedChars[ndx] = rc;
      ndx++;
      if (ndx >= numChars) {
        ndx = numChars - 1;
      }
    }
    else {
      receivedChars[ndx] = '\0'; // terminate the string
      ndx = 0;
      newData = true;
    }
  }
}

void showNewData() {
  if (newData == true) {
    //Serial.print("This just in ... ");
    //Serial.println(receivedChars);

    lcd.setCursor(0, 1);
    lcd.print(F("                "));  // Zeile 2 Platz für Variable 1 löschen
    lcd.setCursor(0, 1);
    lcd.print(receivedChars[21]);
    lcd.print(receivedChars[22]);
    lcd.print(receivedChars[23]);
    lcd.setCursor(8, 1);
    lcd.print(receivedChars[29]);
    lcd.print(receivedChars[30]);
    lcd.print(receivedChars[31]);

    previousMillis = millis();
    newData = false;

    if (receivedChars[21] == '-' |
        receivedChars[22] == '-' |
        receivedChars[23] == '-' |
        receivedChars[29] == '-' |
        receivedChars[30] == '-' |
        receivedChars[31] == '-')
    {
      status = NOK;
    }
    else
    {
      status = OK;
    }
  }
}




irgendwie gefällt es mir nicht besonders, dass die Grüne Led eigentlich wo anders gesetzt wird als die rote Blink-Led, aber ich wollte das BlinkWithoutDelay reinbringen dass du selber in der Lage bist, es zu erweitern.

Das enum ist eine Aufzählung, damit musst du dir dann nicht mehr magic numbers im Code merken sondern du schreibst das einfach "im Klartext" hin. Oder wenn du das umsortieren willst, dann fügst einfach einen anderen Status ein. Ich finde die dinger recht praktisch.



DE: Wie man Fragen postet:
1. was hat man (Sketch und Hardware)
2. was SOLL es machen
3. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...)
4. Eine Frage stellen bzw. erklären was man erwartet

Ciaoi

Hallo Zusammen,

ich möchte euch nochmal danken. Ohne euch hätte ich hier Garnichts. Hab das Ganze nun mit den Fehlermeldungen von noiasca und dem 3,5" Display programmiert.
Ich bin mehr als begeistert. Danke euch.


Gruß Marco

Go Up