Thermometer.... es will einfach nicht ....

Hallo,

ich habe seit Januar ein wenig herumprobiert aber bekomms nicht hin…

Im Trockentest lief es immer relativ gut. Doch kaum möchte ich es mal zum Grillen nutzen, klappt gar nichts mehr. Evtl. Spannungseinbrüche ? Also wie gesagt hat es eine Zeit lang während des probierens mit dem Code gut ausgeschaut und mein Sohnemann hat sich in MIT APP Inventor eingewurstelt und ne wirklich Klasse App dazu gebaut. Nur leider ist nun die App fertig seit Ostern und ich bekomm die Schaltung nicht ans laufen… Ich hoffe jemand kann mir sagen was ich falsch mache oder noch besser sagen was ich denn ändern muss das es klappt.
leider habe ich keine Idee wie ich die Thermometer evtl. Nacheinander abfragen könnte um so evtl Strom zu sparen. Beim Grillen sind Schwankungen ja nicht im Sekundentakt gefragt. 2 Fühler sollen fürs Fleisch und 2 für den Grill sein. Wenn das alles mal so klappt soll dann noch über thingspeak mitgeloggt werden. Über Sinn und Unsinn geht es hier weniger… Nur eben ums Basteln und lernen …

Vielen Dank schon mal …

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>

#define I2C_ADDR 0x3F 
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define BACKLIGHT 3
SoftwareSerial Bluetooth(5, 6); //RX5 TX6



LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

// Konstanten


const int ntc1 = A0;                   
const int ntc2 = A1;                   
const int ntc3 = A2;      
const int ntc4 = A3;
const float ntcNominal = 200000;         
const float tempNominal = 25;          
const int bCoefficient = 4200;     
const float serienWiederstand = 100000;  
const int abfrageZahl = 10;           



int abfrage1[abfrageZahl];  // Array Variable für das Mitteln der Temperatur
float durchschnitt1 = 0;    // Variable für das Mitteln der Temperatur
float temp1;                
int abfrage2[abfrageZahl];  
float durchschnitt2 = 0;    
float temp2;               
float durchschnitt3 = 0;    
float temp3;                
int abfrage4[abfrageZahl];  
float durchschnitt4 = 0;    
float temp4;                
String temperatur;


void setup()
{
  lcd.begin(20, 4);
  Serial.begin(9600);             

  pinMode(ntc1, INPUT);            
  pinMode(ntc2, INPUT);            
  pinMode(ntc3, INPUT);           
  pinMode(ntc4, INPUT);            
  lcd.setBacklightPin(BACKLIGHT, POSITIVE);

  pinMode(A7, OUTPUT);
  pinMode(4, INPUT);

  pinMode(12, OUTPUT);
  Bluetooth.begin(9600);
}



void loop()
{
  delay(5000);
  lcd.backlight();


  // Nimmt N Abfragen in einer Reihe, mit einem kurzen delay
  // for (int i=0; i < abfrageZahl; i++)
  // {
  //   abfrage1[i] = analogRead(ntc1);
  //   abfrage2[i] = analogRead(ntc2);
  //   abfrage3[i] = analogRead(ntc3);
  //    abfrage4[i] = analogRead(ntc4);
  //    delay(10);
  //  }

  // Mittelt alle Abfragen
  durchschnitt1 = analogRead(ntc1);  durchschnitt2 = analogRead(ntc2);
  durchschnitt3 = analogRead(ntc3);  durchschnitt4 = analogRead(ntc4);
  //  for (int i=0; i < abfrageZahl; i++)
  //  {
  //    durchschnitt1 += abfrage1[i];
  //    durchschnitt2 += abfrage2[i];
  //    durchschnitt3 += abfrage3[i];
  //    durchschnitt4 += abfrage4[i];
  //  }
  // { durchschnitt1 /= abfrageZahl;
  //  durchschnitt2 /= abfrageZahl;
  //  durchschnitt3 /= abfrageZahl;
  //  durchschnitt4 /= abfrageZahl;
  // }
  // Umwandlung des Wertes in Wiederstand
  durchschnitt1 = 1023 / durchschnitt1 - 1;
  durchschnitt1 = serienWiederstand / durchschnitt1;

  durchschnitt2 = 1023 / durchschnitt2 - 1;
  durchschnitt2 = serienWiederstand / durchschnitt2;

  durchschnitt3 = 1023 / durchschnitt3 - 1;
  durchschnitt3 = serienWiederstand / durchschnitt3;

  durchschnitt4 = 1023 / durchschnitt4 - 1;
  durchschnitt4 = serienWiederstand / durchschnitt4;

  // Umrechnung aller Ergebnisse in die Temperatur mittels einer Steinhard Berechnung
  temp1 = durchschnitt1 / ntcNominal;     // (R/Ro)
  temp1 = log(temp1);                     // ln(R/Ro)
  temp1 /= bCoefficient;                 // 1/B * ln(R/Ro)
  temp1 += 1.0 / (tempNominal + 273.15); // + (1/To)
  temp1 = 1.0 / temp1;                    // Invertieren
  temp1 -= 273.15;                       // Umwandeln in °C

  temp2 = durchschnitt2 / ntcNominal;     // (R/Ro)
  temp2 = log(temp2);                     // ln(R/Ro)
  temp2 /= bCoefficient;                 // 1/B * ln(R/Ro)
  temp2 += 1.0 / (tempNominal + 273.15); // + (1/To)
  temp2 = 1.0 / temp2;                    // Invertieren
  temp2 -= 273.15;                       // Umwandeln in °C

  temp3 = durchschnitt3 / ntcNominal;     // (R/Ro)
  temp3 = log(temp3);                     // ln(R/Ro)
  temp3 /= bCoefficient;                 // 1/B * ln(R/Ro)
  temp3 += 1.0 / (tempNominal + 273.15); // + (1/To)
  temp3 = 1.0 / temp3;                    // Invertieren
  temp3 -= 273.15;                       // Umwandeln in °C

  temp4 = durchschnitt4 / ntcNominal;     // (R/Ro)
  temp4 = log(temp4);                     // ln(R/Ro)
  temp4 /= bCoefficient;                 // 1/B * ln(R/Ro)
  temp4 += 1.0 / (tempNominal + 273.15); // + (1/To)
  temp4 = 1.0 / temp4;                    // Invertieren
  temp4 -= 273.15;                       // Umwandeln in °C
  if (temp1 < 20) tone(A7, 16350);
  delay(500);
  noTone(A7);
  digitalWrite(12, LOW);

  
  if (temp1 < (-20))
  {
    lcd.setCursor(0, 0);
    lcd.print("                    ");
    lcd.setCursor(0, 0);
    lcd.print("Grill 1: Fehler    ");
  }
  else
  {lcd.setCursor(0, 0);
    lcd.print("                    ");
    lcd.setCursor(0, 0);
    lcd.print("Grill 1: "); lcd.print(temp1); lcd.print("*C");
  }
if (temp2 < (-20))
  {lcd.setCursor(0, 1);
    lcd.print("                    ");
    lcd.setCursor(0, 1);
    lcd.print("Grill 2: Fehler    ");
  }
  else
  {lcd.setCursor(0, 1);
    lcd.print("                    ");
    lcd.setCursor(0, 1);
    lcd.print("Grill 2: "); lcd.print(temp2); lcd.print("*C");
  }
if (temp3 < (-20))
  {lcd.setCursor(0, 2);
    lcd.print("                    ");
    lcd.setCursor(0, 2);
    lcd.print("Kern  1: Fehler    ");
  }
  else
  {lcd.setCursor(0, 2);
    lcd.print("                    ");
    lcd.setCursor(0, 2);
    lcd.print("Kern  1: "); lcd.print(temp3); lcd.print("*C");
  }
if (temp4 < (-20))
  {lcd.setCursor(0, 3);
    lcd.print("                    ");
    lcd.setCursor(0, 3);
    lcd.print("Kern  2: Fehler    ");
  }
  else
  {lcd.setCursor(0, 3);
    lcd.print("                    ");
    lcd.setCursor(0, 3);
    lcd.print("Kern  2: "); lcd.print(temp4); lcd.print("*C");
  }





Bluetooth.print((int)temp1);
Bluetooth.print("|");
Bluetooth.print((int)temp2);
Bluetooth.print("|");
Bluetooth.print((int)temp3);
Bluetooth.print("|");
Bluetooth.print((int)temp4);
Bluetooth.println("|");



}

Wo genau ist der Unterschied zwischen dem Probeaufbau und dem endgültigen Aufbau ?
Wenn es zuvor schon funktioniert hat, was hast du seit dem geändert ?

Mein Tipp: Du solltest die Messungen der einzelnen Sensoren in eigene Funktionen packen und diese einzeln nacheinander aufrufen.

.... es will einfach nicht ....

Das ist ja nicht gerade eine brauchbare Fehlerbeschreibung. Das könntest Du etwas genauer beschreiben.

Ich vermute, Dein Problem liegt in den Anschlüssen der NTC an den Arduino. Wie lang sind die Leitungen und welche Leitungen verwendest Du?

Gruß Tommy

Hallo SpaceAce,

Die Pins A6 + A7 des Nano kannst Du nicht als digitale Ausgänge oder als Digitale Eingänge Nutzen, sondern AUSSCHLIESSLICH als ANALOGE EINGÄNGE!
Du definierst aber im Setup den Analogeingang A7 als Digitalen Ausgang.

Falls Deine Schaltung nachdem Du das geändert hast, noch immer nicht funktioniert: ->
Kannst Du uns sagen, was genau nicht funktioniert?
Möglichst genaue Fehlerbeschreibung.
Eventuelle Fehlermeldungen.
Spannungseinbrüche: Durchaus möglich. aber für ne genauere Analyse, müssen wir auch wissen, wie Du das ganze mit Strom versorgst.
Ich kenne die Stromaufname deines Bluethoot-Moduls nicht und auch nicht vom Backlight des LCDs.
Wenn alles über den Spannungsregler des Nano's läuft, kann es da schon auch knapp werden.

LG Stefan

Deltaflyer:
Die Pins A6 + A7 des Nano kannst Du nicht als digitale Ausgänge oder als Digitale Eingänge Nutzen, sondern AUSSCHLIESSLICH als ANALOGE EINGÄNGE!
Du definierst aber im Setup den Analogeingang A7 als Digitalen Ausgang.

Ich vermute, da hast du falsch gelesen, das sind die Pins des Displays zum I2C-Adapter.

Ok, sorry...Hatte ich übersehen.
A7 wurde als digitaler Ausgang definiert.
Das funktioniert nicht.

Danke erst mal für die Antworten...

Das Problem ist das wenn ein Fühler sich ändert oftmals ein zweiter mit wandert.... Beim versuchen drinnen waren die Temperaturen immer 20-70 Grad und Stromversorgung über Handynetzteil. Da war das Anfangs nie so extrem. Jetzt klappts egal wo nicht mehr und wüsste nicht das hier was geändert wurde.

Draussen dann über Powerbank mit 1A Ausgang und Temperaturen dann eben im Grillbereich (150 Grad für Pulled Pork max.). Hier hat es noch nie funktioniert. Temperaturen von 20 Grad werden hier mit 180 und ständig wechselnd angezeigt.

Die Thermometer sind über klinkenbuchsen angeschlossen was nicht optimal ist aber eben funktionell....

Und ja läuft alles über den Nano.

SpaceAce:
Die Thermometer sind über klinkenbuchsen angeschlossen was nicht optimal ist aber eben funktionell....

Die Verdrahtung ist eher interessant. Geschirmte 2-Draht-Leitungen oder etwas anderes? Wie verschaltet (Masse/GND).
Wie stabil ist die Versorgungsspannung? Die geht ins Messergebnis ein.

Mach doch mal ein Foto vom jetzigen Aufbau, bei dem man die Temperaturfühler sieht.

Gruß Tommy

SpaceAce:
Und ja läuft alles über den Nano.

Aber du gehst nicht weiter auf unsere Fragen ein.

Leider ist dein Sketch schwer zu lesen, da er fast ohne Kommentare daher kommt.
Somit ist eine Fehlersuche sehr schwer. Ich vermute den Fehler auch in der Hardware.

Dennoch, setze die Sensoren in einzelne Funktionen, dann kannst da besser Fehler suchen.

Und das wird übersichtlicher.

Hallo,
das hilft Dir nicht weiter, aber Dein ganzer Sketch ist Mist.
Sorge doch erst einmal dafür, das das Display fehlerfrei läuft.
Dann läßt Du ein (1Stck) TempSensor laufen und gibst die Temperatur richtig auf dem Disply aus.
Einmal Eiswasser messen (0°C), einmal kochendes Wasser (von Zimmertemperatur bis 98°C)
Wenn dann dieser eine Sensor läuft- dann schaffst Du es nach Bluetooth* rüber.

Schreibe Dir das in Funktionen- und werfe diese Mittelwerte raus.
Gruß und Spaß
Andreas

*Funk! D.h. kein delay() im Sketch!

Also gut dann werd ich mal versuchen eure Punkte erst mal ab zu arbeiten.

@SkobyMobil:
Klar habe ich mit einem Sensor angefangen und da hat ja auch alles geklappt. Erst mit mehreren kamen auch dir Probleme. Da gings schon mal für mich los das über BT dann an den MIT APP Inventor zu bekommen. Das ging mit einem Wert auch einfacher.

@Tommy56:
Die Verdrahtung ist noch seit Januar auf Steckbrett und aus Restmaterial zusammengebaut, aber ich probiers mal Foto. Ich bin auch eher am überlegen ob denn so ne Powerbank wirklich stabile 5V ausgibt. Vielleicht liegt da das Hauptproblem. Die Sensoren sehen aus als wären die geschirmt. Häng ich auch mal Bild ran.

Hoffe das hilft.

Wiese definierst du so viele Pins bei i2c ?

Die softserial pins passen nicht zum Fritzing

Die Bilder aus dem vorigen
Post sind verzerrt, fast nichts zu erkennen

Ich glaube auch, dass es an der Verdrahtung liegt. Schlechte Wackelkontakte.

Ausserdem hat SkobyMobil recht, der Code ist Mist.

Schau dir RunningMedian an, für Durchschnitt, und schau dir arrays an, die sind ideal für deine Problemstellung.

Auf deinen Bildern ist nicht wirklich etwas z-u erkennen.
Ein Hauptproblem ist die Verwendung von Steckbrettern in "mobilen" Anwendungen.

Warum gehst du nicht entsprechend unseren Vorschlägen vor.
Software optimieren und Hardware sauber und ohne Steckbrett aufbauen.

ElEspanol:
Wiese definierst du so viele Pins bei i2c ?

Das ist von der Library abhängig und durchaus richtig.

Wenn Du den Steckbrettaufbau benutzt, um am realen Gerät (im Freien) zu messen, wirst Du kaum Freude haben.
Den Weg zu einer stabilen Schaltung hat Dir Hotsystems bereits genannt.
Du hast ja jetzt etwas Zeit, bis die Grillzeit wieder beginnt.

Prüfe (messen) auch mal die Spannung der Powerbank. Manche schalten ab, wenn sie zu wenig Last haben.

Gruß Tommy

Sorry, die Bilder waren vor dem verkleinern noch OK....

Werde dann mal das ganze versuchen schöner aufzubauen und nochmal testen. Das Display mit I2C hat auf jeden Fall ja problemlos funktioniert. Ich werde trotzdem die Definitionen neu setzen.

Dachte das Fritzing hilft mehr als ein Bild.

Werde mich also mal ran setzen und mich dann evtl. nochmal melden.

Danke erst mal soweit.

Wenn die Spannungsteiler der Termperaturfühler zu hochohmig sind kann der interne sample & Hold Kondensator während der Samplingzeit nicht auf Endwert aufgeladen werden und die Messung wird durch die vorherige Messung beeinflußt.
Abhilfe:

  • 0,1µF zwischen analogen Eingang und Masse#
  • mehrfache messung des gleichen analogen Eingangs hintereinander und benutzung nur des letzten Meßwertes.

Grüße Uwe

SpaceAce:
Sorry, die Bilder waren vor dem verkleinern noch OK....

Werde dann mal das ganze versuchen schöner aufzubauen und nochmal testen. Das Display mit I2C hat auf jeden Fall ja problemlos funktioniert. Ich werde trotzdem die Definitionen neu setzen.

Das mit dem I2C-Display ist so ok und braucht nicht geändert werden.

Dachte das Fritzing hilft mehr als ein Bild.

Fritzing ist immer ein schlechte Lösung, zwar besser als nichts, aber wir sehen ja nicht wie du es aufgebaut hast.

Hallo,
fange da am besten mal von vorne an.
Als erstes sorgst Du für eine sichere Spannungsversorgung. Die Problematik
mit der Powerbank hat Tommy56 ja erklärt.
Also SteckernetzTeil oder Batterie.

Dann sorgst Du dafür, das Dein Display richtig und sicher läuft.
Wenn Du das hinbekommen hast, dann erweiterst Du Deinen Sketch mit einem
Sensor. Diesen kalibrierst Du mit bekannten Größen (Eiswasser, kochendes Wasser).
Den ganzen MittelwertMist läßt Du weg. Auch keine Delays in den Sketch.
Wenn Dir der Sensor dann richtige Temperaturen auf dem Display anzeigt, dann
stellst Du den Sketch hier ins Forum.
Man wird Dir sicherlich helfen, das ganze in hübsche Funktionen zu packen.

Wenn dann Display und Sensor vernünftig in einem halbwegs geordneten Sketch
laufen, dann bindest Du den 2. Sensor ein.
Sollte das nicht so funktionieren wie vorgesehen, dann den Sketch wieder ins
Forum.

Und keine Angst vor dem Steckbrett. Im großen und ganzen laufen diese Dinger
ohne Probleme, das kannst Du also weiter nutzen.

Fritzing kannst Du gut nutzen, um uns Deine Schaltung näher zu bringen. Was Du
aber verdrahtest- ist etwas völlig anderes.
Also erst ein Foto von Fritzing, dann wissen wir was Du vor hast. Und dann
ein Foto von der realen Verdrahtung, dann wissen wir ob Du es richtig gemacht
hast.
Ein Datenblatt von Deinen Sensoren wäre nicht schlecht. Vielleicht gibt es
eine gute Lösung um Die mit dem Arduino vernünftig in Betrieb zu nehmen.

Das Problem mit den Anfängern ist immer- sie wollen alles auf einmal.
In der ArduinoWelt ist das aber als Anfänger nicht zu machen. Bringe eines nach
dem anderen zum laufen. Sorge dafür, dringends- das Du in Deinen Projekten
immer nur eine Baustelle hast!

Also, gehe da mal mit Sinn und Verstand ran- dann werden Du und die Jung´s hier
im Forum das auch zum laufen bekommen.
Und wenn Dir hier jemand ne´ Frage stellt, dann antworte gefälligst drauf.

Dann noch etwas zu Deinen Klinkenbuchsen.
Du weißt schon, das die bei jedem "stecken" einen Kurzschluss verursachen?!
Gruß und Spaß
Andreas

Ich hoffe jetzt klappts.