Finito ieri... pensavo fosse più difficile.
Oggi gitarella a Bologna... lunedì posto schemi, componenti.
Intanto il codice:
Codice: Seleziona tutto
#include <SoftwareSerial.h>
#include <Keypad.h>
SoftwareSerial Serial7Segment(2, 12); //RX pin, TX pin
// Costanti
const byte ROWS = 4; //4 righe
const byte COLS = 3; //3 colonne
//const byte ledPin = 13; //Pin a cui è collegato il LED
const byte buzPin = 9; //Pin a cui è collegato il Buzzer
const byte pedPin = 13; //Pin a cui è collegato il Pedale
const byte relPin = 10; //Pin a cui è collegato il Relé
//Variabili
int scroll = 300;
int ncifra = 0;
int tempo;
int appo_tempo;
long old_mil = 0;
long errlet = 0;
int buttonState = 0; // Stato del pedale
int lastButtonState = LOW; // Appoggio per lo stato precedente del pedale
boolean up = true;
boolean avviato = false;
boolean premuto = false;
char tempString[4]; //Appoggio per sprintf
char key;
char benvenuto[12] = {'A', 'N', 'A', 'L', 'O', 'G', 'I', 'C', 'A', '.', 'I', 'T'};
char keys[ROWS][COLS] = { //Mappatura keypad
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //pin a cui sono connessi gli output di riga del keypad
byte colPins[COLS] = {8, 7, 6}; //pin a cui sono connessi gli output di colonna del keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
Serial.begin(9600);
Serial.println(">>> Debug attivo <<<");
// pinMode(ledPin, OUTPUT); // led pin in Output
pinMode(buzPin, OUTPUT); // Buzzer pin in Output
pinMode(relPin, OUTPUT); // Relé pin in Output
pinMode(pedPin, INPUT); // Pedale pin in Input
// Setup 7SegmentDisplay
Serial7Segment.begin(9600); //Connessione con il display via Seriale a 9600 bps
Serial7Segment.write('v'); //Reset del display - si forza il cursore ad andare al primo carattere
Serial7Segment.write(0x7A); // Brightness control command
Serial7Segment.write((byte) 16); // dimmest value (must type-def 0)
Serial7Segment.write('A');
delay(scroll);
Serial7Segment.write('N');
delay(scroll);
Serial7Segment.write('A');
delay(scroll);
Serial7Segment.write('L');
delay(scroll);
Serial7Segment.write('N');
Serial7Segment.write('A');
Serial7Segment.write('L');
Serial7Segment.write('O');
delay(scroll);
Serial7Segment.write('A');
Serial7Segment.write('L');
Serial7Segment.write('O');
Serial7Segment.write('G');
delay(scroll);
Serial7Segment.write('L');
Serial7Segment.write('O');
Serial7Segment.write('G');
Serial7Segment.write('I');
delay(scroll);
Serial7Segment.write('O');
Serial7Segment.write('G');
Serial7Segment.write('I');
Serial7Segment.write('C');
delay(scroll);
Serial7Segment.write('G');
Serial7Segment.write('I');
Serial7Segment.write('C');
Serial7Segment.write('A');
Serial7Segment.write(0x77);
Serial7Segment.write(0b00001000);
delay(scroll);
Serial7Segment.write('I');
Serial7Segment.write('C');
Serial7Segment.write('A');
Serial7Segment.write(0x77);
Serial7Segment.write(0b00000100);
Serial7Segment.write('I');
delay(scroll);
Serial7Segment.write('C');
Serial7Segment.write('A');
Serial7Segment.write(0x77);
Serial7Segment.write(0b00000010);
Serial7Segment.write('I');
Serial7Segment.write('T');
delay(scroll);
delay(scroll);
delay(scroll);
Serial7Segment.write('A');
Serial7Segment.write(0x77);
Serial7Segment.write(0b00000001);
Serial7Segment.write('I');
Serial7Segment.write('T');
Serial7Segment.write(' ');
delay(scroll);
Serial7Segment.write(0x77);
Serial7Segment.write(0b01000000);
Serial7Segment.write('I');
Serial7Segment.write('T');
Serial7Segment.write(' ');
Serial7Segment.write(' ');
delay(scroll);
Serial7Segment.write('T');
Serial7Segment.write(' ');
Serial7Segment.write(' ');
Serial7Segment.write('0');
delay(scroll);
Serial7Segment.write(' ');
Serial7Segment.write(' ');
Serial7Segment.write('0');
Serial7Segment.write('0');
delay(scroll);
Serial7Segment.write(' ');
Serial7Segment.write('0');
Serial7Segment.write('0');
Serial7Segment.write('0');
delay(scroll);
reset();
delay(scroll);
delay(scroll);
say_up();
errlet = millis();
digitalWrite(relPin, LOW); // Spengo il Relé
}
void loop() {
if (millis() - errlet <= 100) {
} else {
buttonState = digitalRead(pedPin);
if (buttonState != lastButtonState) {
Serial.println("Cambio Stato");
if (buttonState == LOW) {
// Il pedale ha cambiato stato ed è stato rilasciato scateno l'inferno
Serial.println("Rilasciato");
premuto = true;
}
}
lastButtonState = buttonState;
errlet = millis();
}
if (avviato) {
if (premuto) {
//Spengi e pausa il timer
digitalWrite(relPin, LOW); // Spengo il Relé
premuto = false; // Mi preparo ad una nuova pressione
avviato = false; // Metto ad avviato lo stato
} else {
if (up) {
conta_up();
} else {
conta_down();
}
}
} else {
if (premuto) {
if (up) {
digitalWrite(relPin, HIGH); // Accende il Relé
premuto = false; // Mi preparo ad una nuova pressione
avviato = true; // Metto ad avviato lo stato
old_mil = millis(); // Azzero il parziale dei millisecondi
conta_up();
} else {
if (tempo > 0) {
digitalWrite(relPin, HIGH); // Accende il Relé
}
premuto = false; // Mi preparo ad una nuova pressione
avviato = true; // Metto ad avviato lo stato
old_mil = millis(); // Azzero il parziale dei millisecondi
conta_down();
}
} else {
// Leggi tastiera
gest_key();
}
}
}
void conta_down() {
if (tempo > 0) {
if (millis() - old_mil >= 100) {
old_mil = millis();
tempo = tempo - 1;
scrivi_tempo();
if (tempo == 0) {
digitalWrite(relPin, LOW); // Accende il Relé
avviato = false;
tempo = appo_tempo;
scrivi_tempo();
}
if (tempo%10 == 0) {
beep(200, 50);
}
}
}
}
void conta_up() {
if (millis() - old_mil >= 100) {
old_mil = millis();
tempo = tempo + 1;
scrivi_tempo();
if (tempo%10 == 0) {
beep(400, 50);
}
}
}
void say_up(){
Serial7Segment.write('v'); //Reset display
Serial7Segment.write('U');
Serial7Segment.write('p');
Serial7Segment.write(' ');
Serial7Segment.write(' ');
up = true;
beep(400, 200);
delay(1000);
reset();
}
void say_down(){
Serial7Segment.write('v');
Serial7Segment.write('D');
Serial7Segment.write('o');
Serial7Segment.write('u');
Serial7Segment.write('N');
up = false;
beep(200, 200);
delay(1000);
reset();
}
void reset() {
Serial7Segment.write('0');
Serial7Segment.write('0');
Serial7Segment.write('0');
Serial7Segment.write('0');
Serial7Segment.write(0x77);
Serial7Segment.write(0b00000100);
}
void beep(int nota, int durata){ //Funzione di beep devo tenere conto della durata???
tone(buzPin, nota, durata);
}
void gest_key() {
key = keypad.getKey();
if (key) {
switch (key){
case '#': //Cambio modalità da Count-Up a Count-Down
if (up){
say_down();
ncifra = 0;
tempo = 0;
} else {
say_up();
ncifra = 0;
tempo = 0;
}
break;
case '*': // Reset
reset();
ncifra = 0;
tempo = 0;
break;
default:
if (up){
say_up();
} else {
switch (ncifra) {
case 0:
tempo = tempo + (key-48);
ncifra++;
break;
case 1:
tempo = tempo * 10 + (key-48);
ncifra++;
break;
case 2:
tempo = tempo * 10 + (key-48);
ncifra++;
break;
case 3:
tempo = tempo * 10 + (key-48);
ncifra++;
break;
default:
// Non faccio nulla
break;
}
}
appo_tempo = tempo;
scrivi_tempo();
}
}
}
void scrivi_tempo() {
// Serial7Segment.write('v'); //Reset display
Serial7Segment.write(0x77); //Codice per invio funzioni specifiche
Serial7Segment.write(0b00000100); //Accendo la virgola per 1 cifra decimale
sprintf(tempString, "%04i", tempo); //Converte il tempo in una striga con gli zeri in testa
Serial7Segment.write(tempString); // Stampo il tempo
}