#include "EEPROM.h"
#include "DigitalIn.h"
#include "DigitalOut.h"
#include "PinChangeInterrupt.h"
#define ANODO_COMUNE true
#define TOLLERANZA 40
float Frequenza = 0.0;
float canaleA = 0.0;
float canaleB = 0.0;
uint8_t Numero, OldNumero = 0;
uint8_t Parametro = 0;
bool Programmazione, FronteSalita, AbilitaMod;
uint8_t ValoreLuce = 125; // luminosità del display a circa il 50%
uint16_t Sogliafrequenza = 800;
uint16_t RitardoOff = 100;
// Definizione degli ingressi
const byte pinFrequenza = 5;
const byte pinTickA = A4;
const byte pinTickB = A5;
const byte Prog = 2;
const byte Zero = 3;
// Definizione delle uscite
const uint8_t OutLED1 = 9;
const uint8_t OutLED2 = 7;
const uint8_t OutDelay = 8;
const uint8_t Out7Segm = 6;
// Temporizzatori
unsigned long TempoStart;
unsigned long TempoProg;
unsigned long TempoBlink;
unsigned long TempoRitardo;
// Attesa inattivita di 3 secondi
#define ATTESA 2000
#define LAMPEGGIO 200
#define TEMPO_PROG 10000
#define TEMPO_SWITCH 1000
// Modifica questi valori per adattare alle tue reali esigenze
#define MaxFrequenza 10000
#define MaxRitardo 100
DigitalIn progButton(Prog, INPUT_PULLUP, 50);
DigitalIn zeroButton(Zero, INPUT_PULLUP, 50);
DigitalOut led1(Type::BLINK, OutLED1, LAMPEGGIO, LAMPEGGIO, false);
DigitalOut led2(Type::SR, OutLED2, 0, 0, false);
DigitalOut out1(Type::SR, OutDelay, 0, 0, false);
#include "7segment.h"
#include "frequency.h"
#include "programming.h"
void setup() {
Serial.begin(115200);
Serial.println("Compiled: " __DATE__ ", " __TIME__ ", " __VERSION__);
Serial.println(F("Start Programma Principale Versione 2.0"));
Serial.println("");
uint8_t eeCheck = 0x00;
EEPROM.get(0, eeCheck);
if (eeCheck != 0xFF) {
Serial.println(F("Carico valori da EEPROM"));
EEPROM.get(0, ValoreLuce);
EEPROM.get(2, Sogliafrequenza);
EEPROM.get(4, RitardoOff);
EEPROM.get(10, PosNum);
StampaParametri();
}
// Setup input/output
pinMode(Out7Segm, OUTPUT);
analogWrite(Out7Segm, ValoreLuce);
pinMode(pinTickA, INPUT_PULLUP);
pinMode(pinTickB, INPUT_PULLUP);
pinMode(pinFrequenza, INPUT_PULLUP);
for (int i = 0; i < sizeof(bcd_pinout); i++) {
pinMode(bcd_pinout[i], OUTPUT);
digitalWrite(bcd_pinout[i], LOW);
}
// Test del display 7 segmenti
for (int i = 0; i < 10; i++) {
displayNum(i);
delay(200);
}
delay(500);
displayNum(SPACE);
// attach the new PinChangeInterrupts and enable event functions below
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTickA), tickA, RISING);
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTickB), tickB, RISING);
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(pinFrequenza), tickC, RISING);
setupTimer1();
// Gestione pulsante programmazione
progButton.setLongClickTime(1000);
progButton.onReleased(AggiornaParametro);
}
void loop() { // Gestione dei due pulsanti
progButton.update();
if (progButton.longClick()) {
progLongClick();
}
if (!Programmazione) {
if (zeroButton)
Numero = 0;
else
Numero = TrovaPosizione(canaleA, canaleB);
if (Numero != OldNumero && Numero != SPACE) {
OldNumero = Numero;
displayNum(Numero);
}
// Frequenza > SogliaFrequenza e dell'uscita temporizzata
gestioneLed();
}
else {
mostraValoriProg();
}
}
void gestioneLed() {
static bool risingEdge;
if (Frequenza > Sogliafrequenza && Frequenza < MaxFrequenza ) {
led1.run(true);
led2 = !led1;
if (!risingEdge) {
out1.set();
risingEdge = true;
TempoRitardo = millis();
}
if(millis() - TempoRitardo >= RitardoOff) {
out1.reset();
}
}
else {
led1.reset();
led2.reset();
out1.reset();
risingEdge = false;
}
}