Die kommt immer wieder ( so schnell wie möglich ) dran, und sollte meistens feststellen, dass nichts zu tun ist und sich beenden. Kommt dann natürlich sofort wieder dran, aber das ist ja der Sinn der Sache.
Wenn sich selten mal ein Zustand ändert, wird das LCD beschrieben und fertig.
Schleifen innerhalb von loop sind in aller Regel falsch.
Sinnvoll wäre es, mit dem Poti zuerst eine Mittelwertbildung durchzuführen, um ggf. falsche Werte auszufiltern. Falls es derzeit passt, liegt das nur daran, dass die Werte so schnell wieder überschrieben werden.
Hab das ganze jetzt mal praktisch getestet. Die Gänge laufen aber immer durch. Das Display zeigt völlig wirre Zahlenfolgen an obwohl ich per "serialmonitor" für alle Gänge die Werte bestimmt habe und auch wie man sieht Toleranzen eingebaut habe.
if (valoreSensore >= 807 && valoreSensore <= 813) state = 1; // R
if (valoreSensore >= 820 && valoreSensore <= 826) state = 2; // N
Was passiert bei valoreSensore == 817?
Ich würde valoreSensore am Anfang erstmal auf einen Defaultwert setzen, und dann, falls ein gültiger Wert kommt, den Wert ändern:
valoreSensore = 99; // defaultwert.
if (valoreSensore <= 700) state = 0; // Kein Signal
if (valoreSensore >= 807 && valoreSensore <= 813) state = 1; // R
if (valoreSensore >= 820 && valoreSensore <= 826) state = 2; // N
...
Und zum Ende deiner switch case Anweisung diesen Zustand abfangen:
default:
// fa niente
zum Durchlaufen:
lass dir doch mal alle gelesenen Werte anzeigen:
@ guntherb: Ich habe einen 10kOhm in Reihe und 22µF + 100nF Parallel auf GND am Eingang.
Wieso bleibt nach dem Einschalten jetzt das Display immer am letzten "tft.fillScreen(RED);" aus dem loop hängen wenn kein Sensor angeschlossen ist?
Sollte da nicht "state 0" ausgeführt werden?
Ich habe eure Ratschläge befolgt und nun sieht der code so aus:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
const int sensorGetriebe = A5; // Sonsor-PIN
int sensorWert = 0; // Sensor inizialisieren
byte state = 0; // Zustände
int lastState = 0;
void drawpete(void) {
tft.fillScreen(RED);
tft.setCursor(20, 100);
tft.setTextColor(WHITE); tft.setTextSize(1);
tft.println("Sviluppato da:");
tft.setCursor(20, 120);
tft.println("Pietro Manzella");
tft.setCursor(20, 200);
tft.setTextColor(WHITE); tft.setTextSize(2);
tft.println("per");
tft.setCursor(20, 220);
tft.println("ELABORAZIONI");
tft.setCursor(20, 240);
tft.setTextColor(WHITE); tft.setTextSize(3);
tft.println("LA MANNA");
}
void problem(void) {
tft.fillScreen(RED);
tft.setCursor(38, 150);
tft.setTextColor(WHITE); tft.setTextSize(4);
tft.println("ASSENZA");
tft.setCursor(38, 200);
tft.println("SEGNALE");
}
void drawChar(char c)
{
tft.fillScreen(WHITE);
tft.setCursor(20, 20);
tft.setTextColor(RED);
tft.setTextSize(40);
tft.print(c);
}
void setup(void) {
tft.reset();
tft.begin(0x9341);
tft.setRotation(0);
tft.fillScreen(RED);
drawpete();
delay(2000);
tft.fillScreen(RED);
}
void loop() {
// liest den Sensor
long sensorSumme=0;
#define SAMPLES 200
for (int i=0; i<SAMPLES; i++) // Signal mehrmals messen, ca. 20 Millisekunden lang
{
sensorSumme+=analogRead(sensorGetriebe);
}
int sensorWert = sensorSumme/SAMPLES; // Mittelwert bilden
if(sensorWert <= 806) state = 0; // Kein brauchbares Signal
if(sensorWert >= 807 && sensorWert <= 819) state = 1; // R
if(sensorWert >= 820 && sensorWert <= 832) state = 2; // N
if(sensorWert >= 833 && sensorWert <= 845) state = 3; // 1
if(sensorWert >= 846 && sensorWert <= 857) state = 4; // 2
if(sensorWert >= 858 && sensorWert <= 870) state = 5; // 3
if(sensorWert >= 871 && sensorWert <= 883) state = 6; // 4
if(sensorWert >= 884 && sensorWert <= 895) state = 7; // 5
if(sensorWert >= 896 && sensorWert <= 902) state = 8; // 6
if(sensorWert >= 903) state = 0; // Kein brauchbares Signal
if(lastState != state) {
lastState = state;
switch (state)
{
case 0: // Kein Signal
problem();
break;
case 1: // R
drawChar('R');
break;
case 2: // N
drawChar('N');
break;
case 3: // 1. Gang
drawChar('1');
break;
case 4: // 2. Gang
drawChar('2');
break;
case 5: // 3. Gang
drawChar('3');
break;
case 6: // 4. Gang
drawChar('4');
break;
case 7: // 5. Gang
drawChar('5');
break;
case 8: // 6. Gang
drawChar('6');
break;
default:
problem();
}
}
}
gregorss:
Ich nehme an, dass Du damit nicht meinen Tippfehler meinst, sondern dass wir „in aller Regel falsch“ unterschiedlich interpretieren.
Oder bist Du allen Ernstes der Meinung, dass man z. B. ein kleines Lauflicht ohne Schleife in loop() realisieren sollte?!
Ja, ich denke, dass Schleifen in loop() "unanständig" sind.
Ja, eine einzige lang laufende Schleife ist nötig!
Und die steckt in main() und ruft loop() auf.
Das reicht an langlaufenden Schleifen.
Spätestens wenn man einen WDT einsetzt ist sowieso Schluss damit!
Kurze, begrenzte, Schleifen, sind nicht das Problem.....
combie:
Ja, ich denke, dass Schleifen in loop() "unanständig" sind.
Ja, eine einzige lang laufende Schleife ist nötig!
Und die steckt in main() und ruft loop() auf.
Das reicht an langlaufenden Schleifen.
Spätestens wenn man einen WDT einsetzt ist sowieso Schluss damit!
Kurze, begrenzte, Schleifen, sind nicht das Problem.....
Dem kann ich problemlos zustimmen. Nur weiß ich nicht, was Du mit WDT meinst. Etwas Unanständiges wird’s nicht sein