Ich baue mir gerade eine Poolsteuerung auf Basis von 2 Arduino uno und einen Mega mit Ethernetshield für die Anbindung an Fhem als Webserver.
Jetzt habe ich an einem Arduino eine Ph Meßsonde angeschlossen und anhand von Ph Prüfmittel programmiert. Funktioniert bestens aber gestern habe ich das ganze nicht über den Festrechner sondern über das Laptop getestet und die Werte, (sind ja eh nur Millivolt) passten nicht mehr!
Nach ewigen Prüfen habe ich festgestellt das die USB Schnittstelle nur 4,5 und keine 5 Volt liefert!!
Deswegen brauche ich glatte 5 Volt sonst passen die ganzen Werte nicht mehr.
Jetzt denke ich, ich nehme ein Prototype shield und einen Ams1117 Spannungswandler damit ich korrekte 5 Volt am 5 Volt Pin des Arduinos habe.
Meint ihr ich sollte noch einen DC/DC Wandler davor einbauen oder reicht der Ams1117
Achja die Sonde heißt
(Liquid PH0-14 PH Electrode Sonde BNC für Arduino)
ich schick euch mal den Sketch mit
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Ethernet Based on script by David A. Mellis and Tom Igoe and Andal
// Beide Libraries sind erforderlich
#include <SPI.h> // Libary fürs ethernet shield
#include <Ethernet.h> // Libary Ethernet
// Hier die MAC Adresse des Shields eingeben
// (Aufkleber auf Rückseite)
byte mac[] = {
0x90, 0xA2, 0xDA, 0x00, 0xFB, 0x80 };
// Eine IP im lokalen Netzwerk angeben. Dazu am besten die IP
// des PCs herausfinden (googlen!) und die letzte Zahl abändern
IPAddress ip(192,168,178,10);
// Ethernet Library als Server initialisieren
// Verwendet die obige IP, Port ist per default 80
EthernetServer server(80);
float calibration = 21.34; // Kalibrierungvariable
const int analogInPin = A0;
int sensorValue = 0;
unsigned long int avgValue; //Store the average value of the sensor feedback
float b;
int buf[10],temp;
void setup()
{
// Serielle Kommunikation starten, damit wir auf dem Seriellen Monitor
// die Debug-Ausgaben mitlesen können.
Serial.begin(9600);
// initialisieren des LCD
lcd.begin();
// Lcd Blacklight und Textausgeben.
lcd.backlight();
lcd.print("Andalino Cal");
pinMode(A1,OUTPUT);
pinMode(13,OUTPUT);
Serial.begin(9600);
Serial.println("Ready"); //Test the serial monitor
delay(4000);
// Ethernet Verbindung und Server starten
Ethernet.begin(mac, ip);
server.begin();
Serial.print("Server gestartet. IP: ");
// IP des Arduino-Servers ausgeben
Serial.println(Ethernet.localIP());
}
void loop()
{
for(int i=0;i<10;i++) //Erhalten von 10 Probenwert vom Sensor, um den Wert zu glätten
{
buf[i]=analogRead(analogInPin);
delay(30);
}
for(int i=0;i<9;i++) //Sortieren den Analogport von klein nach groß
{
for(int j=i+1;j<10;j++)
{
if(buf[i]>buf[j])
{
temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}
avgValue=0;
for(int i=2;i<8;i++) //take the average value of 6 center sample
avgValue+=buf[i];
float pHVol=(float)avgValue*5.0/1024/6; //umwandeln vom analog auf Millivolt
float phValue= -5.70*pHVol + calibration; //Umwandeln von Millivolt auf pH value und calibrationsfaktor
lcd.clear();
lcd.setCursor(0,1); // setzt den Cursor auf die 2.Zeile auf den 1.Platz
lcd.print("PH:"); //lcd ausgabe
lcd.print(phValue,2);
lcd.print("V:"); //lcd ausgabe PH und Spannung
lcd.print(pHVol,3);
Serial.print(" pH:");
Serial.print(phValue,2);
Serial.print(" Volt:");
Serial.print(pHVol,3);
lcd.setCursor(0,0);
lcd.print(Ethernet.localIP());
Serial.println(" ");
digitalWrite(13, HIGH);
delay(800);
digitalWrite(13, LOW);
if (phValue>=7.00) { //stellt A1 auf 5 Volt
digitalWrite(A1, HIGH);
} else {
digitalWrite(A1, LOW);
}
// server.available() schaut, ob ein Client verfügbar ist und Daten
// an den Server schicken möchte. Gibt dann eine Client-Objekt zurück,
// sonst false
EthernetClient client = server.available();
// Wenn es einen Client gibt, dann...
if (client)
Serial.println("Neuer Client");
// Jetzt solange Zeichen lesen, bis eine leere Zeile empfangen wurde
// HTTP Requests enden immer mit einer leeren Zeile
boolean currentLineIsBlank = true;
// Solange Client verbunden
while (client.connected()) {
// client.available() gibt die Anzahl der Zeichen zurück, die zum Lesen
// verfügbar sind
if (client.available()) {
// Ein Zeichen lesen und am seriellen Monitor ausgeben
char c = client.read();
Serial.write(c);
// In currentLineIsBlank merken wir uns, ob diese Zeile bisher leer war.
// Wenn die Zeile leer ist und ein Zeilenwechsel (das \n) kommt,
// dann ist die Anfrage zu Ende und wir können antworten
if (c == '\n' && currentLineIsBlank) {
// HTTP Header 200 an den Browser schicken
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // Verbindung wird nach Antwort beendet
client.println("Refresh: 2"); // Seite alle 25 Sekunden neu abfragen
client.println();
// Ab hier berginnt der HTML-Code, der an den Browser geschickt wird
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("PH:"); // Wert auf dem client ausgeben Browser
client.print(phValue,2);
client.println("
"); // Zweite Zeile
client.print("IP: ");
client.print(Ethernet.localIP()); // gibt die IP Adresse auf dem Webserver aus
client.println("</b>
");
client.println("</html>");
break;
}
if (c == '\n') {
// Zeilenwechsel, also currentLineIsBlack erstmal auf True setzen
currentLineIsBlank = true;
}
else if (c != '\r') {
// Zeile enthält Zeichen, also currentLineIsBlack auf False setzen
currentLineIsBlank = false;
}
}
}
// Kleine Pause
delay(1);
// Verbindung schliessen
client.stop();
Serial.println("Verbindung mit Client beendet.");
Serial.println("");
}