UV-Sensor Probleme im Loop teil

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. :~

#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);
  }



}

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.

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);
  }
}

Thrillhouse:
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.

#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);
}

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

Ich habe jetzt mal alles nach sschultewolter`s sketch umgeschrieben und es funktioniert :smiley:
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 :slight_smile:

#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);
  }
}

Schau dich mal hier um

Dort werden die Kontrollstrukturen um if ganz gut beschildert.

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 :slight_smile:
Ich bedanke micht