 
/*    ///RAVE CONTROL///
// |************************************************************************************;
* Project           : Comando aggiuntivo per regolare la RAVE Aprilia RS 125 <=2006
*
* 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     20200524
*
|****************************************************************************************;
*/
#include <FreqMeasure.h>
#include <LiquidCrystal.h>

#ifdef __AVR__
  #include <avr/power.h>
#endif
#define CONTROL_PIN 9  // Uscita rave
#define PMS_PIN 8 // Segnale d'ingresso di velocità del motore Rapporto frequenza/giri al min: 100Hz/1000rpm; Pickup: 16.666 Hz/1000rpm
#define LED_PIN 13 // Led che mostra l'apertura della valvola
#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;

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

 Serial.begin(9600); // non serve
 lcd.begin(16, 2);
 FreqMeasure.begin();
 
}


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) {          // il conteggio normale è 30 quanto più piccolo è quanto più veloce è la risposta
      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("GIRI/M: ");
lcd.print(rpm);   // Mostra la velocità di rotazione sul display
lcd.setCursor(0, 1);
lcd.print("RAVE: ");
lcd.print(set); // mostra la velocità di apertura impostata sul display
      data_available = millis();
      sum = 0;
      count = 0;
     
      
    
    if (rpm <= set){ // Al di sotto di questo valore la valvola rimane chiusa
        digitalWrite(LED_PIN,LOW);
        tone (CONTROL_PIN, 500); 
      
      }
    if (rpm >= set){ // Al di sopra di questo valore la valvola si apre
        digitalWrite(LED_PIN,HIGH);
        tone (CONTROL_PIN, 1000); 
        
        
      }
   
   }

 
  }
   data_unavailable = millis(); // Sistema che riporta tutto a 0 in caso di dati non rilevati

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

    
     
  }

}

