//prova versione consolidata al 03/02/2025 
//librerie per ina219
#include <Wire.h>
#include <Adafruit_INA219.h>
//librerie monitor 
#include <TFT.h> 
#include <SPI.h>
//definizione pin monitor 
#define cs 5
#define dc 6
#define rst 8
//definizione encoder giri motore 
#define encoder 2
//creazione istanza monitor
TFT Screen = TFT(cs, dc, rst);
//creazione istanza sensore ina219 
Adafruit_INA219 ina219;
//dichiarazione variabili encoder giri
unsigned long rpm; // giri motore
volatile byte pulses; // impulsi volano
unsigned long TIME; // tempo 
unsigned int pulse_per_turn = 20; // nr fori sul volano 
//assegnazione pin al gate del mosfet
int pinMosfet = 9; //dichiarazione pin gate mosfet
//dichiarazione variabili ina219
unsigned long tempoPrecedente = 0;
const unsigned long intervallo = 100; // Intervallo di aggiornamento in millisecondi 
float tensioneShunt = 0;
float tensioneBus = 0;
float corrente_mA = 0;
float tensioneCarico = 0;
float potenza_mW = 0;

void count() {
  pulses++; 
 } 
void giri(){ 
  byte impulso;
  detachInterrupt(digitalPinToInterrupt(encoder));
  impulso = pulses;
  pulses = 0;
  attachInterrupt(digitalPinToInterrupt(encoder), count, FALLING); 
  rpm = (60*1000/pulse_per_turn) / (millis() - TIME) * impulso; 
  TIME = millis();
}
void leggiIna219(){
tensioneShunt = ina219.getShuntVoltage_mV(); 
tensioneBus = ina219.getBusVoltage_V();
corrente_mA = ina219.getCurrent_mA();
potenza_mW = ina219.getPower_mW();
tensioneCarico = tensioneBus + (tensioneShunt / 1000);
}


void visuDati(){
  //creo la variabili stringa per convertire i valori floating da stampare al monitor
  char tenCar[5]; 
  char cor1[5]; 
  char pot1[5];
    
  //converto i valori float in stringhe e li salvo nelle variabili char create prima
  dtostrf(tensioneCarico, 5, 2, tenCar); 
  dtostrf(corrente_mA, 5, 2, cor1); 
  dtostrf(potenza_mW, 5, 2, pot1);
  Screen.background(0, 0, 0); 
  Screen.stroke(255, 255, 255); 
  Screen.setTextSize(1); 
  Screen.text("giri motore", 10, 64); 
  Screen.text(rpm, 70 , 64); 
  Screen.text("V:", 10, 54 ); 
  Screen.text(tenCar, 40, 54); 
  Screen.text("mA:", 10, 44); 
  Screen.text(cor1, 40, 44); 
  Screen.text("Potenza:", 10, 34); 
  Screen.text(pot1, 60, 34);
}
void setup() {
TCCR1B = TCCR1B & 0b11111000 | 0x02; //imposto la freq PWM del pin 9 a 9600 hz
rpm=0; 
pulses=0; 
TIME=0;
Serial.begin(9600);
Wire.begin(); //libreria wire mai inizializzata negli sketch precedenti 03022025
pinMode(encoder, INPUT); 
pinMode(pinMosfet, OUTPUT);
Screen.begin();
  if (! ina219.begin()) {
    Serial.println("Failed to find INA219 chip"); 
    while (1) {
      delay(10);
    } 
  }
Screen.background(0, 0, 0); 
Screen.stroke(255, 255, 255); 
Screen.setTextSize(1);
Screen.text("Avvio test motore", 40, 64); 
delay(1000);
Screen.begin(); 
Screen.background(255, 255, 255);
attachInterrupt(digitalPinToInterrupt(encoder), count, FALLING);
}

void loop() {
  while(tensioneCarico <= 7){ //al raggiungimento dei 7 volts deve uscire dal loop
  for(int x = 0; x<=255; x++){ 
    analogWrite(pinMosfet, x); 
    if (millis() - TIME >= 100){


      giri();
      leggiIna219();
      visuDati();
      Serial.print("RPM"); 
      Serial.println(rpm); 
      Serial.print("tensione carico");
      Serial.println(tensioneCarico); 
      Serial.print("amperaggio"); 
      Serial.println(corrente_mA); 
      Serial.print(("potenza")); 
      Serial.println(potenza_mW);
      
    } 
    
    delay(300);
  } 
  }
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5