Go Down

Topic: Hilfe bei Arrys (Read 392 times) previous topic - next topic

Yannes

Hi
ich habe mich mkal mit arrys versucht ,aber komm nicht weiter. Der Sketch soll die Temperatur messen und dann aus 11 Messungen den Durchschnitt bilden.Ich weiß das das auch so geht will es aber mal probieren.
Schonmal Danke im voraus

Code: [Select]
#include <math.h>
 
int sensorPin = A0; // Hier wird der Eingangs-Pin deklariert
 int x[]= {0,0,0,0,0,0,0,0,0,0,0} ;
// Diese Funktion übersetzt den aufgenommenen analogen Messwert
// in die entsprechende Temperatur in °C und gibt diesen aus
double Thermistor(int RawADC)
{
    double Temp;
    Temp = log(10000.0 * ((1024.0 / RawADC - 1)));
    Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
    Temp = Temp - 273.15;     
   
    return Temp;
}
 
// Serielle Ausgabe in 9600 Baud
void setup()
{
    Serial.begin(9600);
}
 
// Das Programm misst den aktuellen Spannungswert am NTC
// und übersetzt das Ergebnis in °C für die serielle Ausgabe
void loop()
{
    int readVal = analogRead(sensorPin);
    double temp =  Thermistor(readVal);
 if( x[10] > 0){
Serial.println ((x[0]+x[1]+x[2]+x[3]+x[4]+x[5]+x[6]+x[7]+x[8]+x[9]+x[10])/11);
analogWrite(x[0,1,2,3,4,5,6,7,8,9,10],0);
}else if ( x[9]> 0){
analogRead(x[10],temp);
}else if ( x[8]> 0){
analogRead(x[9],temp);
}else if ( x[7]> 0){
analogRead(x[8],temp);
}else if ( x[6]> 0){
analogRead(x[7],temp);
}else if ( x[5]> 0){
analogRead(x[6],temp);
}else if ( x[4]> 0){
analogRead(x[5],temp);
}else if ( x[3]> 0){
analogRead(x[4],temp);
}else if ( x[2]> 0){
analogRead(x[3],temp);
}else if ( x[1]> 0){
analogRead(x[2],temp);
}else if ( x[0]> 0){
analogRead(x[1]),temp);
}else {
analogRead(x[0]),temp);
}

    // Ausgabe auf die serielle Schnittstelle
  //  Serial.print("Aktuelle Temperatur ist:");
   
    /* Serial.print(char(186)); //Ausgabe <°> Symbol
    Serial.println("C");
    Serial.println("---------------------------------------");
 */
    delay(500);
}

ardubu

#1
Mar 18, 2018, 06:32 pm Last Edit: Mar 18, 2018, 06:33 pm by ardubu
hier mal für 10 Messungen:
Code: [Select]
#include <math.h>
int readVal;
const int sensorPin = A0; // Hier wird der Eingangs-Pin deklariert
 
// Diese Funktion übersetzt den aufgenommenen analogen Messwert
// in die entsprechende Temperatur in °C und gibt diesen aus
double Thermistor(int RawADC)
{
    double Temp;
    Temp = log(10000.0 * ((1024.0 / RawADC - 1)));
    Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
    Temp = Temp - 273.15;     
    return Temp;
}
 
// Serielle Ausgabe in 9600 Baud
void setup()
{
    Serial.begin(9600);
}
 
// Das Programm misst den aktuellen Spannungswert am NTC
// und übersetzt das Ergebnis in °C für die serielle Ausgabe
void loop()
{
  double temp =  Thermistor(readVal);
  static uint16_t temp_ges;
  static uint16_t t[10];
  static byte index=0;
  static bool erster_durchlauf=0;
  t[index]=analogRead(sensorPin);
  temp_ges+=t[index];
  index++;
  if(index>9) {index=0; erster_durchlauf=1;}
  if(!erster_durchlauf) readVal=temp_ges/index+1;
  else readVal=temp_ges/10;
  temp_ges-=t[index];
   
    delay(500);
}

Yannes

danke
kannst du mir diesen teil nochmal erklären
Code: [Select]
static uint16_t temp_ges;
  static uint16_t t[10];
  static byte index=0;
  static bool erster_durchlauf=0;
  t[index]=analogRead(sensorPin);
  temp_ges+=t[index];
  index++;
  if(index>9) {index=0; erster_durchlauf=1;}
  if(!erster_durchlauf) readVal=temp_ges/index+1;
  else readVal=temp_ges/10;
  temp_ges-=t[index];

ardubu

#3
Mar 18, 2018, 06:51 pm Last Edit: Mar 18, 2018, 06:59 pm by ardubu
Code: [Select]
  static uint16_t temp_ges;//Variable temp_ges als int deklarieren
  static uint16_t t[10];//Array für 10  t-Glieder als int deklarieren
  static byte index=0;//Start des Array's bei 0
  static bool erster_durchlauf=0;//bool Variable erster_durchlauf mit 0 initialisieren
  t[index]=analogRead(sensorPin);//Sensor auslesen und in t[index] ablegen
  temp_ges+=t[index];//compound addition
  index++;//inkrement von index
  if(index>9) {index=0; erster_durchlauf=1;}//wenn index das erste mal >9 wird erster Durchlauf auf 1 setzen
  if(!erster_durchlauf) readVal=temp_ges/index+1;//beim ersten Durchlauf durch index +1 teilen
  else readVal=temp_ges/10;//sonst durch 10
  temp_ges-=t[index];//compound subtraction

michael_x

Ich verstehe die Variablen-Definition so:
Code: [Select]
static uint16_t t[10];//Array für die letzten 10 Rohwerte ( vom analogRead )
static byte index=0;// Index auf die aktuelle Position im Array t
static uint16_t temp_ges;//Summe der (bis zu) 10 letzten Messwerte
static bool erster_durchlauf=0;// 0 = erster Durchlauf, 1 = folgende: 10 Werte sind vorhanden
( wobei der letzte Name eigentlich das Gegenteil bedeutet, da 0==false und 1==true ist ;) )

Dass ardubu
  double temp =  Thermistor(readVal);
schon am Anfang aufruft und temp dann nicht weiterverwendet, ist dir wohl selbst klar und reparierbar, denke ich.

Doc_Arduino

Hallo,

da schmerzt einem das Auge.   :)   Ich mach mal einen Vorschlag .


Code: [Select]

// Das Programm misst den aktuellen Spannungswert am NTC
// und übersetzt das Ergebnis in °C für die serielle Ausgabe

int sensorPin = A0; // Hier wird der Eingangs-Pin deklariert
const byte ANZAHL = 10;
float messwerte [ANZAHL];

  
void setup()
{
  Serial.begin(9600);
}


void loop()
{
  messen();
}


void messen ()
{
  static unsigned long last_millis = 0;
  const unsigned int intervall = 1000;

  if (millis() - last_millis < intervall)  return;
  last_millis = millis();

  long summe = 0;
  float mittelwert = 0.0;
  
  for (byte i=0; i < ANZAHL; i++) {
    
    messwerte[i] = analogRead(sensorPin);
    summe = summe + messwerte[i];

    Serial.print( Thermistor(messwerte[i]) ); Serial.println('C');
  }

  mittelwert = summe / ANZAHL;

  Serial.print(F("Mittel "));
  Serial.print( Thermistor(mittelwert) ); Serial.println('C');
}  


// Diese Funktion übersetzt den aufgenommenen analogen Messwert
// in die entsprechende Temperatur in °C und gibt diesen aus
float Thermistor(long RawADC)
{
  float Temp;
  Temp = log(10000.0 * ((1024.0 / RawADC - 1)));
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15;

  return Temp;
}


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

michael_x

Quote
Ich mach mal einen Vorschlag
Schön, ist aber etwas "ganz anderes"

Du misst direkt hintereinander 10 mal und bildest daraus einen Mittelwert. Keine Ahnung, wozu du da das Array brauchst. Und wozu das überhaupt gut sein soll, wenn man einen Mittelwert über 10 zeitlich auseinanderliegende Werte haben möchte.

Doc_Arduino

Hallo,

das man das Array hier nicht benötigt ist mir klar. Aufsummieren wäre ausreichend. Aber! Der TO wollte etwas mit einem Array machen und er wollte einen Mittelwert bilden. Genau das wird gezeigt. Er kann damit noch Zugriffe auf das Array für sich selbst probieren.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

ardubu

Dass ardubu
  double temp =  Thermistor(readVal);
schon am Anfang aufruft und temp dann nicht weiterverwendet, ist dir wohl selbst klar und reparierbar, denke ich.
das stammt aus dem Ursprungsprogramm von Yannes.

Go Up