/*    ///RAVE CONTROL///
// |**********************************************************************;
* Project           : Einstellbare Auslasssteuerung für die Aprilia RS 125 (V1, an RAVE7800, mit Display und Poti)
*
* Program name      : RAVE_Control.ino
*
* Author            : el bodo es loco
*
* Date created      : 20200524
*
* Modified by       :  
*
* Revision History  :
*
* Date modifiied    Vers.   Revision Date  
* 20200524          1.0     20220416         15.04.2022 mit Valvesmooth und Reinigungsfunktion bei Zündung an
*
|**********************************************************************;
*/
#include <FreqMeasure.h>
#include <LiquidCrystal.h>

#ifdef __AVR__
  #include <avr/power.h>
#endif
#define CONTROL_PIN 10  // Ausgang zur RAVE
#define PMS_PIN 8 // Drehzahlsignal eingang bei Rotax 122  Lima: 100Hz/1000rpm; Pickup: 16.666 Hz/1000rpm
#define LED_PIN 13 // Warnleuchte "RAVE_Aktiv"
#define PV_PIN 10
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

unsigned long data_unavailable = 0;
unsigned long data_available = 0;
const long interval = 1000;
int PIN_ADJUST = A1;
int set;
int Setpoint;
int valvesmooth = 100; // zur beruhigung des Schiebers, nicht unbedingt erforderlich

void setup() {
  #if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
  
  
  pinMode (PMS_PIN, INPUT_PULLUP); // Pullup muss hier stehen
  pinMode (LED_PIN, OUTPUT);
  pinMode (CONTROL_PIN, OUTPUT);
  pinMode (PV_PIN, OUTPUT);

 Serial.begin(9600); // braucht man nicht
 lcd.begin(16, 2);
       
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("2T Forum "); // Freitext, max. 16 Zeichen
 FreqMeasure.begin();
 tone (CONTROL_PIN, 1000);
 delay(1500);
 tone (CONTROL_PIN, 500);
 delay(700);
}


double sum=0;
int count=0;


void loop() {
 Setpoint = analogRead (PIN_ADJUST);
set = map(Setpoint, 0, 1024, 6000, 10500 );
  
  
  if (FreqMeasure.available()) {
                                   
    sum = sum + FreqMeasure.read();
    count = count + 1;
    if (count > 5) {          //normal Count ist 30 je kleiner des to schneller das ansprechverhalten
      float frequency = FreqMeasure.countToFrequency(sum / count);
      int rpm = frequency*60 ;
      
      Serial.print("Rpm=");
      Serial.println(rpm);
        Serial.print ("RAVE=");
    Serial.println(set);
      lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Drehzahl: ");
lcd.print(rpm);   //  zeigt die aktuelle Drehzahl auf dem Display
lcd.setCursor(0, 1);
lcd.print("RAVE: ");
lcd.print(set); // zeigt die eingestellte Öffnungsdrehzahl auf dem Display
      data_available = millis();
      sum = 0;
      count = 0;
     
      
    
    if (rpm <= set - valvesmooth){ // unter diesem Wert bleibt der Auslassschieber geschlossen
        digitalWrite(LED_PIN,LOW);
        tone (CONTROL_PIN, 500); 
      
      }
    if (rpm >= set){ // über diesem Wert öffnet der Auslassschieber
        digitalWrite(LED_PIN,HIGH);
        tone (CONTROL_PIN, 1000); 
        
        
      }
   
   }

 
  }
   data_unavailable = millis(); // logik um bei signalausfall alles auf 0 zu setzen

   if (data_unavailable - data_available >= interval){
   
  
    Serial.print ("Rpm=");
    Serial.println("0");
    Serial.print ("RAVE=");
    Serial.println(set);
    lcd.clear();
   
    lcd.setCursor(0, 0);
    lcd.print("Drehzahl: ");
    lcd.print(0);  
    lcd.setCursor(0, 1);
    lcd.print("RAVE: ");
    lcd.print(set);
    tone (CONTROL_PIN, 500);
    delay(50); 

    
     
  }

}