Hallo liebes Forum,
Dies ist mein erster Post hier und ich weis nicht ob ich hier richtig gelandet bin.
Ich bin gerade daran mir einen Tacho zu bauen, der aus einem PWM Signal die Geschwindigkeit errechnet und auf einem TFT Display anzeigt.
Jetzt möchte ich ähnlich wie beim Auto einen Zähler der gesamten Strecke haben, der auch im
Auszustand gespeichert wird, und einen, der bei jedem aus und wieder an von null beginnt.
Meine vorhandenen Variablen sind die Geschwindigkeit und die Zeit, für die ich die millis(); Funktion des Microcontrollers benutzen würde.
Als Speichermöglichkeit habe ich einen SDKartenslot am Display, den ich gerne Benutzen würde.
Da mein Code aber noch sehr Träge auf mich wirkt und ich nicht so ganz mit der Strukturierung klarkomme, Suche ich hier Hilfe.
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#define pin1 3
unsigned long freqInPin1High,
freqInPin1Low,
calcValPin1High,
dutycycle,
tachval;
void setup() {
delay(100);
tft.initR(INITR_GREENTAB);//TFT Display initialisieren
tft.setRotation(1);
tft.fillScreen(ST77XX_BLACK);
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(90,0);
tft.setTextSize(2);
tft.println("Km/h");
pinMode(pin1, INPUT);
}
void loop() {
pwmread();
yield();
}
void pwmread(){
freqInPin1High = pulseInLong(pin1, HIGH, 150);
freqInPin1Low = pulseInLong(pin1, LOW, 150);
calcValPin1High = freqInPin1High * 100; //High sequenz des dutycycle mit 100 multiplizieren
dutycycle = calcValPin1High / (freqInPin1High + freqInPin1Low); //dutycycle in Prozent errechnen
if(dutycycle <= 100){ //nur einen Dutycycle unter 100% zulassen, da der pin auch dauerhaft HIGH, bzw. LOW sein kann
tachval = map(dutycycle, 0, 100, 35, 0);
}
int pinread1 = digitalRead(pin1);
if(freqInPin1High == 0 && freqInPin1Low == 0 && pinread1 == 1){
tachval = 0;
}
if(freqInPin1High == 0 && freqInPin1Low == 0 && pinread1 == 0){
tachval = 35;
}
lcdwrite();//Aufs TFT schreiben
}
void lcdwrite(){
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(0,0);
tft.setTextSize(7);
tft.print(tachval);
if(tachval < 10){//Leerstelle bei variablen unter 10, da sonst wenn nach 35 eine null geschrieben wird zB. 05 rauskommt
tft.print(" ");
}
delay(100);
}
Schonmal Vielen Dank im Voraus, Tom!