Es geht weiter...
Hier der Softwarecode (Edit 23.04.2020: die Helligkeit der Signalleuchten wurde erhöht für bessere Sichtbarkeit bei Sonnenlicht):
* Nach ausgiebigen Probieren, kann der Code (im Anhang dieses Posts) von 4PR1L14 absolut empfohlen werden
* bei Problemen mit Ungenauigkeiten bzw. springenden unzuverlässigen Warnstufen kann eine Entstörung der Zündanlage helfen:
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define NUMPIXELS 8
#include <FreqMeasure.h>
#define PIN 11 // Neopixel PIN
#define PMS_PIN 8 // Drehzahlsignal eingang bei Rotax 122 Lima: 100Hz/1000rpm; Pickup: 16.666 Hz/1000rpm
#define LED_PIN 13 // Warnleuchte "Schalten"
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
unsigned long data_unavailable = 0;
unsigned long data_available = 0;
const long interval = 1000;
void setup() {
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
pixels.begin(); // Initialisiere NEOPIXEL.
pinMode (PMS_PIN, INPUT_PULLUP); // Pullup muss hier stehen
pinMode (LED_PIN, OUTPUT);
Serial.begin(9600); // braucht man nicht
FreqMeasure.begin();
}
double sum=0;
int count=0;
void loop() {
if (FreqMeasure.available()) {
sum = sum + FreqMeasure.read();
count = count + 1;
if (count > 10) {
float frequency = FreqMeasure.countToFrequency(sum / count);
Serial.print("Rpm=");
Serial.println(frequency*60);
data_available = millis();
sum = 0;
count = 0;
if (frequency <= 155){
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.setPixelColor(1, pixels.Color(0,0,0));
pixels.setPixelColor(2, pixels.Color(0,0,0));
pixels.setPixelColor(3, pixels.Color(0,0,0));
pixels.setPixelColor(4, pixels.Color(0,0,0));
pixels.setPixelColor(5, pixels.Color(0,0,0));
pixels.setPixelColor(6, pixels.Color(0,0,0));
pixels.setPixelColor(7, pixels.Color(0,0,0));
pixels.show();
}
if (frequency >= 155){
pixels.setPixelColor(0, pixels.Color(0,0,0)); // 1.Pixelnummer 2.rot(zahl=helligkeit) 3.grün (zahl=helligkeit) 4.blau (zahl=Helligkeit)
pixels.setPixelColor(1, pixels.Color(0,0,0));
pixels.setPixelColor(2, pixels.Color(0,0,0));
pixels.setPixelColor(3, pixels.Color(0,100,0));
pixels.setPixelColor(4, pixels.Color(0,100,0));
pixels.setPixelColor(5, pixels.Color(0,0,0));
pixels.setPixelColor(6, pixels.Color(0,0,0));
pixels.setPixelColor(7, pixels.Color(0,0,0));
pixels.show();
}
if (frequency >= 165){
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.setPixelColor(1, pixels.Color(0,0,0));
pixels.setPixelColor(2, pixels.Color(50,50,0));
pixels.setPixelColor(3, pixels.Color(50,50,0));
pixels.setPixelColor(4, pixels.Color(50,50,0));
pixels.setPixelColor(5, pixels.Color(50,50,0));
pixels.setPixelColor(6, pixels.Color(0,0,0));
pixels.setPixelColor(7, pixels.Color(0,0,0));
pixels.show();
}
if (frequency >= 175){
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.setPixelColor(1, pixels.Color(100,50,0));
pixels.setPixelColor(2, pixels.Color(100,50,0));
pixels.setPixelColor(3, pixels.Color(100,50,0));
pixels.setPixelColor(4, pixels.Color(100,50,0));
pixels.setPixelColor(5, pixels.Color(100,50,0));
pixels.setPixelColor(6, pixels.Color(100,50,0));
pixels.setPixelColor(7, pixels.Color(0,0,0));
pixels.show();
}
if (frequency >= 185){ // ab/ueber diesem Wert geht das Schaltlicht an
digitalWrite (LED_PIN,HIGH);
pixels.setPixelColor(0, pixels.Color(150,0,0));
pixels.setPixelColor(1, pixels.Color(150,0,0));
pixels.setPixelColor(2, pixels.Color(150,0,0));
pixels.setPixelColor(3, pixels.Color(150,0,0));
pixels.setPixelColor(4, pixels.Color(150,0,0));
pixels.setPixelColor(5, pixels.Color(150,0,0));
pixels.setPixelColor(6, pixels.Color(150,0,0));
pixels.setPixelColor(7, pixels.Color(150,0,0));
pixels.show();
delay (15) ;
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.setPixelColor(1, pixels.Color(0,0,0));
pixels.setPixelColor(2, pixels.Color(0,0,0));
pixels.setPixelColor(3, pixels.Color(0,0,0));
pixels.setPixelColor(4, pixels.Color(0,0,0));
pixels.setPixelColor(5, pixels.Color(0,0,0));
pixels.setPixelColor(6, pixels.Color(0,0,0));
pixels.setPixelColor(7, pixels.Color(0,0,0));
pixels.show();
delay (15) ;
pixels.setPixelColor(0, pixels.Color(150,0,0));
pixels.setPixelColor(1, pixels.Color(150,0,0));
pixels.setPixelColor(2, pixels.Color(150,0,0));
pixels.setPixelColor(3, pixels.Color(150,0,0));
pixels.setPixelColor(4, pixels.Color(150,0,0));
pixels.setPixelColor(5, pixels.Color(150,0,0));
pixels.setPixelColor(6, pixels.Color(150,0,0));
pixels.setPixelColor(7, pixels.Color(150,0,0));
pixels.show();
}
if (frequency < 184){ // unter diesem Wert geht das Schaltlicht aus
digitalWrite(LED_PIN,LOW);
}
}
}
data_unavailable = millis(); // logik um bei signalausfall alles auf 0 zu setzen
if (data_unavailable - data_available >= interval){
Serial.print ("Rpm=");
Serial.println("0");
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.setPixelColor(1, pixels.Color(0,0,0));
pixels.setPixelColor(2, pixels.Color(0,0,0));
pixels.setPixelColor(3, pixels.Color(0,0,0));
pixels.setPixelColor(4, pixels.Color(0,0,0));
pixels.setPixelColor(5, pixels.Color(0,0,0));
pixels.setPixelColor(6, pixels.Color(0,0,0));
pixels.setPixelColor(7, pixels.Color(0,0,0));
pixels.show();
}
}
Alles anzeigen