Hallo, ich habe ein Projekt, bei dem ein Oled Display, eine RTC und ein Temperatur-Sensor per i2c an einem Arduino Nano angeschlossen sind. Außerdem misst der µC mit einem Voltage-Divider mit 2 Widerständen eine Spannung. Ich möchte das ich mit einem Knopf, der an Pin 10 hängt, eine Art Menü durchgeschalten werden kann. Dazu benutze ich die switch case Funktion. Bei allen Menüeinträgen soll eine Schleife den Code im jeweiligen Menü wiederholen. Das heißt, wenn ich zum Beispiel auf Seite 1 bin, soll sich die Uhrzeit jede Sekunde aktualisieren und so angezeigt werden: 10:11 -> nach einer Sekunde 10 11. Sobald der Knopf gedrückt wird, soll auf Seite 2 geschalten werden, wo das Datum angezeigt werden soll. Das funktioniert so semi, weil nach ein Paar Sekunden sich der µC komplett aufhängt und auf dem Oled komische Sachen in der rechten unteren Ecke angezeigt werden. Ich hab schon nach einer Lösung gesucht und ich habe gelesen, das es an der while Schleife liegen kann.
Wie kann ich meinen Code optimieren und den µC vom Aufhängen bewahren. Ausserdem wird der Luftdruck garnicht angezeigt (wird auch mit dem Temp Sensor gemessen).
Schonmal vielen dank für euer bemühen!!!
Code:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#include <RTClib.h>
// RTC
RTC_DS1307 rtc;
//
// Oled
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET); // initialize Adafruit OLED display library
const int next_button = 10; // Menü Knopf
int menu = 1;
//
//Temp Sensor
#define BMP280_I2C_ADDRESS 0x76
Adafruit_BMP280 bmp280; // initialize Adafruit BMP280 library
//
// VoltMeter
int VoltIn_a = 0; //Analog Input
float Vout_a = 0.0; //Voltage In after voltage divider
float V_a = 0.0; //Actual voltage after calculation
float R1 = 100000.0; //R1 100K
float R2 = 10000.0; //R2 10K
//Timing
unsigned long previousMillis = 0;
const long interval = 200; //Interval to read voltages
//
void setup() {
pinMode(next_button, INPUT_PULLUP);
pinMode(A0, INPUT);
pinMode(A1, INPUT); // VoltMeter Pin
Wire.begin();
// initialize the SSD1306 OLED display with I2C address = 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// clear the display buffer.
display.clearDisplay();
updateMenu();
display.display();
// initialize the BMP280 sensor
if ( bmp280.begin(BMP280_I2C_ADDRESS) == 0x76 )
{ // connection error or device address wrong!
display.setTextSize(1);
display.setCursor(5, 17);
display.print("Connection");
display.setCursor(35, 37);
display.print("Error");
display.display(); // update the display
while (1); // stay here
}
}
char _buffer[9]; // OLED TEMP
void loop() {
if (!digitalRead(next_button)) {
if (menu >= 6) { // Wenn Seite 6 erreicht wurde
menu = 0; // Gehe zurück zu Seite 1
}
menu++;
updateMenu();
delay(100);
while (!digitalRead(next_button));
}
}
void updateMenu() {
DateTime now = rtc.now();
char buf1[] = "hh:mm";
char buf12[] = "hh mm";
char buf2[] = "DD.MM";
char buf3[] = "DDD MMM";
switch (menu) {
case 0:
menu = 1;
break;
case 1: // Uhrzeit
while ( menu = 1) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0); // (x, y)
display.print("Uhrzeit");
display.setTextSize(3);
display.setCursor(0, 10); // (x, y)
display.print(now.toString(buf1));
display.display();
if (!digitalRead(next_button)) {
menu++;
updateMenu();
}
delay(1000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0); // (x, y)
display.print("Uhrzeit");
display.setTextSize(3);
display.setCursor(0, 10); // (x, y)
display.print(now.toString(buf12));
display.display();
if (!digitalRead(next_button)) {
menu++;
updateMenu();
}
delay(1000);
updateMenu();
break;
}
break;
case 2: // Datum
while ( menu = 2) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0); // (x, y)
display.print("Datum");
display.setTextSize(3);
display.setCursor(0, 10); // (x, y)
display.print(now.toString(buf2));
display.display();
break;
}
break;
case 3: // Datum 2
while ( menu = 3) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0); // (x, y)
display.print("Datum");
display.setTextSize(3);
display.setCursor(0, 10); // (x, y)
display.print(now.toString(buf3));
display.display();
break;
}
break;
case 4: // Bordspannung
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0); // (x, y)
display.print("Bordspannung");
display.display();
display.setTextColor(WHITE, BLACK);
display.setTextSize(3);
display.setCursor(0, 10); // (x, y)
VoltIn_a = analogRead(A0); //Read analog values
Vout_a = (VoltIn_a * 5.0) / 1024.0; //Convert 10bit input to an actual voltage
V_a = Vout_a / (R2 / (R1 + R2)); //Using the voltage divider formula, work out the input voltage
display.print(V_a);
display.display();
if (!digitalRead(next_button)) {
menu++;
updateMenu();
}
delay(5000);
updateMenu();
break;
case 5: // AussenTemp
// float temp = bmp280.readTemperature(); // get temperature
// float pressure = bmp280.readPressure(); // get pressure
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0); // (x, y)
display.print("Aussen-Temperatur");
display.setCursor(0, 5); // (x, y)
display.setTextSize(2);
/* if (temp < 0)
sprintf(_buffer, "-%02u.%02u C", (int)abs(temp), (int)(abs(temp) * 100) % 100 );
else
sprintf(_buffer, " %02u.%02u C", (int)temp, (int)(temp * 100) % 100 );
display.print(_buffer);
display.drawCircle(78, 5, 2, WHITE); // ° Zeichen
display.display();
if (!digitalRead(next_button)) {
menu++;
updateMenu();
}
*/ delay(1000);
updateMenu();
break;
case 6: // Luftdruck
while ( menu = 6) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0); // (x, y)
display.print("Uhrzeit");
display.setTextSize(3);
display.setCursor(0, 10); // (x, y)
display.print(now.toString(buf1));
display.display();
if (!digitalRead(next_button)) {
menu++;
updateMenu();
}
delay(1000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0); // (x, y)
display.print("Uhrzeit");
display.setTextSize(3);
display.setCursor(0, 10); // (x, y)
display.print(now.toString(buf12));
display.display();
if (!digitalRead(next_button)) {
menu++;
updateMenu();
}
delay(1000);
updateMenu();
break;
}
break;
case 7:
menu = 1;
break;
}
}