Temperaturänderung berechnen und ausgeben

Guten Tag,

ich habe den Arduino korrekt mit einem Temperatur Sensor verbunden und möchte, dass alle 1000 ms
die Temperaturänderung ausgegeben wird. Bis jetzt wurde immer das Gleiche ausgegeben, egal was ich versucht habe.

#include <Arduino.h>
#include "rain.h"

int TMP36 = A0; 
jetzt TMP36 temperatur = 0;
double temperatur = 0;
double sensorwert = 0;
double Temp_aenderung = 0;
int i = 0;
int n = 24;
unsigned long xzeit1 = 0;
unsigned long xzeit2 = 0; 
double temp[24];
double Temp_mittelwert = 0;
const unsigned long messintervall = 1000;

void setup()              
{
    Serial.begin(9600);     
    pinMode(13, OUTPUT);
}

void loop()                     
{
   sensorwert = analogRead(TMP36);                
    temperatur = map(sensorwert, 0, 410, -50, 150);
    

unsigned long Laufende_zeit2 = millis();

for (int i=0; i <= 23; i++)
{ 
    if (Laufende_zeit2 % 1000 == 0)
    {
    temp[i] = map(analogRead(TMP36), 0, 410, -50, 150); 
    
      
   Temp_aenderung = (temp[(i-1)] - temp[i]);

    Serial.print("Temperaturänderung der letzen Stunde:");   
    Serial.print(Temp_aenderung);
    Serial.println(" Grad");
    }
   }

Das wird innerhalb einer sec ausgegeben, wenn ich die Anwendung starte:

Temperaturänderung der letzen Stunde:-19.00 Grad
Temperaturänderung der letzen Stunde:-1.00 Grad
Temperaturänderung der letzen Stunde:0.00 Grad
Temperaturänderung der letzen Stunde:0.00 Grad
Temperaturänderung der letzen Stunde:0.00 Grad
...

Und warum postest du den Thread doppelt ?

Damit wird dir auch nicht schneller geholfen.

Bis jetzt wurde immer das Gleiche ausgegeben, egal was ich versucht habe.

Und was hast du alles versucht ?

Das war ein Versehen, ich wollte es erst unter einem anderen Thema posten und es wurde hier her verschoben
Ich habe bis jetzt versucht die Tempänderung in einer extra if schleife zu berechnen. Ich habe das einfach mal in dieser Version gepostet, da daraus glaube ich am besten klar wird was mein Ziel ist.

Gruß Florian

Hallo,

  1. warum verwendest Du ein Array ?
  2. warum machst Du die Abfrage der Zeit nich so wie das in tausend anderen Beispielen gemacht wird.
    schau dir mal das Beispiel blinkwithoutdelay an

Heinz

Hallo,

  1. den Array verwende ich, da später noch die Durchschnittstemperatur mit diesem berechnet wird.

  2. ich habe die Zeitabfrage auch schon so gemacht, das Problem ist trotzdem das gleiche.

Es soll ja nur 1x pro Sekunde die Änderung der Temperatur ausgegeben werden

falls es hilft ist hier nochmal der gesamte Code. Die Ausgabe der Temperatur und des Durchschnitts, funktioniert bereits ohne den Code der Änderung mit einzubinden.

#include <Arduino.h>
#include "rain.h"

int TMP36 = A0;jetzt TMP36 temperatur = 0;
double temperatur = 0;
double sensorwert = 0;
double Temp_aenderung = 0;
int i = 0;
int n = 24;
unsigned long xzeit1 = 0;
unsigned long xzeit2 = 0; 
double temp[24];
double Temp_mittelwert = 0;
const unsigned long messintervall = 1000;

void setup()              
{ 
    Serial.begin(9600); 
    pinMode(13, OUTPUT);
}

void loop()
{
   sensorwert = analogRead(TMP36);                 
    temperatur = map(sensorwert, 0, 410, -50, 150); 
    
    unsigned long Laufende_zeit1 = millis();

     if (Laufende_zeit1 - xzeit1 >= messintervall )  
     {
     
     xzeit1 = Laufende_zeit1; 

    if (temperatur >= 0)
    {
        digitalWrite(13, LOW);                      
        Serial.print("Es sind ");
        Serial.print(temperatur);
        Serial.println(" Grad");
    }

    else                                   
    {
        digitalWrite(13, HIGH);
        Serial.print("Es sind ");
        Serial.print(temperatur);
        Serial.println(" Grad");
    }
        
     }

unsigned long Laufende_zeit2 = millis();

for (int i=0; i <= 23; i++)
{ 
    if (Laufende_zeit2 % 1000 == 0)
    {
    temp[i] = map(analogRead(TMP36), 0, 410, -50, 150); 
    
      
   Temp_aenderung = (temp[(i-1)] - temp[i]);

    Serial.print("Temperaturänderung der letzen Stunde:");   
    Serial.print(Temp_aenderung);
    Serial.println(" Grad");
    }
     
        }
if (Laufende_zeit2 == 24000)
    { 

for(int i = 0; i <= 23 ; i++)
{
 Temp_mittelwert += temp[i];
}

    Serial.print("Mittelwert der letzten 24 Stunden:");   
    Serial.print(Temp_mittelwert /= 24);
    Serial.println(" Grad");
}
}

Hallo,

wozu hast du denn die for schleife drin da kommst du doch nicht mehr raus solange die läuft.

Du fragst in der if abfragen für die Zeit auf == ab , damit ist es doch Zufall wenn du genau dann da vorbeikommst.

oben hast Du eine richtige Ereignissabfrage für die Messteit gemacht , mach das duch unten genauso nur das du eine Stunde in ms da angibst. Innerhalb des if zählst Du den Index für das Array hoch und machst die Abfragen auf den letzten Wert. Wenn der Index bei 24 angekommen ist setzt du In auf 0 zurück.

benutze mal strg T zum formatieren damit die Klammern richtig stehen

Heinz

Dass du temp als double definierst, nutzt nichts. map rechnet nur Ganzzahlen und reduziert dir die Auflösung um 1 bit ( Wertebereich 400 -> 200 )
Wie schnell soll sich deine Temperatur in einer Sekunde ändern?

Was soll das jetzt TMP36 temperatur in Zeile 4 ? Auch als Kommentar verstehe ich es nicht.

Hi

Das ist Alles sehr verworren.
WAS willst Du mit der FOR-Schleife? (davon ab: Es gibt keine IF-Schleifen).
Deine IF auf
Laufende_zeit2 == 24000 wird wohl bestenfalls 1x wahr - dann für 49,x Tage nicht mehr.

In der IF drüber hast Du, innerhalb der FOR, ein
Laufende_zeit2 % 1000 == 0
Wenn DAS zutrifft, schüttest Du Dir sämtliche Elemente im Array mit der aktuellen Temperatur zu - wenn nicht (Du musst den Zeitpunkt halt auf die Millisekunde genau treffen) - dann ahlt nicht, dann läuft die FOR nur so für den Spaß im Kreis.

Kommentare würden echt nicht schaden, aber dann vll. Welche, mit Denen man was anfangen kann.

MfG

Hab den zweiten Topic gelöscht.
Uwe

Du hast Dich irgendwo ab

 unsigned long Laufende_zeit2 = millis();
  for (int i = 0; i <= 23; i++)

total verrannt.

Aber vorher möchte ich noch auf den Teil ab
if (temperatur >= 0)
eingehen.

Warum fasst Du die Ausgabe nicht zusammen?

if (temperatur >=0)
  {
  digitalWrite(13, LOW);
  }
else
  {
  digitalWrite(13, HIGH);
  }
  Serial.print("Es sind ");
  Serial.print(temperatur);
  Serial.println(" Grad");

Nun zu Deinem Problem:
Die Idee ist anscheinend, das Du die Temp von vor 60 Minuten mit der aktuellen vergleichen willst?
Dafür benötigst Du einen größeren Ringspeicher; und Du hast den zweiten Schritt vor dem ersten gemacht.
Ausgehend von Deinem Code mußt Du als erstes prüfen, ob die Zeit zwischen letzten millis und aktuellen millis dem Kriterium >=60 Minuten entspricht.
Erst dann kannst Du alles andere abarbeiten.

Aber egal was Du dann veranstaltest, wird Dich das Ergebnis nicht befriedigen.
Du vergleichst nur eine einmalig in der letzten Stunde aufgenommenen Temperatur mit der bei jedem Durchlauf in der aktuellen Stunde aufgenommenen Temperatur.
Messfehler werden nicht berücksichtigt und den Rest kannst Du Dir selbst ausrechnen.

Nimm Dir einen Zettel, einen Stift und schreibe Dir auf, was Du willst
Entwickle Deinen Code danach.

Stell den dann ein, wenn Du nicht weiter kommst. Mit dem Kommentar von Deinem Zettel, wo Du denkst, das der Code das (auch nicht) macht, was Du willst.

Wenn er nur aller 60 Minuten die Differnz haben will, braucht er keinen Ringspeicher, sondern nur eine Variable, die den Wert vor 60 Minuten (initial beim Programmstart) hält bund eine, die die millis dazu hält.
Nach 60L * 60 * 1000 millis wird ein neuer Wert bestimmt und mit dem vor 60 Minuten verglichen -> Differenz ausgeben, millis-Wert und aktuelle Temperatur speichern und alles von vorn.

Gruß Tommy

// fragmente
for (int i=0;
temp[(i-1)]

Array Bereichsunterschreitung.

Also ich habe nun auch festgestellt das die Mittelwertberechnung fehlerhaft war.
Das Problem habe ich nun anders gelöst, bin jetzt nur noch unsicher wie ich die Temperaturänderung zwischen den Messungen realisieren soll. Und dass es nicht 24 h sind ist mir schon klar, um das schnell testen zu können habe ich es zu 24 sec geändert.
Mit STRG T passiert bei mir leider nichts, ich nutze VSC.

void loop()                    
{
   sensorwert = analogRead(TMP36);                 //Auslesen des Sensorwerts
    temperatur = map(sensorwert, 0, 410, -50, 150); //Sensorwert umwandeln
    
    unsigned long Laufende_zeit1 = millis();

 if (Laufende_zeit1 - xzeit1 >= messintervall )  //immer wenn die zeit des Messintervalls erreicht ist, löst 

die schleife aus. 
 {
     xzeit1 = Laufende_zeit1; 

    if (temperatur >= 0)
    {
        digitalWrite(13, LOW);                        
        Serial.print("Es sind ");
        Serial.print(temperatur);
        Serial.println(" Grad");
    }

    else                                   
    {
        digitalWrite(13, HIGH);
        Serial.print("Es sind ");
        Serial.print(temperatur);
        Serial.println(" Grad");
    }

    summe = temperatur + summe;         //Die Summe steigt mit jedem Zeitintervall um den gemessenen Wert
     
if (xzeit1 % 24000 ==0)                //Nach Ablauf eines Messzyklus wird der Durchschnitt berechnet und 

ausgegeben
 {
     Serial.print("Mittelwert der letzten 24 Stunden:");   
    Serial.print(summe /= 24);
    Serial.println(" Grad");

    summe= 0;                               //Die Summe wird auf 0 zurück gesetzt und im nächsten Zyklus 

wieder neu genutzt
 }
 }
}

flo_duino:
Mit STRG T passiert bei mir leider nichts, ich nutze VSC.

Nur überflogen, wenn es nicht zutrifft nicht schlagen.

Ich habe mir den Code gennommen und....

    if (temperatur >= 0)
      {
      digitalWrite(13, LOW);
      Serial.print("Es sind ");
      Serial.print(temperatur);
      Serial.println(" Grad");
      }

    else
      {
      digitalWrite(13, HIGH);
      Serial.print("Es sind ");
      Serial.print(temperatur);
      Serial.println(" Grad");
      }

... festgestellt das Du meinem Hinweis nicht gefolgt bist.
Warum?