Un contatore di crediti (e non solo) per la nostra LaserCutter
Durante i nostri “FabCciamolo!” nascono sempre soluzioni per risolvere i piccoli problemi nella maniera più efficiente.
Durante questo incontro,l’ordine del giorno era progettare e costruire un contatore che tenesse traccia dei crediti spesi durante il taglio laser,il problema è che il conteggio tiene conto non solo del tempo in cui la macchina è accesa (troppo semplice no?) ma il tempo effettivo in cui il laser incide (Chiameremo questi due momenti “tempo morto” e “tempo vivo”).
Durante l’utilizzo quindi il conteggio dovrà essere accessibile all’operatore tramite un display.
Si è proposto di usare per gestire gli ingressi e le uscite un Arduino Nano.
Fortunatamente la nostra macchina ha un contatto esterno che si chiude quando il laser è in funzione,questo ci permette di configurare un ingresso per l’arduino.
Per le uscite useremo un display 2X16 con la libreria liquidcrystal.
Come feature aggiuntiva si è proposto di registrare la temperatura del liquido di raffreddamento,useremo un Dallas con la libreria wire.
Il codice
Guardando il codice ( allegato a questo articolo ) si distinguono due funzioni:”timer e slideshow). Iniziamo dalla funzione timer:
void timer() {
start_time = millis();
lcd.clear();
//QUANDO LO STATO PASSA DA 0 A 1 CHIAMO QUESTA FUNZIONE
while (rele) {lcd.setCursor(0, 0);//VAI ALLA RIGA/COLONNA 0
lcd.print("WARNING");
lcd.setCursor(0, 1);
lcd.print("TAGLIO IN CORSO");
rele = digitalRead(rele_pin);
}
lcd.clear();
stop_time = millis();
work_time = work_time + (stop_time - start_time);
}
Quello che fa sostanzialmente è contare per quanti millisecondi la macchina sta tagliando e sommarli al tempo di lavoro totale, questa funzione nel loop è chiamata ogni qual volta il contatto relativo all’attivazione del laser si chiude.
Passiamo a quella più interessante, la funzione slideshow:
void slideshow(int sel) {
char str[3];
/*
MOSTRARE:
1.TEMPO TOTALE
2.TEMPO MORTO
3.TEMPO EFFETTIVO
4.CREDITI
5.TEMPERATURA
*/
if (slide == sel)return;
lcd.clear();
switch (sel) {
case 48 :
lcd.setCursor(0, 0);//VAI ALLA RIGA/COLONNA 0
lcd.print("TEMPO TOTALE");
lcd.setCursor(0, 1);
sprintf(str, "%02d", (millis() / 1000) % 60);
lcd.print(millis() / 60000);
lcd.print(":");
lcd.print(str);
break;case 50 :
lcd.setCursor(0, 0);//VAI ALLA RIGA/COLONNA 0
lcd.print("TEMPO MORTO");
lcd.setCursor(0, 1);
//lcd.print(lazy_time/1000);
sprintf(str, "%02d", (lazy_time / 1000) % 60);
lcd.print(lazy_time / 60000);
lcd.print(":");
lcd.print(str);
break;case 52 :
lcd.setCursor(0, 0);//VAI ALLA RIGA/COLONNA 0
lcd.print("TEMPO EFFETTIVO");
lcd.setCursor(0, 1);
sprintf(str, "%02d", (work_time / 1000) % 60);
lcd.print(work_time / 60000);
lcd.print(":");
lcd.print(str);
break;
case 54 :
lcd.setCursor(0, 0);//VAI ALLA RIGA/COLONNA 0
lcd.print(" CREDITI");
lcd.setCursor(0, 1);
lcd.print(credits);
lcd.print(" E");
break;
case 56 :
lcd.setCursor(0, 0);//VAI ALLA RIGA/COLONNA 0
lcd.print("TEMPERATURA");
lcd.setCursor(0, 1);
lcd.print(temp);
lcd.print(" C");
break;
default :
break;
}
slide = sel;
}
La sfida era quella di mostrare in tempo reale l’avanzamento del tempo e dei crediti a schermo, si è proposto quindi di usare tante schermate che “scorrevano” regolarmente:
ad ogni schermata è stato assegnato un codice e la funzione mostra sull’LCD la schermata corrispondente al numero ricevuto come parametro con un semplice costrutto Switch-Case.
Nel loop si richiama la funzione a scorrimento (count_slide) che assegna ad ogni secondo un valore che verrà utilizzato come indice nella funzione slideshow:
int count_slide() {
String bong = (String)millis();
unsigned int lungo = bong.length();
char interesse = bong[lungo - 4];
int valore = (int)interesse;
return valore;
}
Quindi nel loop:
void loop() {
rele = digitalRead(rele_pin);
if (rele) {
timer();
} else {
count_credits();
slideshow(count_slide());
}
}
Adesso quindi i soci del Fablab possono sapere esattamente quanti crediti spendono direttamente guardando la macchina!