Von einem Sensor erhalte ich einen Wert, z.b. 10. Der Sensor wird mit einem delay von 500ms gelesen. Wenn der nächste Wert größer als der aktuelle Wert ist, z.B. 11, soll eine Aktion ausgeführt werden, wenn der nächste Wert kleiner ist, eine andere. Leider habe ich dazu noch nichts im Forum gefunden. Nach welchen Begriffen muß ich suchen oder hat jemand dazu Erfahrung?
Gruß
Andreas
Ihr Beitrag wurde an seinen aktuellen Speicherort verschoben, da er besser geeignet ist.
if (last_measurement < current_measurement) action_1();
else action_2();
Was soll passieren wenn beide Werte gleich sind?
Du musst Dir den alten Wert merken, um mit diesem zu vergleichen.
Gruß Tommy
bei gleichen Werten soll keine Aktion erfolgen
ja, so etwas habe ich vermutet. Hast du auch einen Tip, wie ich das mache? Die Suchworte "store" und "remember" haben nicht weitergeführt. Ein Hinweis auf eine Arduino reference würde mir auch schon reichen.
Dank und Gruß
Andreas
Tut nichts wenn beide gleich sind.
Von einem Sensor erhalte ich einen Wert
Wie? Bitte deinen Code posten!
Achtung, da steht viel Müll drin und es funktioniert nicht
Ziel: Temperaturanzeige von einem Lötkolben (Kupferprügel zum Blechlöten) auf einem LCD 2x16 I2C anzeigen
Problem: sinkt die Temp von über 100°C auf 99, bleibt eine Stelle auf dem lcd stehen (OK, bei der Anwendung ist das kein wirklichen Problem, aber bei anderen Sensoren) und führt zu Ablesefehlern.
Lösung: Mein Wunsch ist nun, beim Wechsel der Stellenanzahl einen clearScreen zu machen.
/*
Lesen von 0-5V an Analogeingang mit Poti 10K
Ausgabe seriell und auf LCD 2x16
Problem:
AnalogRead schwank zwischen 0 und 1023.
Die letzten Ziffern bleiben stehen, wenn der Wert von 1000 auf 0 fällt
Schreibbeginn: (8, 1) nach rechts
Ziel:
Beim Wechsel der 10er-Stelle soll lcd gelöscht und neu beschrieben werden
Idee:
Schreibe aktuellen Wert auf A3, dieser wird gespeichert bis zum nächsten Durchlauf
Vergleiche mit A0
Wenn A3>1000 und A0<1000 clearscreen
*/
int analogPin = A3;
int val = 0;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte Degree[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
void setup() {
Serial.begin(9600);
pinMode((A3), OUTPUT);
lcd.begin();
lcd.backlight();
lcd.createChar(0, Degree);
}
void loop() {
int sensorValue1 = analogRead(A0);
/*
val = analogRead(A0); // read the input pin
analogWrite(A0, A3); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
*/
float voltage = analogRead(A0) * (5 / 1024.0);
// Convert the voltage into the temperature in degree Celsius:
float temperature = voltage / 10;
// Print the temperature on the LCD;
lcd.setCursor(0, 0);
lcd.print("Temp");
lcd.setCursor(8, 0);
lcd.print(temperature);
lcd.setCursor(13, 0);
lcd.write(0); // print the custom character
lcd.print("C");
lcd.setCursor (0, 1);
lcd.print("Poti");
lcd.setCursor(8, 1);
lcd.print(analogRead(A0));
lcd.setCursor(13, 1);
lcd.write(0); // print the custom character
lcd.print("C");
val = analogRead(analogPin); // read the input pin
analogWrite((A3), val / 4);
if (analogRead(A0) >= 1000)
{lcd.clear (); }
else if (analogRead(A0) < 100)
{lcd.clear (); }
Serial.print("\t");
Serial.print(analogRead(A0));
Serial.print("\t");
Serial.println(analogRead(A3));
// print a tab between values:
delay(500);
}
Kein ClearScreen, sondern den Wert so formatieren, dass er immer die gleiche Stellenzahl hat (unbenutzte Vorstellen mit Blank aufgefüllt.)
Dafür gibt es hier im Forum viele Beispiele. Einfach mal suchen.
Gruß Tommy
Immer nur das mit Leerzeichen Löschen was ich überschreiben will. Nicht das ganze Display löschen und neu schreiben.
Bei welchem Arduino ist A3 ein PWM Pin ?
Wenn du den Müll erstmal rausschmeißt, tust du nicht nur uns einen Gefallen.
Kannst den Müll ja in einer zip-Datei aufheben, für alle Fälle
Und statt der ganzer Byte Armee nimm
lcd.print((char)223); // ° Zeichen (°C )
lcd.print("C");
Und um Speicher zu sparen alles was statisch ist F Makro benutzen
lcd.print(F(char)223)); // ° Zeichen (°C )
lcd.print(F("C"));
lcd.print(F("Temp"));
usw.
Och!
Das Standard-Gradzeichen sieht einfach bescheiden aus; da lohnt sich das Definieren eigener Zeichen.
Das F-Makro „rentiert“ sich erst ab ein paar Zeichen.
Das stimmt auf jeden Fall!
Meinte ich aber nicht.
Sondern:
In file included from E:\Programme\arduino\portable\packages\arduino\hardware\avr\1.8.4\cores\arduino/Arduino.h:28,
from E:\temp\Arduino\sketch\sketch_dec20d.ino.cpp:1:
E:\Programme\arduino\portable\sketchbook\sketch_dec20d\sketch_dec20d.ino: In function 'void setup()':
sketch_dec20d:8:15: error: expected primary-expression before 'char'
8 | lcd.print(F(char)223));
| ^~~~
E:\Programme\arduino\portable\sketchbook\sketch_dec20d\sketch_dec20d.ino:8:13: note: in expansion of macro 'F'
8 | lcd.print(F(char)223));
| ^
sketch_dec20d:8:15: error: expected ')' before 'char'
8 | lcd.print(F(char)223));
| ^~~~
E:\Programme\arduino\portable\sketchbook\sketch_dec20d\sketch_dec20d.ino:8:13: note: in expansion of macro 'F'
8 | lcd.print(F(char)223));
| ^
E:\Programme\arduino\portable\packages\arduino\hardware\avr\1.8.4\cores\arduino/WString.h:38:74: note: to match this '('
38 | #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
| ^~~~
E:\Programme\arduino\portable\sketchbook\sketch_dec20d\sketch_dec20d.ino:8:13: note: in expansion of macro 'F'
8 | lcd.print(F(char)223));
| ^
sketch_dec20d:8:20: error: expected ')' before numeric constant
8 | lcd.print(F(char)223));
| ~ ^~~
sketch_dec20d:8:24: error: expected ';' before ')' token
8 | lcd.print(F(char)223));
| ^
| ;
Ich vermute ja, dass dieses lcd.print(F("\337"));
gemeint war
Denn: 223 == 0337
Ja, habe Fehler gemacht, ändern werde das nicht, Du hast ja meinen Fehler angezeigt und beschrieben.
Danke
Ist ja Geschmack sache.
Alles ok....
Fehler haben nur einen einzigen Daseinszweck!
Sie müssen gemacht werden.
Oft gibt es kein "Besser", ohne den Irrtum.
Danke soweit.
if (last_xyz < ....) bringt die Fehlermeldung: last_xyz was not declared in this scope
Hier bin ich bisher immer hängengeblieben.
(last_... ) oder (old_...) oder (current_...) scheint mein arduino uno nicht zu kennen
Ziel: zwischen der temp-Anzeige und °C soll immer eine Leerstelle sein, auch wenn der Wert von 99 auf 100 wechselt (Ich finde das optisch ansprechender)
Problem: beim Sprung von 100 auf 99 bleibt die "1" der 100 stehen. 50°C wird als 150°C angezeigt
Lösungsansatz: Lösche selektiv (8, 0) beim Wechsel von 100 auf 99.
Nur wie, wenn der Vergleich oldValue und currentValue nicht funktioniert?
/*
Ziel: Abbildung K-Type auf lcd
1 Blank zwischen Wert und °C auch bei Wechsel 99 zu 100
verwende F-Makro für Grad-Zeichen anstelle byte degree
*/
#include "max6675.h"
int thermoDO = 4; // so auf pin 4
int thermoCS = 5; // cs auf pin 5
int thermoCLK = 6; // sck auf pin 6
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
float Temp1 = 0;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
void setup() {
Serial.begin(9600);
lcd.begin();
lcd.backlight();
}
void loop() {
Temp1 = thermocouple.readCelsius();
lcd.setCursor(0, 0);
lcd.print("Temp ");
lcd.setCursor(14, 0);
lcd.print(F("\337")); //F-Makro für Grad-Zeichen
lcd.print("C");
if (Temp1 <= 99.75)
{
// lcd.setCursor(8, 0);
// lcd.print(" ");
lcd.setCursor(8, 0);
lcd.print(Temp1);
}
else if(Temp1 > 100.0)
{
// lcd.setCursor(7, 0);
// lcd.print(" ");
lcd.setCursor(7, 0);
lcd.print(Temp1);
}
if (currend_Temp1 >= 100.00) //Fehlermeldung: 'currend_Temp1' was not declared in this scope
else if (current_Temp1 < 100)
{ clear (8, 0)}
*/
delay(500);
}
void loop()
{
Temp1 = thermocouple.readCelsius();
lcd.setCursor(0, 0);
lcd.print("Temp:");
if (Temp1 < 10) lcd.print(" ");
if (Temp1 < 100) lcd.print(" ");
lcd.print(Temp1);
lcd.print(" ");
lcd.print("\337");
lcd.print("C");
delay(500);
}