Hi,
Ich hab ein bissi herumgespielt... naja mehrere Sensoren in verschiedenen Intervallen abzufragen ist die eine Sache, eine Sensor eigene Kalibrierungs Zeit, verkompliziert das Ganze natürlich.
So sollte es funktionieren... Ich konnte nicht wiederstehen Deinen Code gleich mit reinzukopieren. Auf Interrupts hab ich nicht berrücksichtig. Darum musst Du Dich noch kümmern. Aber zumindest sind die beiden 500 delays drausen.
#include "EmonLib.h"
// Include Emon Library
EnergyMonitor emon1;
String zeile;
// ---------------> Meine Variablen
uint16_t snsorTime1 = 1000; // 1 Sekunde
uint16_t snsorTime2 = 500; // 0,5 Sekunden
uint16_t snsorTime3 = 2000; // 2 Sekunden
uint16_t snsorCTime2 = 500; // 500ms,
unsigned long calibrationTime; // Um den Sensor 2 (sag ich mal) zu kalibrieren
unsigned long previosTime; // im Prinzip ist das nur die oldTime Variable
bool sensorFlag;
// --------------------->
byte statusLed = 13;
byte sensorInterrupt = 0; // 0 = digital pin 2
byte sensorPin = 2;
// The hall-effect flow sensor outputs approximately 4.5 pulses per second per
// litre/minute of flow.
float calibrationFactor = 4.5;
volatile byte pulseCount;
float flowRate;
unsigned int flowMilliLitres;
//oldTime hab ich durch previosTime ersetzt, macht keinen Unterschied aber ich hab bereits so begonnen, String Zeile gibt es bereits oben
void setup() {
previosTime = millis(); // Womöglich an anderer Stelle platzieren
Serial.begin(115200);
Serial.println("start");
// ------------> Ab hier Dein Zeug:
emon1.current(1, 20); // Current: input pin, calibration
// Set up the status LED line as an output
pinMode(statusLed, OUTPUT);
digitalWrite(statusLed, HIGH); // We have an active-low LED attached
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
// The Hall-effect sensor is connected to pin 2 which uses interrupt 0.
// Configured to trigger on a FALLING state change (transition from HIGH
// state to LOW state)
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
void loop() {
if ((millis() - previosTime) >= snsorTime1) { // Sensor 1 Abfragen
// Wenn möglch die Sensor Abfrage in eine Funktion auslagern IMHO
Serial.println("Sensor 1 wird abgefragt");
// Ersten Sensor Abfragen
// -----------------------> Aus dem zweiten Sketch
// Disable the interrupt while calculating flow rate and sending the value to
// the host
detachInterrupt(sensorInterrupt);
// Because this loop may not complete in exactly 1 second intervals we calculate
// the number of milliseconds that have passed since the last execution and use
// that to scale the output. We also apply the calibrationFactor to scale the output
// based on the number of pulses per second per units of measure (litres/minute in
// this case) coming from the sensor.
flowRate = ((1000.0 / (millis() - previosTime )) * pulseCount) / calibrationFactor; // hier die Variable ersetzt
// Note the time this processing pass was executed. Note that because we've
// disabled interrupts the millis() function won't actually be incrementing right
// at this point, but it will still return the value it was set to just before
// interrupts went away.
//oldTime = millis(); <- Das wird eigentlich bereits ganz unten abgearbeitet.
// Divide the flow rate in litres/minute by 60 to determine how many litres have
// passed through the sensor in this 1 second interval, then multiply by 1000 to
// convert to millilitres.
flowMilliLitres = (flowRate / 60) * 1000;
unsigned int frac;
zeile = "{\"Input\":\"D2\", \"value\":" + String(flowRate) + "}";
Serial.println(zeile);
// Reset the pulse counter so we can start incrementing again
pulseCount = 0;
// Enable the interrupt again now that we've finished sending output
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
// ---------------------< Ende
}
// if ((millis() - previosTime) >= snsorTime2 && sensor2Flag = false) { // Sensor 2 Abfragen
if ((millis() - previosTime) >= snsorTime2 && !sensorFlag) { // sensor2Flag = false ist auch richtig
// Zweiten Sensor Abfragen, eigentlich kalibrieren
Serial.println("Sensor 2 wird kalibriert");
calibrationTime = millis();
sensorFlag = true;
// ------------------->
// read the input on analog pin 0:
float sensorValue = analogRead(A0)* (5.0 / 1023.0);
// print out the value you read:
zeile = "{\"Input\":\"A0\", \"value\":" + String(sensorValue) + "}";
Serial.println(zeile);
// ---------------------<
}
// Sensor calibration time
if ((millis() - calibrationTime) >= snsorCTime2 && sensorFlag) { // Sensor 2 Kalibrierungs Zeit
Serial.println("Sensor 2 wurde kalibriert und wird nun Abgefragt");
// ------------------->
float Irms = emon1.calcIrms(1480); // Calculate Irms only
zeile = "{\"Input\":\"A1\", \"value\":" + String(Irms) + "}";
Serial.println(zeile);
// ---------------------<
sensorFlag = false;
}
else {
calibrationTime = millis(); // millis speichern.
}
previosTime = millis(); // millis speichern.
}
Hier nochmal der leere Code, mit je einem Serial.print
uint16_t snsorTime1 = 1000; // 1 Sekunde
uint16_t snsorTime2 = 500; // 0,5 Sekunden
uint16_t snsorTime3 = 2000; // 2 Sekunden
uint16_t snsorCTime2 = 500; // 500ms,
unsigned long calibrationTime; // Um den Sensor 2 (sag ich mal) zu kalibrieren
unsigned long previosTime; // im Prinzip ist das nur die oldTime Variable
bool sensorFlag;
void setup() {
previosTime = millis(); // Womöglich an anderer Stelle platzieren
Serial.begin(115200);
Serial.println("start");
}
void loop() {
if ((millis() - previosTime) >= snsorTime1) { // Sensor 1 Abfragen
// Wenn möglch die Sensor Abfrage in eine Funktion auslagern IMHO
Serial.println("Sensor 1 wird abgefragt");
// Ersten Sensor Abfragen
}
// if ((millis() - previosTime) >= snsorTime2 && sensor2Flag = false) { // Sensor 2 Abfragen
if ((millis() - previosTime) >= snsorTime2 && !sensorFlag) { // sensor2Flag = false ist auch richtig
// Zweiten Sensor Abfragen, eigentlich kalibrieren
Serial.println("Sensor 2 wird kalibriert");
calibrationTime = millis();
sensorFlag = true;
}
// Sensor calibration time
if ((millis() - calibrationTime) >= snsorCTime2 && sensorFlag) { // Sensor 2 Kalibrierungs Zeit
Serial.println("Sensor 2 wurde kalibriert und wird nun Abgefragt");
sensorFlag = false;
}
else {
calibrationTime = millis(); // millis speichern.
}
previosTime = millis(); // millis speichern.
}
Grüße,
Donny