Servus
Saubere Spannungsversorgung meine ich das alles getan ist um sie
- so langzeitstabstabil als möglich zu haben
- möglichst keine Spikes/Noise/Rauschen drauf ist.
Beim ACS ist es nämlich so, das die Ausgangsspannung auch direkt von der Betriebsspannung abhängt. d.h. jeder Noise an der Vdd ist auch am Ausgang sichtbar. -> dies wäre zb mit einem Tiefpass (RC-Glied) wegfilterbar.
Weiters gibt es die Schwierigkeit das wenn die VDD driftet (zb. durch Temperaturschwankungen) auch der Ausgang in gleichem Maße wegdriftet.
Darum sollte die VDD des ACS wenn möglich an die ADC Referenz gelegt werden damit hebt sich ein Drift wieder auf.
Wenn der ESP keinen ADC Referenzspannungs Pin hat, dann mußt du deine Messwerte immer kritisch hinterfragen oder dir eine regelmäßige Kalibrierung überlegen. Kommt halt auf die Genauigkeit an die du erwartest.
Mit einem 20A ACS komme ich bei meiner Photovoltaikanlage auf etwa 30mA Noise:
Wegen dem Averagen hier mein Code.
Averagen heist das du den Mittelwert aus vielen Einzelsamples nimmst.
In meinem Fall der Mittelwert aus den letzten 5000 Samples.
Stör dich nicht am 1Wire und Dallas Krams, das sind nur Reste von einem Versuch. Hab jetzt nicht extra aufgeräumt.
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Ethernet.h>
#include <RunningAverage.h>
//#include "DHT.h"
//#define DHTPIN 2 // benutzter ARDUINO-Pin
//#define DHTTYPE DHT11 // unser Sensor: DHT11
//DHT dht(DHTPIN, DHTTYPE);
// Pin für LED
int LED=13;
//Pin für One-Wire-Bus festelgen. Standart = 2
#define ONE_WIRE_BUS 1
OneWire oneWire(ONE_WIRE_BUS);
// One-Wire-Bus mit dem Temperatursensor verbinden
DallasTemperature sensors(&oneWire);
EthernetClient client;
int samples =0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0XEF, 0XFE, 0xEC};
byte ip[] = {10,0,0,50}; //eigene IP
byte subnet[] = {255,255,255,0};
byte server[] = { 10, 0, 0, 101 }; //zweite IPSServer Adresse, weil Router sendt nicht an 10.0.0.1
RunningAverage myA0(10);
RunningAverage myA1(10);
RunningAverage myA2(10);
RunningAverage myA3(10);
void setup() {
pinMode(LED, OUTPUT);
Ethernet.begin(mac,ip,subnet);
Serial.begin(9600);
Serial.println("Start Ethernet");
delay(5000);
if (client.connect(server, 1101)) {
Serial.println("connected");
} else {
Serial.println("connection failed");
}
//dht.begin(); //DHT11 starten
myA0.clear();
myA1.clear();
myA2.clear();
myA3.clear();
//Temperaturabfrage initalisieren
sensors.begin();
delay(1000);
}
void loop() {
String TxtToSend;
//float h = dht.readHumidity();
//float t = dht.readTemperature();
myA0.addValue(analogRead(A0));
myA1.addValue(analogRead(A1));
myA2.addValue(analogRead(A2));
myA3.addValue(analogRead(A3));
samples++;
digitalWrite(LED, LOW);
if (samples == 5000)
{
digitalWrite(LED, HIGH);
delay(1000);
TxtToSend = "B"+String(myA0.getAverage()) + "," + String(myA1.getAverage()) + "," + String(myA2.getAverage())+ "," + String(myA3.getAverage()) + "E";
Serial.println(TxtToSend);
client.println(TxtToSend);
samples = 0;
myA0.clear();
myA1.clear();
myA2.clear();
myA3.clear();
if (!client.connected()) {
client.stop();
delay (1000);
if (client.connect(server, 1101)) {
Serial.println("connected");
} else {
Serial.println("connection failed");
}
}
//if (isnan(t) || isnan(h)) {
// Serial.println("Fehler beim Lesen vom DHT-Sensor");
// } else {
// //t = t - 1.00; //Diese Korrektur war bei mir noetig
// Serial.print("Feuchtigkeit: ");
// Serial.print(h);
// Serial.print(" % ");
// Serial.print("Temperatur: ");
// Serial.print(t);
// Serial.println(" Grad Celsius");
// Mb.R[4]=(h)*1000;
// Mb.R[5]=(t)*1000;
//
// }
//
}
}