Conta-Confezioni

Ciao mi sono già presentato nella sezione apposita, sto cercando di progettare un Conta-Confezioni per una macchina dello stoccaggio delle patate.
Praticamente mi deve contare quante volte si apre lo sportello per scaricare le patate, fin qui tutto bene.
Fin ora ho messo un semplice pulsante che premendo mi da il numero in aumento delle confezioni, ma volevo optare per un altra soluzione ovvero il sensore “rilevatore di ostacoli a raggi infrarossi” oppure detto “modulo avoidance” già ordinato su internet.
Ho messo un altro pulsante per far si che premendo tutte e due i pulsanti resetto il numero delle confezioni.
La prima domanda è questa, c’è un modo per far si che premendo un solo pulsante resetto il numero delle confezioni?
La seconda domanda è questa, come devo scrivere nel software arduino per contare quante confezioni fa in un minuto, naturalmente facendomi la media minuto per minuto?

Spero sia stato chiaro, ma ancora sono un novellino e so che c’è tanto da imparare.
Ho girovagato su internet ma non ho trovato nessun progetto simile.
GRAZIE.

Ho scritto così:

#include <LiquidCrystal.h>
int in=8;
int in2=7;


int a = 0;
int b = 0;
int c= 0;
int d = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 pinMode(in,INPUT);
 lcd.begin(16, 2);
 lcd.print("Az.Garofalo Maria Assunta");
 delay(3000); lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Confezioni:");
 lcd.setCursor(0, 1);
}

void loop() {

 c=digitalRead(in);
 if ( c== 1){b=b+1; delay(500);}
 d=digitalRead(in2);
 if ( d== 1){a=a+1;delay(500);}
  if (( c ==1) & ( d==1)){a=0; b=0; delay(500);}
 
 lcd.setCursor(0, 1);
 lcd.print(a);
 }

CONTBETA1.ino (562 Bytes)

Modificando lo sketch sono riuscito a usare un solo pulsante per resettarlo:

  c=digitalRead(in);
  if ( c== 1){b=b+1; delay(500);}
  d=digitalRead(in2);
  if ( d== 1){a=a+1;delay(500);}
   if ((c==1)){a=0; b=0; delay(500);}

Ora mi manca soltando la seconda domanda:
Come devo scrivere lo sketch per contare quante confezioni fa in un minuto, naturalmente facendomi la media minuto per minuto?

guardando il codice (prima versione) ci sono alcuni errori:

  • non hai inizializzato il pin del secondo pulsante
  • la & è l'operatore bitwise and. l'operatore di AND logico è &&

poi la variabile b la inizializzi e incrementi, ma non la visualizza mai...

per il secondo problema ti serve la media dell'ultimo minuto o la media confezioni/minuto relativa a tutto il tempo?

ps: visto che sei agli inizi, cerca di prendere subito delle buone abitudini: evita di usare nomi di variabile anonimi, rendono difficile capire il codice. se invece di 4 variabili ne hai 21 (con le lettere dalla a alla z) la vedo dura riuscire a capirti...

  c=digitalRead(in);
  if ( c== 1){b=b+1; delay(500);}
  d=digitalRead(in2);
  if ( d== 1){a=a+1;delay(500);}
   if ((c==1)){a=0; b=0; delay(500);}

occhio che così la variabile b è praticamente inutile... ogni volta che la incrementi dopo mezzo secondo la azzeri...

fratt:
guardando il codice (prima versione) ci sono alcuni errori:

  • non hai inizializzato il pin del secondo pulsante
  • la & è l'operatore bitwise and. l'operatore di AND logico è &&

poi la variabile b la inizializzi e incrementi, ma non la visualizza mai...

per il secondo problema ti serve la media dell'ultimo minuto o la media confezioni/minuto relativa a tutto il tempo?

ps: visto che sei agli inizi, cerca di prendere subito delle buone abitudini: evita di usare nomi di variabile anonimi, rendono difficile capire il codice. se invece di 4 variabili ne hai 21 (con le lettere dalla a alla z) la vedo dura riuscire a capirti...

Grazie fratt, ho rettificato.
comunque mi serve la media confezioni/minuto relativa a tutto il tempo.

falco095:
Ciao

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo
stesso.

Puoi modificare il post con il codice che hai già inserito. :slight_smile:

nid69ita:
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Chiedo scusa rettifico al prossimo post!

falco095:
comunque mi serve la media confezioni/minuto relativa a tutto il tempo.

salvi l'istante di partenza con millis() e poi calcoli la media

unsigned long inizio = 0;
float media = 0;

void setup() {
  pinMode(in,INPUT);
  lcd.begin(16, 2);
  lcd.print("Az.Garofalo Maria Assunta");
  delay(3000); lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Confezioni:");
  lcd.setCursor(0, 1);

  inizio = millis();
}

void loop() {

  c=digitalRead(in);
  if ( c== 1) {
    b++; 
  }

  d=digitalRead(in2);
  if ( d== 1) {
    a++;
  }

  if ( c ==1) {
    a=0; 
    b=0;
    inizio = millis();
  }
 
  lcd.setCursor(0, 1);
  lcd.print(a);

  media = (float) a / ((millis() - inizio) / 1000);

  delay(500);

}

ho tralasciato la parte iniziale del codice

fratt:
salvi l’istante di partenza con millis() e poi calcoli la media

unsigned long inizio = 0;

float media = 0;

void setup() {
  pinMode(in,INPUT);
  lcd.begin(16, 2);
  lcd.print(“Az.Garofalo Maria Assunta”);
  delay(3000); lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(“Confezioni:”);
  lcd.setCursor(0, 1);

inizio = millis();
}

void loop() {

c=digitalRead(in);
  if ( c== 1) {
    b++;
  }

d=digitalRead(in2);
  if ( d== 1) {
    a++;
  }

if ( c ==1) {
    a=0;
    b=0;
    inizio = millis();
  }

lcd.setCursor(0, 1);
  lcd.print(a);

media = (float) a / ((millis() - inizio) / 1000);

delay(500);

}




ho tralasciato la parte iniziale del codice

fratt io ho copiato cosi:

#include <LiquidCrystal.h>
int in=8;
int in2=7;


int a = 0;
int b = 0;
int c= 0;
int d = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


unsigned long inizio = 0;
float media = 0;

void setup() {
  pinMode(in,INPUT);
  lcd.begin(16, 2);
  lcd.print("Az.Garofalo Maria Assunta");
  delay(3000); lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Confezioni:");
  lcd.setCursor(0, 1);

  inizio = millis();
}

void loop() {

  c=digitalRead(in);
  if ( c== 1) {
    b++; 
  }

  d=digitalRead(in2);
  if ( d== 1) {
    a++;
  }

  if ( c ==1) {
    a=0; 
    b=0;
    inizio = millis();
  }
 
  lcd.setCursor(0, 1);
  lcd.print(a);

  media = (float) a / ((millis() - inizio) / 1000);

  delay(500);

}

Non fa quello che deve fare.
Insomma ti spiego il minuto deve partire dal primo impulso che gli viene dato, da quell’impulso deve calcolare la media confezioni/minuto relativa in tutto il tempo che lavoro.
E naturalmente sul display mi deve apparire possibilmente estremamente a destra ESEMPIO: C/min=60 .
Io questo dovrei riuscire a fare.
Essendo alle prime armi ho scelto una cosetta un pò difficile intanto mi serve per l’azienda.

non avevo messo il codice per scrivere su LCD…
poi ho anche spostato la parte della media…

#include <LiquidCrystal.h>
int pin_bottone1=8;
int pin_bottone2=7;


int conta = 0;
//int b = 0;
int bottone1= 0;
int bottone2 = 0;
unsigned long inizio = 0;
float media = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup() {
  pinMode(pin_bottone1,INPUT);
  pinMode(pin_bottone2,INPUT);

  lcd.begin(16, 2);
  lcd.print("Az.Garofalo Maria Assunta");
  delay(3000); 
  lcd.clear();

  inizio = millis();
}

void loop() {

  bottone1 = digitalRead(pin_bottone1);
// a cosa serve questo if??? e a cosa serve la variabile b???
//  if ( bottone1 == 1) {
//    b++;
//  }
  if ( bottone1 == 1) {
    conta=0;
//    b=0;
    inizio = millis();
  }

  bottone2 = digitalRead(pin_bottone2);
  if ( bottone2 == 1) {
    conta++;
  }

  media = (float) conta / ((millis() - inizio) / 1000);

  lcd.setCursor(0, 0);
  lcd.print("Confezioni:");
  lcd.setCursor(0, 1);
  lcd.print(conta);
  lcd.setCursor(8, 0);
  lcd.print("Media:");
  lcd.setCursor(8, 1);
  lcd.print(media);

  delay(500);

}

per maggiore comprensibilità ho cambiato i nomi delle variabili… casomai ricambiali come ti piace.

il codice l’ho scritto al volo senza provarlo…
verifica come viene stampata la media su LCD… probabilmente devi formattare i decimali.

Buongiorno lo sketch sembra andare bene.
Mi viene in mente un dubbio premendo il pulsante ogni 10 secondi in un minuto mi fa la MEDIA=0.10, in realtà non mi deve contare la media di quanti secondi in piega a fare una confezione, ma quante confezioni fa in un minuto cioè quante volte viene premuto il pulsante in quel minuto, se lo premo ogni 10 secondi in realtà lo premo 6 volte in un minuto è giusto il risultato=0.10???
Poi vorrei cambiare anche la virgola cioè vorrei fare apparire soltanto il "10" ma prima vorrei capire se è giusto il compito che esegue o mi sbaglio io.

Mi sa che ho messo la formula che calcola la media al secondo... Basta che moltipliche per 60.

Se ti basta la media senza virgola devi dichiarare la variabile media come int e togli il cast nella formula (togli il float tra parentesi)

fratt:
Mi sa che ho messo la formula che calcola la media al secondo... Basta che moltipliche per 60.

Se ti basta la media senza virgola devi dichiarare la variabile media come int e togli il cast nella formula (togli il float tra parentesi)

Ho moltiplicato 1000x60 ma sul display mi appare INF che penso che sta per infinito.

@falco, posta il tuo codice attuale.

nid69ita:
@falco, posta il tuo codice attuale.

#include <LiquidCrystal.h>
int pin_bottone1=8;
int pin_bottone2=7;


int conta = 0;
//int b = 0;
int bottone1= 0;
int bottone2 = 0;
unsigned long inizio = 0;
float media = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup() {
 pinMode(pin_bottone1,INPUT);
 pinMode(pin_bottone2,INPUT);

 lcd.begin(16, 2);
 lcd.print("Az.Garofalo Maria Assunta");
 delay(3000); 
 lcd.clear();

 inizio = millis();
}

void loop() {

 bottone1 = digitalRead(pin_bottone1);
// a cosa serve questo if??? e a cosa serve la variabile b???
//  if ( bottone1 == 1) {
//    b++;
//  }
 if ( bottone1 == 1) {
   conta=0;
//    b=0;
   inizio = millis();
 }

 bottone2 = digitalRead(pin_bottone2);
 if ( bottone2 == 1) {
   conta++;
 }

 media = (float) conta / ((millis() - inizio) / 60000);

 lcd.setCursor(0, 0);
 lcd.print("Confezioni:");
 lcd.setCursor(0, 1);
 lcd.print(conta);
 lcd.setCursor(8, 0);
 lcd.print("Media:");
 lcd.setCursor(8, 1);
 lcd.print(media);

 delay(500);

}

Visto che stai lavorando con le virgole, prova a forzare i decimali sulla costante, metti 60000.0

nid69ita:
Visto che stai lavorando con le virgole, prova a forzare i decimali sulla costante, metti 60000.0

Grazie Igor, ci sono riuscito.
Ok funziona a dovere, va bene anche la media con la virgola per ora provo così, in caso provo a cambiarla se mi da fastidio.
Ora devo aspettare soltanto il sensore.
Grazie a tutti.

Buonasera riapro il topic, mi è arrivato il sensore “KY032 rilevatore di ostacoli” al posto del pulsante ho collegato il sensore, fin qui tutto bene, funziona alla 100%.
Ora però c’è un problema, voglio far funzionare il rivelatore in modo che appena vede lo sportello, conta un solo impulso, ma poi deve stare per almeno per 3 secondi “scusate l espressione BENDATO” così non vede il ritorno dello sportello se non viene contato per ben 2 volte .
Non so sullo Sketch come dirgli al rilevatore di fermarsi appena da l’impulso.

Lo sketch è questo aspetto vostre risposte, GRAZIE.

#include <LiquidCrystal.h>
int pin_bottone1=8;
int pin_sensore=7;


int conta = 0;
int bottone1= 0;
int sensore= 0;
unsigned long inizio = 0;
float media = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup() {
 pinMode(pin_bottone1,INPUT);
 pinMode(pin_sensore,INPUT);

 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Azienda Garofalo");
 lcd.setCursor(0, 1);
 lcd.print("*Maria Assunta*");
 delay(500); 
 lcd.clear();

 inizio = millis();
}

void loop() {

 bottone1 = digitalRead(pin_bottone1);
 if ( bottone1 == 1) {
   conta=0;
   inizio = millis();
 }

 sensore = digitalRead(pin_sensore);
 if ( sensore == LOW) {
   conta++;
 }

 media = (float) conta / ((millis() - inizio) / 60000);

  lcd.setCursor(0, 0);
 lcd.print("Confezioni:");
 lcd.setCursor(11,0);
 lcd.print(conta);
 lcd.setCursor(0, 1);
 lcd.print("Conf/min:");
 lcd.setCursor(9, 1);
 lcd.print(media);

 delay(500);

}

Ciao, ad esempio puoi in setup:

int bendato =3600;

al posto di

 if ( sensore == LOW) {
   conta++;
 }

metti

if(sensore==low && millis()-bendato > 3000) {conta++;bendato=millis();}

in sostanza fino a che millis()-bendato <3000 non incrementa…

Stefano

cam9500:
Ciao, ad esempio puoi
setup: bendato =3600
quando (sensore==low && millis()-bendato > 3000) {conta++;bendato=millis()}

fino a che millis()-bendato <3000 non incrementa…

Stefano

Ciao Stefano non riesco a scrivere il sketch…
Puoi aiutarmi e magari usare la funzione CODE…?