Lichtsensor-Pumpe-Uno-Lcd

Hallo,

ich komme gerade mit meinem Programm nicht weiter. Kurze Erklärung: DC Motor Pumpe verbunden mit 2 Relay Module LCD-Display, digitalen Lichtsensor und Arduino Uno.
Das Programm sollte die Pumpe einschalten, wenn der Wasserspiegel im Behälter erreicht wird.
Erstmal habe ich aber den Lichtwert kalibriert.
Alles funktioniert nur beim Einschalten macht sich die Pumpe aus und an. Der Wert ist sozusagen noch nicht kalibriert.
Ich will, dass die Pumpe sich erstmal automatisch einschalten lässt nach der Kalibrierung.
Ich hoffe, ich habe es verständlich erklärt.
Danke

Der Sketsch Siehe Unten

#include <SPI.h>
#include <Wire.h>

#include <Digital_Light_TSL2561.h>
#include "rgb_lcd.h"
rgb_lcd lcd;
const int colorR = 255;
const int colorG = 0;
const int colorB = 0;
const int relaisIN1 = 4;
int output_value;
int eingabe;
int upButton = 2;
int downButton = 3;
int selectButton = 5;
int Pumpeein = 7;
int Kalibrierung = 8;
int menu = 1;
int Timer = 0;
int Timer_1 = 0;
int Timer2 = 0;
int Timer3 = 0;

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

  pinMode(relaisIN1, OUTPUT);
  Wire.begin();
  TSL2561.init();
  lcd.begin(16, 2);
  pinMode(Pumpeein, INPUT_PULLUP);
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  pinMode(Kalibrierung, INPUT_PULLUP);
  lcd.setRGB(colorR, colorG, colorB);
  lcd.setCursor(0, 0);
  lcd.clear();
  lcd.print("Fur Kalibrierung");
  lcd.setCursor(0, 1);
  lcd.print("Up oder Down");
}
void loop() {
  //Serial.print("The Light value is: ");
  //Serial.println(TSL2561.readVisibleLux());
  Serial.println(TSL2561.readVisibleLux());
  if (!digitalRead(Kalibrierung)) {
    output_value = TSL2561.readVisibleLux() + 20;
    lcd.clear();
    lcd.setCursor(6, 0);
    lcd.print("Sensor ist");
    lcd.setCursor(0, 0);

    lcd.print(TSL2561.readVisibleLux());
    lcd.setCursor(0, 1);
    lcd.print(output_value);
    lcd.setCursor(6, 1);
    lcd.print("kalibriert");

    delay(100);
    while (!digitalRead(Kalibrierung))
      ;
  }

  if (!digitalRead(downButton)) {
    menu++;
    updateMenu();
    delay(100);
    while (!digitalRead(downButton))
      ;
  }
  if (!digitalRead(upButton)) {
    menu--;
    updateMenu();
    delay(100);
    while (!digitalRead(upButton))
      ;
  }
  if (!digitalRead(selectButton)) {
    executeAction();

    delay(100);
    while (!digitalRead(selectButton))
      ;
  }
  if (!digitalRead(Pumpeein)) {
    digitalWrite(relaisIN1, HIGH);
    delay(100);
    while (!digitalRead(Pumpeein))
      ;
  } else {

    digitalWrite(relaisIN1, LOW);
  }

  if (output_value < TSL2561.readVisibleLux()) {

    digitalWrite(relaisIN1, HIGH);
    delay(2000);

  } else {

    digitalWrite(relaisIN1, LOW);  //Relais1 an Pumpe aus
  }
}
void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      lcd.clear();
      lcd.print(">Medium ist vorhanden");
      lcd.setCursor(0, 1);
      lcd.print(" Medium ist nicht vorhanden");
      break;
    case 2:
      lcd.clear();
      lcd.print(" Medium ist vorhanden");
      lcd.setCursor(0, 1);
      lcd.print(">Medium ist nicht vorhanden");
      break;


    case 5:
      menu = 2;
      break;
  }
}

void executeAction() {
  switch (menu) {
    case 1:
      action1();
      break;

    case 2:
      action2();
      break;
  }
}

void action1() {

  lcd.clear();

  if (!digitalRead(selectButton)) {

    lcd.clear();
    lcd.print("Fuer Kalibrieren");
    lcd.setCursor(0, 1);
    lcd.print("Bestaetigen");

    delay(100);
  }
}

void action2() {

  if (!digitalRead(selectButton)) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Medium");
    lcd.setCursor(0, 1);
    lcd.print("nachfuellen");


    delay(100);
  }
}


Lösche mal die leeren Zeilen.

ok mache ich

Und benutze mal Strg-T in der IDE.

Auch erledigt :slight_smile:

Du musst dir in einer bool Variable merken ( false/true ) ob die Kalibirierung schon durchgelaufen ist. Und das Einschalten der Pumpe machst Du dann zusätzlich davon abhängig, dass diese Variable auf 'true' steht.

Ja das habe ich versucht nur irgenwie hat es nicht geklappt.

Dann zeig den Versuch doch mal

#include <SPI.h>
#include <Wire.h>

#include <Digital_Light_TSL2561.h>
#include "rgb_lcd.h"
rgb_lcd lcd;
const int colorR = 255;
const int colorG = 0;
const int colorB = 0;
const int relaisIN1 = 4;
int output_value;
int eingabe;
int upButton = 2;
int downButton = 3;
int selectButton = 5;
int Pumpeein = 7;
int Kalibrierung = 8;
int menu = 1;
int Timer = 0;
int Timer_1 = 0;
int Timer2 = 0;
int Timer3 = 0;
int Sperre;
void setup() {
  Serial.begin(9600);

  pinMode(relaisIN1, OUTPUT);
  Wire.begin();
  TSL2561.init();
  lcd.begin(16, 2);
  pinMode(Pumpeein, INPUT_PULLUP);
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  pinMode(Kalibrierung, INPUT_PULLUP);
  lcd.setRGB(colorR, colorG, colorB);
  lcd.setCursor(0, 0);
  lcd.clear();
  lcd.print("Fur Kalibrierung");
  lcd.setCursor(0, 1);
  lcd.print("Up oder Down");
}
void loop() {
  Sperre=(digitalRead(Kalibrierung)== HIGH,LOW);
  //Serial.print("The Light value is: ");
  //Serial.println(TSL2561.readVisibleLux());
  Serial.println(TSL2561.readVisibleLux());
  if (!digitalRead(Kalibrierung)) {
    output_value = TSL2561.readVisibleLux() + 20;
    lcd.clear();
    lcd.setCursor(6, 0);
    lcd.print("Sensor ist");
    lcd.setCursor(0, 0);

    lcd.print(TSL2561.readVisibleLux());
    lcd.setCursor(0, 1);
    lcd.print(output_value);
    lcd.setCursor(6, 1);
    lcd.print("kalibriert");

    delay(100);
    while (!digitalRead(Kalibrierung))
      ;
  }

  if (!digitalRead(downButton)) {
    menu++;
    updateMenu();
    delay(100);
    while (!digitalRead(downButton))
      ;
  }
  if (!digitalRead(upButton)) {
    menu--;
    updateMenu();
    delay(100);
    while (!digitalRead(upButton))
      ;
  }
  if (!digitalRead(selectButton)) {
    executeAction();

    delay(100);
    while (!digitalRead(selectButton))
      ;
  }
  if (!digitalRead(Pumpeein)) {
    digitalWrite(relaisIN1, HIGH);
    delay(100);
    while (!digitalRead(Pumpeein))
      ;
  } else {

    digitalWrite(relaisIN1, LOW);
  }

  if (Sperre){
(output_value < TSL2561.readVisibleLux());

    digitalWrite(relaisIN1, HIGH);
    delay(2000);

  } else {

    digitalWrite(relaisIN1, LOW);  //Relais1 an Pumpe aus
  }
}
void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      lcd.clear();
      lcd.print(">Medium ist vorhanden");
      lcd.setCursor(0, 1);
      lcd.print(" Medium ist nicht vorhanden");
      break;
    case 2:
      lcd.clear();
      lcd.print(" Medium ist vorhanden");
      lcd.setCursor(0, 1);
      lcd.print(">Medium ist nicht vorhanden");
      break;


    case 5:
      menu = 2;
      break;
  }
}

void executeAction() {
  switch (menu) {
    case 1:
      action1();
      break;

    case 2:
      action2();
      break;
  }
}

void action1() {

  lcd.clear();

  if (!digitalRead(selectButton)) {

    lcd.clear();
    lcd.print("Fuer Kalibrieren");
    lcd.setCursor(0, 1);
    lcd.print("Bestaetigen");

    delay(100);
  }
}

void action2() {

  if (!digitalRead(selectButton)) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Medium");
    lcd.setCursor(0, 1);
    lcd.print("nachfuellen");


    delay(100);
  }
}

Siehe Sperre

Das wird so nichts, lass die Zeile Sperre= mal ganz weg und setze stattdessen:

  bool Sperre = true; // aufgrund des Namens invertiert zu meinem Vorschlag definiert
...
...
    lcd.print("kalibriert");
    Sperre = false;
...
...
  if  (!Sperre  &&  output_value < TSL2561.readVisibleLux() ) {
    digitalWrite(relaisIN1, HIGH);   // Pumpe EIN
...

Aufgrund deines Variablennamens 'Sperre' habe ich die Logik gegenüber menem Voschlag invertiert. Wenn 'Sperre' true st, sollte die Pumpe nicht eingeschaltet werden.

die kannst du auch als const machen

Die kannst du entfernen

MicroBahner vielen lieben dank :slight_smile: es funktioniert und ich bin dir sehr dankbar.

1 Like

Gern geschehen :slightly_smiling_face: :slightly_smiling_face:

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.