#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <JC_Button.h>
#include "Counter.h"
// Crea istanza lcd.
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define PIN_START_SWITCH 4
#define PIN_AVANTI_SWITCH 2
#define PIN_INDIETRO_SWITCH 3
#define PIN_REDLED 8
#define PIN_GREENLED 9
#define TIME_LONG_PRESS 250
uint16_t timeLongPress = TIME_LONG_PRESS;
byte posizioneMotore = 10; // minimo valore
char lcdBuffer[4];
Button btnUp(PIN_AVANTI_SWITCH, 10);
Button btnDown(PIN_INDIETRO_SWITCH, 10);
Button btnStart(PIN_START_SWITCH, 10);
Counter<byte> genCounter(posizioneMotore, 10, 100, 1);
void printMotorPos() {
sprintf(lcdBuffer, "%3u", posizioneMotore);
lcd.setCursor(0, 0);
lcd.print(lcdBuffer);
}
void incMotorPos() {
posizioneMotore++;
if (posizioneMotore > 100)
posizioneMotore = 10;
}
void decMotorPos() {
posizioneMotore--;
if (posizioneMotore < 10)
posizioneMotore = 100;
}
void testClassCounter() {
genCounter.setCounterRing(true);
Serial.println(genCounter.getVal());
genCounter.incr();
Serial.println(genCounter.getVal());
genCounter.decr();
genCounter.decr();
Serial.println(genCounter.getVal());
}
void setup() {
lcd.init(); //inizializzazione dell'LCD
lcd.backlight(); //attivazione della retroilluminazione
Serial.begin(9600);
testClassCounter();
// Set pin come INPUT con PULL-UP
//pinMode(PIN_START_SWITCH, INPUT_PULLUP);
//pinMode(PIN_AVANTI_SWITCH, INPUT_PULLUP);
//pinMode(PIN_INDIETRO_SWITCH, INPUT_PULLUP);
btnUp.begin();
btnDown.begin();
btnStart.begin();
// Set pin come OUTPUT
pinMode(PIN_REDLED, OUTPUT);
pinMode(PIN_GREENLED, OUTPUT);
//digitalWrite(PIN_REDLED, HIGH);
//digitalWrite(PIN_GREENLED, HIGH);
printMotorPos();
}
void testPulsantiLed() {
// test dei pulsanti e dei led
digitalWrite(PIN_REDLED, !digitalRead(PIN_START_SWITCH));
digitalWrite(PIN_GREENLED, !digitalRead(PIN_AVANTI_SWITCH));
digitalWrite(PIN_GREENLED, !digitalRead(PIN_INDIETRO_SWITCH));
}
void loop() {
//testPulsantiLed();
btnUp.read();
btnDown.read();
if (btnUp.wasPressed()) {
incMotorPos();
printMotorPos();
} else if (btnDown.wasPressed()) {
decMotorPos();
printMotorPos();
} else if (btnUp.pressedFor(TIME_LONG_PRESS + timeLongPress)) {
//if (timeLongPress > 200)
// timeLongPress -= 10;
incMotorPos();
printMotorPos();
} else if (btnDown.pressedFor(TIME_LONG_PRESS + timeLongPress)) {
//if (timeLongPress > 200)
// timeLongPress -= 10;
decMotorPos();
printMotorPos();
} else if (btnUp.wasReleased() && btnDown.wasReleased()) {
timeLongPress = TIME_LONG_PRESS;
}
#if (0) // codice disabilitato non compilato
byte stato = 0;
if (digitalRead(5) == HIGH) {
(rossoa, HIGH);
delay(100);// Attendo che sollevi il dito dal pulsante
stato = 1;
}
if (digitalRead(avanti) == HIGH) {
posizione++;
delay(100);// Attendo che sollevi il dito dal pulsante
stato = 1;
}
else if (digitalRead(indietro) == HIGH) {
posizione--;
delay(100);// Attendo che sollevi il dito dal pulsante
stato = 1;
}
//Limitazione valori
if (posizione > 100) posizione = 10; //premendo avanti, superando valore 100 torna a zero
if (posizione < 10) posizione = 100; // premendo indietro, arrivato a valore zero, torna a 100
if (stato) {
lcd.clear(); //pulisce lo schermo
lcd.setCursor(0, 0); //definisce la posizione sul display
lcd.print ("POSIZIONE"); //stampa il testo
lcd.setCursor(12, 0); //definisce la posizione sul display
lcd.print(posizione); //visualizza il valore della variabile
stato = 0;
delay (20);
bool CONDIZIONE = true; // CONDIZIONE è il nome attribuito allo stato vero o falso definito dalla funzione booleana dipendente dallo stato HIGH o LOW del PULSANTE
while (CONDIZIONE) {
if (digitalRead(Pulsante) == HIGH) // CONDIZIONE è utilizzabile per bloccare o far ripartire lo svolgimento del programma
CONDIZIONE = false;
}
// funzionerebbe bene se non fosse per il fatto che ogni volta che si corregge la misura esegue un'intero ciclo di lampeggi
// usando la funzione bool mi ferma anche il display e spostando in fondo la funzione booleana non si attiva più il led
for (int i = 0; i < posizione / 1 ; i++ ) {// abbina il valore scritto sul display al numero lampeggi(solo numeri decimali)
for (int v = 0; v <= 255; v += 80) {
analogWrite(verde, v); //assegna la funzione analogica, ed il tempo dell'accensione
delay(20);
}
for (int v = 255; v >= 0; v -= 20) {
analogWrite(verde, v); //assegna la funzione analogica ed il tempo dello spegnimento
delay(2);
}
}
}
#endif
}