INPUT PIN immer auf HIGH

Hallo zusammen

Hab vor ca. 3 Wochen mir den Arduino StarterKit gekauft und mich durch das Buch durchgearbeitet.

Voller Tatendrang wollte ich mal was eigenes Bauen und bin zu ner kleinen Wetterstation gekommen. Das auslesen der Daten und diese dann auch auf ein I2C LCD Display ausgeben funktioniert.

Nun sollte auch die Hintergrundbeleuchtung des LCD’s nach 30 sek. abschalten und wenn man den Taster auf PIN 7 drück auch wieder für 30 sek einschalten. Leider funktioniert es so nicht wie ich mir das wünsche. PIN 7 ist immer auf HIGH
Der Taster ist mit einem PULLDOWN Resistor an GND angeschlossen.
Mit PULLUP Resistor und geänderten Werten funktioniert es auch nicht.

Selbst wenn ich das Jumperkabel vom PIN entferne bleibt es auf HIGH.

Mit dem DigitalReadSerial Sketch funktioniert es, also liegt es nicht an defekter H/W oder falsche Verdrahtung.
Ich mach irgendwo ein Denkfehler, komme aber nicht drauf.

Könnt ihr mir vielleicht weiterhelfen?

Gruss

/*
Wetterstation v0.3
Display connection: VCC-5v, GND-GND, SDA-A4, SCL-A5
BME280 Connection: VIN-5v, GND-GND, SCK-SCL(od.A5), SDI-SDA(od.A4)
*/
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

LiquidCrystal_I2C lcd(0x3f, 20, 4); //set Adress of LCd to 0x3f and set LCD size
Adafruit_BME280 bme; // I2C
unsigned long previousMillis = 0;
long interval = 10000; //Interval for Temp. reading
long backLightoff = 30000; //Backlighttime
const int lightbutton = 7; //button for switching on backlight
int lightbuttonState = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(lightbutton, INPUT);
  lcd.init();       //LCD Initiiren
  lcd.backlight();  //LCD-Backlight an
  unsigned long currentMillis = millis();
  bool status;

  status = bme.begin();
  if (!status) {
    lcd.setCursor(0, 0);
    lcd.print("Could not find");
    lcd.setCursor(0, 1);
    lcd.print("valid BME280 sensor");
    while (1);
}

  lcd.setCursor(0, 0);
  lcd.print("Wetterstation");
  lcd.setCursor(0, 1);
  lcd.print("Version 0.3");
  delay(10000);
  lcd.clear();
  digitalWrite(lightbutton, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  printData();
  backLightonoff();
}

void printData() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    lcd.setCursor(0, 0);
    lcd.print("ARDU-Wetter");

    lcd.setCursor(0, 1);
    lcd.print("Temp. = ");
    lcd.print(bme.readTemperature());
    lcd.print("*C");

    lcd.setCursor(0, 2);
    lcd.print("Druck = ");
    lcd.print(bme.readPressure() / 100.0F);
    lcd.print(" hPa");

    lcd.setCursor(0, 3);
    lcd.print("Luftf.= ");
    lcd.print(bme.readHumidity());
    lcd.print(" %");
    previousMillis = currentMillis;
  }
}

void backLightonoff() {
  unsigned long backlightMillis = millis();
  int lightbuttonState = digitalRead(lightbutton);

  if (backlightMillis > backLightoff) {
    lcd.noBacklight();
    Serial.println(backlightMillis); //for debug
  }
  if (lightbuttonState == HIGH) {
    Serial.println(lightbuttonState); //for debug
    lcd.backlight(); //deactivated for debug
    backlightMillis = 0;
  }
}

Hi

Ein PullDN zieht den Taster-Pin nach GND - da ist Es widersinnig, Diesen Taster noch an GND anzuschließen.
(Gleiches für PullUP und Vcc)

Wie hast Du den Taster angeschlossen?
An GND? Dann brauchst Du an dem µC-Pin einen PullUP - hier geht auch der Interne!
An Vcc? Dann brauchst Du an dem Taster-Pin einen PullDN

Du willst ja einen Wechsel haben zwischen Ruhe (Potential durch Pull-Widerstand vorgegeben) und Aktiv (der Taster schalten den Pull-Widerstand auf das gegensinnige Potential).

Je nach Taster haben Diese 4 Kontakte, wovon jeweils zwei verbunden sind - vll. hast Du hier statt dem Tast-Pin den Versorgungs-Pin an dem µC-Pin angeschlossen?

MfG

Der Sketch sieht soweit (Pin D7) ok aus.
Vermute da einen Fehler in deiner Schaltung.

Der Taster ist mit einem PULLDOWN Resistor an GND angeschlossen.

Der Widerstand muß zwischen Eingang und Masse und der Taster zwischen Eingang und +5V.

http://www.instructables.com/id/Understanding-the-Pull-up-Resistor-With-Arduino/ ist pullup und pulldown-Widerstand gut und ausführlich erklährt.

Grüße Uwe

Ich hab die Beiträge im gekaperten Tread gelöscht.
Grüße Uwe

Danke für die schnellen Antworten.

Mit der DigitalReadSerial Sketch funktioniert es ja, Taster nicht drücken HIGH, Taster drücken LOW.

Den Taster hab ich so verdrahtet wie es auch im Projektbuch des Starterkits beschrieben ist.
Eine Seite des Taster an Vcc die andere Seite an PIN 7 und via 10kOhm wiederstand an GND.

Hast Du Deinen Taster mal durchgemessen? Evtl. hat der einen Kurzschluß?

Gruß Tommy

Hi

Kommen am Pin keine 5V an, oder passiert nicht Das, was Du denkst, was passieren müsste?
Deine Funktion backlightonoff setzt als Erstes backlightsmillis auf den aktuellen Wert von millis().
danach prüfst Du, ob dieser Wert >0 (äh, backLightoff) ist, dieser Wert wird aber nur 1x auf 0 gesetzt.
Somit machst Du in jeder Runde das Backlight aus.
Danach prüfst Du, ob der Taster HIGH ist, schaltest das Licht an und setzt backlightsmillis auf 0 (was im nächsten Aufruf eh wieder mit millis() initiiert wird).

Selber würde ich auch die ganzen Texte in printdata nicht immer wieder zum Display schicken - was sich nicht ändert, muß man auch nicht neu schicken - Du musst dann halt an die Stelle springen, wo der Wert hin soll.

Theoretisch müsste das Backlight des Display zumindest bei gedrücktem Taster glimmen, da Es laufend aus und an geschaltet wird.

MfG

Ja am PIN kommen 5 Volt an und das Backlight glimmt wenn ich den Taster drücke.

Ich weis nicht warum, es funktioniert nachdem ich nen anderen 10kOhm Wiederstand eingesetzt habe.
Was mich irritiert das es mit der anderen Sketch funktioniert hat.

An der Verdrahtung hat sich nicht geändert und auch am Code nicht.
Vielleicht weil morgen Montag ist...

@postmaster-ino:
Also würdest du einmal den Text printen und danach nur die Werte ändern via

lcd.setCursor(x, y);
lcd.print(bmereadTemperature());

cwdosman:

/*

void backLightonoff() {
  unsigned long backlightMillis = millis();                          //setze backlightMillis auf die aktuelle Zeitt
  int lightbuttonState = digitalRead(lightbutton);                //lese den Taster ein

if (backlightMillis > backLightoff) {                                //ist backlightMillis größer als backLightoff?
    lcd.noBacklight();                                                      // Ja -> schalte Beleuchtung aus
    Serial.println(backlightMillis); //for debug
  }
  if (lightbuttonState == HIGH) {                                      //ist der Taster gedrückt?
    Serial.println(lightbuttonState); //for debug
    lcd.backlight(); //deactivated for debug                        //Ja -> schalte Beleuchtung AN
    backlightMillis = 0;                                                    //setze backlightMillis auf 0 (bringt Nichts)
  }
}

In jeder Runde prüfst Du, ob backlightMillis größer als backLightoff ist - Du willst aber eher, ob die vergangene Zeit seit dem ANschalten größer als die Einschaltzeit ist.
Wenn Button -> backlightMillis=millis(); und lcd.backlight();
Und die Abfrage, ob die Zeit vorbei ist, schriebst Du so, wie im Print-Bereich ... millis()-StartZeit>=backLightoff - Dann wird Da was draus.

MfG