clema3
August 12, 2021, 9:18pm
1
Hallo,
ich habe das Grove Beginner Kit mit 0,96" OLED Display und einen DHT11 (Temperatur- und Luftfeuchtigkeitssensor).
Nun möchte ich, dass die Werte auf dem Display angezeigt werden aber nur ein Wert pro Seite. Um von einer Seite zur nächsten zu kommen habe ich noch einen Button.
Mein Problem: Die Messwerte aktualisieren sich ein Mal, wenn man auf die Seite geht aber dann nicht mehr.
Wie kann ich dafür sorgen, dass die Werte in regelmäßigem Abstand abgefragt und angezeigt werden?
Code:
#include "DHT.h"
#include <Arduino.h>
#include <U8x8lib.h>
#define DHTPIN 3 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(U8X8_PIN_NONE);
int Button = 6;
int menu = 0;
void setup(void)
{
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
u8x8.begin();
u8x8.setPowerSave(0);
u8x8.setFlipMode(1);
pinMode(Button, INPUT);
updateMenu();
}
void loop(void)
{
float AirPres, Light, Sound;
u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
if (!digitalRead(Button)){
menu++;
updateMenu();
delay(100);
while (!digitalRead(Button));
}
}
void updateMenu() {
switch (menu) {
case 0:
menu = 1;
break;
case 1:
int temp;
u8x8.clear();
u8x8.print("Lufttemp");
u8x8.setCursor(0, 33);
u8x8.print("Temp:");
temp = dht.readTemperature();
u8x8.print(temp);
u8x8.print("C");
// u8x8.refreshDisplay();
delay(50);
break;
case 2:
int humi;
u8x8.clear();
u8x8.print("Luftfeuchtigkeit");
u8x8.setCursor(0, 33);
u8x8.print("Feuchte:");
humi = dht.readHumidity();
u8x8.print(humi);
u8x8.print("%");
// u8x8.refreshDisplay();
delay(100);
break;
case 3:
menu = 0;
break; }}
Das hier:
if (!digitalRead(Button))
{
menu++;
updateMenu();
nicht auf das lesen der Taste beschränken, sondern umlaufend updateMenu() aufrufen.
Nur als Vorsichtsmassnahme: Damit allein ist es nicht getan.
uwefed
August 12, 2021, 10:37pm
3
Da Du wartest solange die Taste gedrückt ist updatest Du das Display nicht.
Du mußt nicht blockierend programmieren und die Messung und Darstellung regelmäßig aufrufen.
Grüße Uwe
clema3
August 13, 2021, 8:28am
4
Danke für die Tips soweit!
Ich bin noch komplett am lernen und weiß nicht so genau was "nicht blockierend" gemeint ist.
Ich denke mal, dass du meinst, dass ich in der if-Schleife nur die Aktion des Buttons habe und hier noch eine weitere Aktion (Sensorabfrage) einbringen muss.
Allerdings habe ich keine Idee, wie das geht.
Könnt ihr mir auf die Sprünge helfen?
Evtl. hilft das hier .
Gruß
Gregor
agmue
August 13, 2021, 9:15am
6
Um Dein Programm vernüftig darzustellen, solltest Du die in diesem Forum verfügbaren Code-Tags verwenden. Das hilft den Helfenden!
Hallo
Suche "arduino flanken zählen"
da findest Du
Hallo Leute,
Ich möchte am Digitaleingang meines arduino uno Impulse zählen. Die Impulse sollen in der Variable Puls mitgezählt bzw aufadiert werden.
Gibt es dafür brauchbare Programmbeispiele?
Danke im voraus
#3 macht genau das was Du benötigst um Deine Variable menu hoch zählen zu lassen
Heinz
agmue
August 13, 2021, 10:38am
8
Ein Vorschlag ohne Sensoren und mit meinem Display:
//#include "DHT.h"
//#include <Arduino.h>
#include <U8x8lib.h>
#define DHTPIN 3 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
//DHT dht(DHTPIN, DHTTYPE);
//U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(U8X8_PIN_NONE);
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);
const uint8_t tasterPin = 6;
uint8_t menu = 0;
boolean altTaster; // zum erkennen der Änderung
uint32_t jetzt;
void setup(void)
{
Serial.begin(9600);
Serial.println("DHTxx test!");
//dht.begin();
u8x8.begin();
u8x8.setPowerSave(0);
u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
u8x8.setFlipMode(1);
pinMode(tasterPin, INPUT_PULLUP);
}
void loop(void)
{
jetzt = millis();
static uint32_t vorhin;
const uint32_t intervall = 50;
boolean aktTaster = digitalRead(tasterPin);
if ( (jetzt - vorhin >= intervall) && (altTaster != aktTaster) ) {
altTaster = aktTaster;
vorhin = jetzt;
if ( !aktTaster ) {
if (++menu > 2) menu = 1;
u8x8.clear();
}
}
updateMenu();
}
void updateMenu() {
static uint32_t vorhin;
const uint32_t intervall = 200;
if (jetzt - vorhin >= intervall) {
vorhin = jetzt;
switch (menu) {
case 1:
int temp;
u8x8.setCursor(0, 0);
u8x8.print("Lufttemp");
u8x8.setCursor(0, 1);
u8x8.print("Temp: ");
temp = random(15, 25); //dht.readTemperature();
u8x8.print(temp);
u8x8.print("C");
break;
case 2:
int humi;
u8x8.setCursor(0, 0);
u8x8.print("Luftfeuchtigkeit");
u8x8.setCursor(0, 1);
u8x8.print("Feuchte: ");
humi = random(40, 50); //dht.readHumidity();
u8x8.print(humi);
u8x8.print("%");
break;
default:
menu = 1;
}
}
}
clema3
August 13, 2021, 6:07pm
9
Vielen Dank für den Code! Ich habe ihn nun etwas geändert und er läuft richtig gut
agmue
August 13, 2021, 6:09pm
10
Danke für die Rückmeldung!
system
Closed
December 11, 2021, 6:10pm
11
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.