//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