grillmeister27
Militanter Veganer
Hallo zusammen,
seit kurzer Zeit bin ich fasziniert vom Thema BBQ. Ich habe mein erstes PP durchgezogen und bin begeistert.
Zum Überwachen der Temperaturen habe ich mir ein Maverick ET 732 gekauft, damit hat alles auch prima funktioniert.
Ich musste allerdings oft den Grill nachstellen, was aber wahrscheinlich an meinem Billig-Kugelgrill liegt.
Nun habe ich ein bisschen rumgebastelt und mit einem Arduino (bei mir ein Arduino Mega, da ich die Erweiterungen noch nicht abschätzen kann)
und dem WLAN Baustein ESP8266 kam ein Datenlogger für die Maverick-Sensoren dabei heraus. Ich wollte erst das Funksignal
des Maverick abfangen und weiterverarbeiten, habe die Daten auch anscheinend ausgelesen, bin aber "auf keine grünen Zweig"
gekommen.
Hier nun zum Projekt:
Kosten: absolut LowCost! Wenn ihr die Teile in China über die Bucht bestellt könnt ihr es schaffen, für einen Arduino Uno und den ESP8266
unter 10 € zu bleiben. Für die Sensoren habe ich mir noch offene Klinkenbuchsen 2,5 mm auch in der Bucht besorgt (10 Stk. etwa 2 €).
Das teuerste sind die Sensoren. Ich habe auch noch einen Lipo-Akku drangehängt, um so autark zu sein.
Da das ESP8266 die TX und RX-Leitungen des Arduino nutzt, habe ich auch noch einen Schalter (2 x UM) in die Leitungen gelötet, um den Arduino
auch "in the box" programmieren zu können.
Da ich auch nicht der erfahrene Arduino-Programmierer bin lässt das Script mit Sicherheit noch viel Spielraum für Optimierungen und Erweiterungen.
Ziel war es, Daten über Garraumtemperatur und Kerntemperatur auszulesen und ins Internet zu spielen, wo ich eine Seite geschrieben habe,
welch die Werte aufnimmt und weiterverarbeitet. So kann man überall seine Temperaturen überwachen. Hierzu gibt es ja auch mehrere
Online-Dienste, die übergebene Werte aufnehmen und anzeigen.
Der ESP8266 loggt sich also ins hauseigene Wlan ein und ruft eine Internetseite nach den Schema
http://www.internetseite.de?Wert1=Temperatur1&Wert1=Temperatur2 auf, ist individuell konfigurierbar.
Da ich mit einem Akku arbeite habe ich über einen Spannungsteiler noch die Spannung errechnet und übergebe diese auch
an die Internetseite. Ich habe einfach den Link erweitert:
http://www.internetseite.de?Wert1=Temperatur1&Wert1=Temperatur2&VCC=Akkuspannung fertig.
Ich würde gerne noch um eine Zuluftregelung per Lüfter oder per Servo (Luftklappensteuerung) erweitern. Das kommt als nächstes.
Da ich schon öfter im Forum gelesen habe, das so was auf LowCost-Basis gesucht wird, findet ihr das Anschlussschema (Fritzing-Neuling bin ich auch, sorry ) im Anhang.
Hier das Arduino Script:
<code>
// Based on https://github.com/wvuong/bbqsmoker/blob/master/bbqsmoker.ino
#define DST_IP "199.199.199.199" // IP der Internetseite
int led = 13; //Pin der LED
int mess1 = 0;
int vcc;
String stringValue = "";
const int numProbes = 2;
const int bufferLength = 30;
float temp;
int Temperatur;
int Temperatur1;
// probe datastructure
struct Probe {
String name;
int pin;
double A;
double B;
double C;
int buffer[bufferLength];
int currentTemp;
int resistor;
};
// probes array
Probe probes[2];
void setup() {
Serial.begin(9600);
Serial.println("AT+RST");
//WiFi modul bootup
delay(800);
//"client" mode
Serial.println("AT+CWMODE=1");
//Einwahl ins WLAN
//SSID und Passwort auf das eigene Netzwerk anpassen.
Serial.println("AT+CWJAP=\"SSID\",\"Passwort\"");
// configure probes
Probe p0 = Probe();
p0.name = "ET-732-1";
p0.pin = A1;
p0.A = 5.36924e-4;
p0.B = 1.91396e-4;
p0.C = 6.60399e-8;
p0.resistor = 22000;
probes[0] = p0;
Probe p1 = Probe();
p1.name = "ET-732-2";
p1.pin = A2;
p1.A = 5.36924e-4;
p1.B = 1.91396e-4;
p1.C = 6.60399e-8;
p1.resistor = 22001;
probes[1] = p1;
delay(2000);
}
void loop() {
int sensorValue = 0;
int outputValue = 0;
// loop für jeden Geber
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes;
// Wert einlesen:
outputValue = readAndOverSample((*ptr).pin, (*ptr).A, (*ptr).B, (*ptr).C, (*ptr).resistor);
// Wert in den Buffer schreiben
(*ptr).currentTemp = outputValue;
for (int i = bufferLength -1; i >= 1; i--) {
(*ptr).buffer = (*ptr).buffer[i-1];
}
(*ptr).buffer[0] = outputValue;
}
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes;
// maximal 4 Geber!
int x; int y;
if (i % 2 == 0) {
x = 0;
}
else if (i % 2 == 1) {
x = 8;
}
if (i / 2 == 0) {
y = 0;
}
else if (i / 2 == 1) {
y = 1;
}
}
delay(10000);
int per = 50000/numProbes/5000;
for (int p = 0; p < per; p++) {
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes;
// Durchschnitt errechnen 5 Minuten
int five, fifteen, thirty;
int accum = 0;
for (int i = 0; i < 5; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer;
}
five = accum/5;
// Durchschnitt errechnen 15 Minuten
accum = 0;
for (int i = 0; i < 15; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer;
}
fifteen = accum/15;
// Durchschnitt errechnen 30 Minuten
accum = 0;
for (int i = 0; i < 30; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer;
}
thirty = accum/30;
}
}
// Spannungsmessung mit Spannnungsteiler
int mess1 = analogRead(mess1);
vcc = ((mess1/36.35)*1000); // Faktor für Spannungsteiler
//Vertbindung zum web server
String cmd = "AT+CIPSTART=\"TCP\",\""; //make this command: AT+CPISTART="TCP","199.199.199.199",80
cmd += DST_IP;
cmd += "\",80";
Serial.println(cmd);
//warten auf Verlinkung
delay(300);
//HTTP GET Request
cmd = "GET /datei.php?Wert1="; // Datei des Internetservices aufrufen
cmd += Temperatur;
cmd += "&Wert2=";
cmd += Temperatur1;
cmd +="&VCC=";
cmd += vcc;
cmd += " HTTP/1.0\r\n";
cmd += "Host: 217.160.107.197\r\n\r\n";
//Größe des Requests für ESP8266
Serial.print("AT+CIPSEND=");
Serial.println(cmd.length());
Serial.println(cmd);
}
int readAndOverSample(int apin, double A, double B, double C, int resistor) {
int sensorvalue = 0;
unsigned int accumulated = 0;
int numsamples = 64;
int n = 0;
sensorvalue = analogRead(apin);
delay(2);
// einlesen der 64 samples
for (int i = 0; i < numsamples; i++) {
sensorvalue = analogRead(apin);
if (sensorvalue == 0 || sensorvalue >= 1023) {
return -1;
}
accumulated += sensorvalue;
n++;
delay(2);
}
unsigned int ADCmax = (1 << 13) - 1;
unsigned int ADCval = accumulated >> 3;
float R, T;
R = log( resistor / ((ADCmax/(float)ADCval) - 1.0f));
T = 1.0f / ((C * R * R + B) * R + A);
temp = (T - 273.15f);
// Serial.print("temp="); Serial.println(temp);
if (resistor > 22000) {
Temperatur = temp; // Wert für Internetseite speichern
}
else {
Temperatur1 = temp; // Wert für Internetseite speichern
}
//return temp;
delay(60000); // 1 Minute warten
}
</code>
Ich hoffe es reicht für ein paar Anregungen.
Grüße
Markus
seit kurzer Zeit bin ich fasziniert vom Thema BBQ. Ich habe mein erstes PP durchgezogen und bin begeistert.
Zum Überwachen der Temperaturen habe ich mir ein Maverick ET 732 gekauft, damit hat alles auch prima funktioniert.
Ich musste allerdings oft den Grill nachstellen, was aber wahrscheinlich an meinem Billig-Kugelgrill liegt.
Nun habe ich ein bisschen rumgebastelt und mit einem Arduino (bei mir ein Arduino Mega, da ich die Erweiterungen noch nicht abschätzen kann)
und dem WLAN Baustein ESP8266 kam ein Datenlogger für die Maverick-Sensoren dabei heraus. Ich wollte erst das Funksignal
des Maverick abfangen und weiterverarbeiten, habe die Daten auch anscheinend ausgelesen, bin aber "auf keine grünen Zweig"
gekommen.
Hier nun zum Projekt:
Kosten: absolut LowCost! Wenn ihr die Teile in China über die Bucht bestellt könnt ihr es schaffen, für einen Arduino Uno und den ESP8266
unter 10 € zu bleiben. Für die Sensoren habe ich mir noch offene Klinkenbuchsen 2,5 mm auch in der Bucht besorgt (10 Stk. etwa 2 €).
Das teuerste sind die Sensoren. Ich habe auch noch einen Lipo-Akku drangehängt, um so autark zu sein.
Da das ESP8266 die TX und RX-Leitungen des Arduino nutzt, habe ich auch noch einen Schalter (2 x UM) in die Leitungen gelötet, um den Arduino
auch "in the box" programmieren zu können.
Da ich auch nicht der erfahrene Arduino-Programmierer bin lässt das Script mit Sicherheit noch viel Spielraum für Optimierungen und Erweiterungen.
Ziel war es, Daten über Garraumtemperatur und Kerntemperatur auszulesen und ins Internet zu spielen, wo ich eine Seite geschrieben habe,
welch die Werte aufnimmt und weiterverarbeitet. So kann man überall seine Temperaturen überwachen. Hierzu gibt es ja auch mehrere
Online-Dienste, die übergebene Werte aufnehmen und anzeigen.
Der ESP8266 loggt sich also ins hauseigene Wlan ein und ruft eine Internetseite nach den Schema
http://www.internetseite.de?Wert1=Temperatur1&Wert1=Temperatur2 auf, ist individuell konfigurierbar.
Da ich mit einem Akku arbeite habe ich über einen Spannungsteiler noch die Spannung errechnet und übergebe diese auch
an die Internetseite. Ich habe einfach den Link erweitert:
http://www.internetseite.de?Wert1=Temperatur1&Wert1=Temperatur2&VCC=Akkuspannung fertig.
Ich würde gerne noch um eine Zuluftregelung per Lüfter oder per Servo (Luftklappensteuerung) erweitern. Das kommt als nächstes.
Da ich schon öfter im Forum gelesen habe, das so was auf LowCost-Basis gesucht wird, findet ihr das Anschlussschema (Fritzing-Neuling bin ich auch, sorry ) im Anhang.
Hier das Arduino Script:
<code>
// Based on https://github.com/wvuong/bbqsmoker/blob/master/bbqsmoker.ino
#define DST_IP "199.199.199.199" // IP der Internetseite
int led = 13; //Pin der LED
int mess1 = 0;
int vcc;
String stringValue = "";
const int numProbes = 2;
const int bufferLength = 30;
float temp;
int Temperatur;
int Temperatur1;
// probe datastructure
struct Probe {
String name;
int pin;
double A;
double B;
double C;
int buffer[bufferLength];
int currentTemp;
int resistor;
};
// probes array
Probe probes[2];
void setup() {
Serial.begin(9600);
Serial.println("AT+RST");
//WiFi modul bootup
delay(800);
//"client" mode
Serial.println("AT+CWMODE=1");
//Einwahl ins WLAN
//SSID und Passwort auf das eigene Netzwerk anpassen.
Serial.println("AT+CWJAP=\"SSID\",\"Passwort\"");
// configure probes
Probe p0 = Probe();
p0.name = "ET-732-1";
p0.pin = A1;
p0.A = 5.36924e-4;
p0.B = 1.91396e-4;
p0.C = 6.60399e-8;
p0.resistor = 22000;
probes[0] = p0;
Probe p1 = Probe();
p1.name = "ET-732-2";
p1.pin = A2;
p1.A = 5.36924e-4;
p1.B = 1.91396e-4;
p1.C = 6.60399e-8;
p1.resistor = 22001;
probes[1] = p1;
delay(2000);
}
void loop() {
int sensorValue = 0;
int outputValue = 0;
// loop für jeden Geber
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes;
// Wert einlesen:
outputValue = readAndOverSample((*ptr).pin, (*ptr).A, (*ptr).B, (*ptr).C, (*ptr).resistor);
// Wert in den Buffer schreiben
(*ptr).currentTemp = outputValue;
for (int i = bufferLength -1; i >= 1; i--) {
(*ptr).buffer = (*ptr).buffer[i-1];
}
(*ptr).buffer[0] = outputValue;
}
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes;
// maximal 4 Geber!
int x; int y;
if (i % 2 == 0) {
x = 0;
}
else if (i % 2 == 1) {
x = 8;
}
if (i / 2 == 0) {
y = 0;
}
else if (i / 2 == 1) {
y = 1;
}
}
delay(10000);
int per = 50000/numProbes/5000;
for (int p = 0; p < per; p++) {
for (int i = 0; i < numProbes; i++) {
Probe *ptr = &probes;
// Durchschnitt errechnen 5 Minuten
int five, fifteen, thirty;
int accum = 0;
for (int i = 0; i < 5; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer;
}
five = accum/5;
// Durchschnitt errechnen 15 Minuten
accum = 0;
for (int i = 0; i < 15; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer;
}
fifteen = accum/15;
// Durchschnitt errechnen 30 Minuten
accum = 0;
for (int i = 0; i < 30; i++) {
if ((*ptr).buffer == 0) {
accum = 0;
break;
}
accum += (*ptr).buffer;
}
thirty = accum/30;
}
}
// Spannungsmessung mit Spannnungsteiler
int mess1 = analogRead(mess1);
vcc = ((mess1/36.35)*1000); // Faktor für Spannungsteiler
//Vertbindung zum web server
String cmd = "AT+CIPSTART=\"TCP\",\""; //make this command: AT+CPISTART="TCP","199.199.199.199",80
cmd += DST_IP;
cmd += "\",80";
Serial.println(cmd);
//warten auf Verlinkung
delay(300);
//HTTP GET Request
cmd = "GET /datei.php?Wert1="; // Datei des Internetservices aufrufen
cmd += Temperatur;
cmd += "&Wert2=";
cmd += Temperatur1;
cmd +="&VCC=";
cmd += vcc;
cmd += " HTTP/1.0\r\n";
cmd += "Host: 217.160.107.197\r\n\r\n";
//Größe des Requests für ESP8266
Serial.print("AT+CIPSEND=");
Serial.println(cmd.length());
Serial.println(cmd);
}
int readAndOverSample(int apin, double A, double B, double C, int resistor) {
int sensorvalue = 0;
unsigned int accumulated = 0;
int numsamples = 64;
int n = 0;
sensorvalue = analogRead(apin);
delay(2);
// einlesen der 64 samples
for (int i = 0; i < numsamples; i++) {
sensorvalue = analogRead(apin);
if (sensorvalue == 0 || sensorvalue >= 1023) {
return -1;
}
accumulated += sensorvalue;
n++;
delay(2);
}
unsigned int ADCmax = (1 << 13) - 1;
unsigned int ADCval = accumulated >> 3;
float R, T;
R = log( resistor / ((ADCmax/(float)ADCval) - 1.0f));
T = 1.0f / ((C * R * R + B) * R + A);
temp = (T - 273.15f);
// Serial.print("temp="); Serial.println(temp);
if (resistor > 22000) {
Temperatur = temp; // Wert für Internetseite speichern
}
else {
Temperatur1 = temp; // Wert für Internetseite speichern
}
//return temp;
delay(60000); // 1 Minute warten
}
</code>
Ich hoffe es reicht für ein paar Anregungen.
Grüße
Markus