LaserCut Credits Counter con Arduino

LaserCut Credits Counter con Arduino

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!