Go Down

Topic: UV-Sensor Probleme im Loop teil (Read 694 times) previous topic - next topic

Thrillhouse

Sep 16, 2014, 04:12 pm Last Edit: Sep 16, 2014, 04:13 pm by Thrillhouse Reason: 1
Hallo Leute,
ich Baue mir gerade ein UV-Meter und habe ein kleines Problem im Loopteil.
Das Problem sind die if Bedingungen.
Da sie ja alle erfüllt werden, laufen sie in Dauerschleife durch.
Das soll natürlich nicht sein. :~

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int val;

void setup()
{
 Serial.begin(9600);// open serial port, set the baud rate to 9600 bps
}
void loop()

{
 Serial.println(val);
 lcd.begin(16,2);
 lcd.setCursor(0, 0);
 lcd.print("UV Index= ");
 
 val = analogRead(0);
 if (val < 10)
 {
 lcd.setCursor(11, 0);
 lcd.print("0");
 delay(1000);
}
 val = analogRead(0);
 if (val > 10)
 {
 lcd.setCursor(11, 0);
 lcd.print("1");
 delay(1000);
 }
 
   val = analogRead(0);
 if (val > 46)
 {
 lcd.setCursor(11, 0);
 lcd.print("2");
 delay(1000);
 }
 val = analogRead(0);
 if (val > 65)
 {
 lcd.setCursor(11, 0);
 lcd.print("3");
 delay(1000);
 }
 
   val = analogRead(0);
 if (val > 83)
 {
 lcd.setCursor(11, 0);
 lcd.print("4");
 delay(1000);
 }
 
   val = analogRead(0);
 if (val > 103)
 {
 lcd.setCursor(11, 0);
 lcd.print("5");
 delay(1000);
 }
 
   val = analogRead(0);
 if (val > 124)
 {
 lcd.setCursor(11, 0);
 lcd.print("6");
 delay(1000);
 }
 
   val = analogRead(0);
 if (val > 142)
 {
 lcd.setCursor(11, 0);
 lcd.print("7");
 delay(1000);
 }



}

sschultewolter

Du solltest dich mit BlinkWithoutDelay -> millis() auseinandersetzen.
Desweiteren ist es nicht nötig, den AnalogEingang mehrmals innerhalb einer loop abzufragen. Eine loop dauert im nonBlocking-Code (ohne delay) < 1ms.

Code: [Select]


void setup()
{
  lcd.begin(16,2);
  lcd.print("UV Index = ");
}

void loop()
{
int val_raw = analogRead(0);  // Einmal pro loop ausfuehren
int val = 0;                  // 0 - 7
 
  if(val_raw < 10) val = 0;
  else if(val_raw < 20) val = 1;
  // ...
  else val = 7;
 
  static unsigned long last_millis;
  if(millis() - last_millis >= 1000)
  {
    last_millis = millis();
    lcd.setCursor(11,0);
    lcd.print(val);
  }
}
   

Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

jurs


Hallo Leute,
ich Baue mir gerade ein UV-Meter und habe ein kleines Problem im Loopteil.


Ich habe Dir mal ein "alternatives" Programm zu Deinem gemacht.
Schaue es Dir an und vielleicht kannst Du ein bisschen in Sachen Programmiertechnik lernen.

Dein Sketch ist einfach nur Chaos.

Code: [Select]

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  Serial.begin(9600);       // open serial port, set the baud rate to 9600 bps
  lcd.begin(16,2);          // LCD EINMALIG initialisieren
  lcd.print("UV Index= ");  // auch das braucht nur EINMALIG geschrieben werden
}

byte uvWerte[]={10, 46, 65, 83, 103, 124, 142}; // Wertetabelle UV-Index

int val, uvIndex;

void loop()
{
  val = analogRead(A0); // Analogwert an A0 auslesen
  uvIndex=0;            // UV-Index mit Null annehmen ...
  for (int i=0;i<7;i++) // alle 7 Werte der Tabelle prüfen
  {
    if (val>uvWerte[i]) uvIndex++;  // ... und entsprechend der Wertetabelle erhöhen
  }
  Serial.print(val);       // ADC-Wert ausgeben
  Serial.print('\t');      // horizontaler Tabulator
  Serial.println(uvIndex); // UV-Index ausgeben
  lcd.setCursor(11, 0);
  lcd.print(uvIndex);
  delay(1000);
}

Thrillhouse

Danke Jungs,
ja ich bin noch neu in Sachen Programmieren.

Ich habe jetzt mal alles nach sschultewolter`s sketch umgeschrieben und es funktioniert :D
Aber deinen werd ich mir auch nochmal reinziehen  jurs.

Ich muss noch viel lernen aber jeden Tag geht es etwas besser.
Wenn ich das alles mit den Schleifen begriffen habe, ist das schon mal die halbe Miete :)

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16,2);
  lcd.print("UV Index = ");
}

void loop()
{
int val_raw = analogRead(0);  // Einmal pro loop ausfuehren
int val = 0;                  // 0 - 11
 
  if(val_raw < 10) val = 0;
  else if(val_raw < 46) val = 1;
  else if(val_raw < 65) val = 2;
  else if(val_raw < 83) val = 3;
  else if(val_raw < 103) val = 4;
  else if(val_raw < 124) val = 5;
  else if(val_raw < 142) val = 6;
  else if(val_raw < 162) val = 7;
  else if(val_raw < 180) val = 8;
  else if(val_raw < 200) val = 9;
  else if(val_raw < 221) val = 10;
  else val = 11;
 
  static unsigned long last_millis;
  if(millis() - last_millis >= 1000)
  {
    last_millis = millis();
    lcd.setCursor(11,0);
    lcd.print(val);
  }
}

sschultewolter

Schau dich mal hier um
http://openbook.galileocomputing.de/c_von_a_bis_z/008_c_kontrollstrukturen_001.htm#mjc7bf6f584a2fe20b4c5f6b16ba15d57d

Dort werden die Kontrollstrukturen um if ganz gut beschildert.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Thrillhouse

Danke super Seite....die kannte ich noch nicht.
Bei den meisten Seiten wird immer alles so oberflächlich erklärt...hier ist es viel besser beschrieben :)
Ich bedanke micht

Go Up