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!