contatore di impulsi

salve a tutti, premetto (come si evince dal mio usarname) che non sono un esperto di elettronica. sono uno studente del liceo, stiamo lavorando ad un progetto scolastico e io ho proposto un contatore di impulsi tramite un display lcd touch e sensori infrared.
appena è arrivato il materiale mi sono accorto di aver fatto il passo più grande della gamba, ma ormai che sono in gioco, giochiamo. sto divorando tutorial a destra e sinistra, e qualcosa sono riuscito a fare.
per testare i sensori e capire il meccanismo sono riuscito ad arrivare ad un codice elementare che funziona.
il codice è questo:

void setup() {
 // put your setup code here, to run once:
 pinMode (A0,INPUT); // riceve segnale dal sensore 1
 pinMode (A1,OUTPUT); // GND pin 1
 pinMode (A2,OUTPUT); // VCC pin 1
 pinMode (11,OUTPUT); // led pin 1
 digitalWrite (A2,HIGH); // 5V AL SENSORE 1
 digitalWrite (A1,LOW); // connetti gnd arduino a gnd sensore 1
 Serial.begin (9600); //
 pinMode (A8,INPUT); // riceve segnale dal sensore 2
 pinMode (A2,OUTPUT); // GND pin 2
 pinMode (A1,OUTPUT); // VCC pin 2
 pinMode (10,OUTPUT); // led pin 2
 digitalWrite (A2,HIGH); // 5V AL SENSORE 1
 digitalWrite (A1,LOW); // connetti gnd arduino a gnd sensore 2
 Serial.begin (9600); // 
}
void loop() {
 Serial.println(analogRead(A0)); // print voltage of output pin (resolution 1-1024)1
 delay (0); // aspetta niente'
 if(analogRead(A0) < 500)
 digitalWrite(11,HIGH);
 else
 digitalWrite(11,LOW);
 Serial.println(analogRead(A8)); // print voltage of output pin (resolution 1-1024)2
 delay (0); // aspetta niente'
 if(analogRead(A8) < 500)
 digitalWrite(10,HIGH);
 else
 digitalWrite(10,LOW);
}

in pratica ogni volta che il sensore legge qualcosa si accende il led, poi ho doppiato il sensore (i sensori sono 2) e quindi ho due led e due sensori che lavorano separatamente. e incredibile ma vero funziona!

ora però vorrei sostituire l'accensione del led con un contatore con un tasto reset.

da questo momento in poi buio totale!

aggiungo....

sto parallelamente lavorando anche sul display, attualmente solo grafica, e ho 8 bottoni (alla fine saranno 8 i sensori e 8 le numerazioni da visualizzare), e due bottoni uno per il reset e l'altro per tornare indietro.
poi dovrei assegnare ad ogni bottone numerato la funzione di leggere il contatore del singolo sensore, al bottone back la funzione di riportarmi al menu principale, e quello di reset di cancellare la numerazione e partire da zero.

potreste aiutarmi? grazie.

@gpb01 fatto! e scusi la foga...

Allora, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice, del tuo primo post, dovrà trovarsi racchiuso tra due tag:

[code] _il _tuo_ codice_ [/code]

così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

... attento ad alimentare le cose con i pin di Arduino messi in OUTPUT ... ricorda sempre che ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip.

Quindi, verifica bene quanto assorbe ogni sensore che alimenti con i pin di Arduino e ricorda di non superare il limiti su indicati :wink:

Guglielmo

per leggere impulsi, meglio l'interrupt e per quallo che ne so con alcuni integrati possono essere più dei 2 disponibili su arduino

gpb01:
... attento ad alimentare le cose con i pin di Arduino messi in OUTPUT ... ricorda sempre che ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip.

Quindi, verifica bene quanto assorbe ogni sensore che alimenti con i pin di Arduino e ricorda di non superare il limiti su indicati :wink:

Guglielmo

ok starò attento e domani verificherò, sto collegando l'alimentazione dei sensori in parallelo tra loro, quindi la corrente dovrebbe essere tranquillamente sotto i limiti, anche perchè il sensore è specifico per arduino.

stefa24:
per leggere impulsi, meglio l'interrupt e per quallo che ne so con alcuni integrati possono essere più dei 2 disponibili su arduino

l'interrupt è un tipo di sensore diverso? il nostro (che tra l'altro questo abbiamo e questo ci dobbiamo tenere) funziona benissimo. anche molto velocemente, e i led rispondono benissimo.

Allora
Ti hanno giá detto di non alimentare i sensori tramite Pin.
I pin analogici non devono essere definiti come entrate analogiche. non serva il pinMode().
Poi dici che modello di Arduino hai e che tipo di sensori hai. Disegna ( anche solo con carta e penna e poi fai una foto) anche lo schema elettrico come hai collegato i sensori ad Arduino. Dici anche quanti pimulsi al secondo prevedi che l'Arduino deve contare.
Interrupt é un modo di gestire un segnale in entrata nel Arduino.

Ciao Uwe

stefa24:
per leggere impulsi, meglio l'interrupt e per quallo che ne so con alcuni integrati possono essere più dei 2 disponibili su arduino

Per leggere impulsi velocissimi, magari si.... :slight_smile:
Ma se i tuoi impulsi non sono almeno 50 al secondo lascerei stare gli interrupt...
CHE NON SONO dei sensori diversi :slight_smile: ma è un modo diverso di lavorare di Arduino (e di qualsiasi altra MCU) su alcuni ingressi dedicati in modo da renderli più... "veloci" (i puristi perdonino la spiegazione...)

Poi spiegami cosa è questa cosa di collegare i GND dei sensori su una uscita analogica... (che sicuramente funziona ma non ne capisco il senso).

Poi per mettere un contatore non devi fare niente di strano, al posto del digitalWrite sul LED incrementi una variabile che chiamerai come vuoi, che so, contatore1, per esempio.
farai:
contatore1 = contatore1 + 1;
e per azzerarlo, quando vorrai, alla pressione del tuo tasto (if analoglRead del tasto... ecc) farai
contatore1 = 0;

Naturalmente questa variabile la devi dichiarare prima del Setup con
int contatore1 = 0;

(te lo dico perché non hai usato variabili nel tuo programma e magari non sai ancora cosa sono...)

Buon divertimento

Pensavo di essere nottambulo, ma vedo che UWEFED è più nottambulo di me (nel senso che io ho il fuso orario di una ora in meno di lui :slight_smile: :slight_smile: :slight_smile: )

adesso, sono in classe, ma non appena riesco vado in laboratorio e mostrerò il circuito.

per ora,
il conteggio è lento, massimo 1-2 al secondo, è tipo un conta monete. quindi il sensore che è questo: https://www.amazon.it/TecnoStore®-INFRAROSSO-movimento-Infrared-obstacle/dp/B071XXXDVW/ref=sr_1_2?ie=UTF8&qid=1527145638&sr=8-2&keywords=infrared+sensor+arduino

per il gnd nel pin analogico è dovuto al fatto che inizialmente avevo montato il sensore direttamente sulla scheda arduino per testarlo.
arduino è il mega 2560.

siccome col display sono un pò indietro, ho possibilità di verificare il contatore senza usare il display? come?

steve-cr:
Pensavo di essere nottambulo, ma vedo che UWEFED è più nottambulo di me (nel senso che io ho il fuso orario di una ora in meno di lui :slight_smile: :slight_smile: :slight_smile: )

Sí, sono giá fuso da parecchi ore.

ignorante_seriale:
il conteggio è lento, massimo 1-2 al secondo, è tipo un conta monete.

Allora non serve un interrupt ma solo controllare il stato del entrata (polling)

Ciao Uwe

siccome col display sono un pò indietro, ho possibilità di verificare il contatore senza usare il display? come?

con il monitor seriale

attualmente il mio codice è questo:

int contatore1 = 0; // variabile di memorizzazione del numero di oggetti contati
int contatore2 = 0;
int contatore3 = 0;
int contatore4 = 0;
int contatore5 = 0;
int contatore6 = 0;
int contatore7 = 0;
int contatore8 = 0;
int semaforo = 0; // variabile che funge da semaforo, utilizzata per evitare di contare
// piu' volte il medesimo oggetto
int statosensore1 = 0; // variabile di memorizzazione dello stato (LOW oppure HIGH) del
// modulo keyesir
#define sensore1 14 // il pin "out" del modulo keyesir e' collegato alla porta 7
int statosensore2 = 0;
#define sensore2 15
int statosensore3 = 0;
#define sensore3 16
int statosensore4 = 0;
#define sensore4 17
int statosensore5 = 0;
#define sensore5 18
int statosensore6 = 0;
#define sensore6 19
int statosensore7 = 0;
#define sensore7 20
int statosensore8 = 0;
#define sensore8 21
//
void setup()
{
  Serial.begin(9600); // inizializza il monitor seriale
  pinMode (sensore1, INPUT);// il sensore viene definito come unita' di input
}
//
void loop()
{
  {
  
  statosensore1 = digitalRead (sensore1); // rileva lo stato del modulo
  if (statosensore1 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore1 == LOW)) // se c'e' un nuovo ostacolo non conteggiato
    semaforo = 1; // considera conteggiato l'ostacolocontatore1 = contatore1 + 1; // conteggia l'ostacolo
  Serial.println(contatore1);
}
{

  statosensore2 = digitalRead (sensore2); // rileva lo stato del modulo
  if (statosensore2 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore2 == LOW)) // se c'e' un nuovo ostacolo non conteggiato

    contatore2 = contatore2 + 1; // conteggia l'ostacolo
  semaforo = 1; // considera conteggiato l'ostacolo
  Serial.println(contatore2);
}
{
  statosensore3 = digitalRead (sensore3); // rileva lo stato del modulo
  if (statosensore3 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore3 == LOW)) // se c'e' un nuovo ostacolo non conteggiato

    contatore3 = contatore3 + 1; // conteggia l'ostacolo
  semaforo = 1; // considera conteggiato l'ostacolo
  Serial.println(contatore3);
}
{

  statosensore4 = digitalRead (sensore4); // rileva lo stato del modulo
  if (statosensore4 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore4 == LOW)) // se c'e' un nuovo ostacolo non conteggiato

    contatore4 = contatore4 + 1; // conteggia l'ostacolo
  semaforo = 1; // considera conteggiato l'ostacolo
  Serial.println(contatore4);
}
{
  statosensore5 = digitalRead (sensore5); // rileva lo stato del modulo
  if (statosensore5 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore5 == LOW)) // se c'e' un nuovo ostacolo non conteggiato

    contatore5 = contatore5 + 1; // conteggia l'ostacolo
  semaforo = 1; // considera conteggiato l'ostacolo
  Serial.println(contatore5);
}
{
  statosensore6 = digitalRead (sensore6); // rileva lo stato del modulo
  if (statosensore6 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore6 == LOW)) // se c'e' un nuovo ostacolo non conteggiato

    contatore6 = contatore6 + 1; // conteggia l'ostacolo
  semaforo = 1; // considera conteggiato l'ostacolo
  Serial.println(contatore6);
}
{
  statosensore7 = digitalRead (sensore7); // rileva lo stato del modulo
  if (statosensore7 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore7 == LOW)) // se c'e' un nuovo ostacolo non conteggiato

    contatore7 = contatore7 + 1; // conteggia l'ostacolo
  semaforo = 1; // considera conteggiato l'ostacolo
  Serial.println(contatore7);
}
{
  statosensore8 = digitalRead (sensore8); // rileva lo stato del modulo
  if (statosensore8 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore8 == LOW)) // se c'e' un nuovo ostacolo non conteggiato

    contatore8 = contatore8 + 1; // conteggia l'ostacolo
  semaforo = 1; // considera conteggiato l'ostacolo
  Serial.println(contatore8);
}
}

in pratica ho collegato ogni sensore (uscita out) ai pin digitali. ora sono a casa ma domani (fine del progetto) e non ho con me arduino dovrei testarlo,
oggi quando l'ho provato a scuola non avevo messo le parentesi come ora, quindi leggeva (e male) solo il primo visualizzandolo sul monitor seriale. era tutto scritto di fila, ora dovrebbe andare.
cmq mi rimane il problema del display, sono riuscito a fare una bella grafica di 8 bottoni, ma non riesco ad assegnare ad essi la funzione di leggermi il contatore.

come posso fare?

il mio display è: ft 320qvt_9341 15a

chiedo scusa per il doppio post ma il codice è lungo e non avevo alternaitive

e il codice del dysplay che ho è questo:

// UTFT_Buttons_Demo_320x240
// Copyright (C)2016 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// A small demo to demonstrate the use of some of the
// functions of the UTFT_Buttons add-on library.
//
// This demo was made for modules with a screen resolution
// of 320x240 pixels, but should work on larger screens as
// well.
//
// This program requires both the UTFT and URTouch libraries
// in addition to the UTFT_Buttons add-on library.
//

#include <UTFT.h>
#include <URTouch.h>
#include <UTFT_Buttons.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t Dingbats1_XL[];

// Set up UTFT...
// Set the pins to the correct ones for your development board
// -----------------------------------------------------------
// Standard Arduino 2009/Uno/Leonardo shield   : <display model>,19,18,17,16
// Standard Arduino Mega/Due shield            : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Due       : <display model>,25,26,27,28
// Standard chipKit Uno32/uC32                 : <display model>,34,35,36,37
// Standard chipKit Max32                      : <display model>,82,83,84,85
// AquaLEDSource All in One Super Screw Shield : <display model>,82,83,84,85
// CC3200 LaunchPad (pins used in the examples): <display model>,15,18,11,32
//
// Remember to change the model parameter to suit your display module!
UTFT          myGLCD(ILI9341_16, 38, 39, 40, 41);

// Set up URTouch...
// Set the pins to the correct ones for your development board
// -----------------------------------------------------------
// Standard Arduino 2009/Uno/Leonardo shield   : 15,10,14,9,8
// Standard Arduino Mega/Due shield            : 6,5,4,3,2
// CTE TFT LCD/SD Shield for Arduino Due       : 6,5,4,3,2
// Standard chipKit Uno32/uC32                 : 20,21,22,23,24
// Standard chipKit Max32                      : 62,63,64,65,66
// AquaLEDSource All in One Super Screw Shield : 62,63,64,65,66
// CC3200 LaunchPad (pins used in the examples): 31,13,19,28,17
//
URTouch        myTouch(6, 5, 4, 3, 2);

// Finally we set up UTFT_Buttons :)
UTFT_Buttons  myButtons(&myGLCD, &myTouch);
int contatore1 = 0;
int semaforo = 0;
int statosensore1 = 0; // variabile di memorizzazione dello stato (LOW oppure HIGH) del
// modulo keyesir
#define sensore1 14 // il pin "out" del modulo keyesir e' collegato alla porta 7
int pressed_button

void setup()
{
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  myButtons.setTextFont(BigFont);
  myButtons.setSymbolFont(Dingbats1_XL);
  Serial.begin(9600); // inizializza il monitor seriale
  pinMode (sensore1, INPUT);// il sensore viene definito come unita' di input
}

void loop()
{
  if (pressed_button == but1)
        myGLCD.print ( Serial.println(contatore1);
        statosensore1 = digitalRead (sensore1); // rileva lo stato del modulo
  if (statosensore1 == HIGH) // se non ci sono ostacoli
    semaforo = 0; // spegne il semaforo in modo da predisporsi alla conta
  // del prossimo ostacolo
  if ((semaforo == 0) && (statosensore1 == LOW)) // se c'e' un nuovo ostacolo non conteggiato
  {
    semaforo = 1; // considera conteggiato l'ostacolocontatore1 = contatore1 + 1; // conteggia l'ostacolo
    Serial.println(contatore1);

    int but1, but2, but3, but4, but5, but6, but7, but8, butY, pressed_button;
    boolean default_colors = true;

    but1 = myButtons.addButton( 0, 20, 75, 70, "1");
    but2 = myButtons.addButton( 80, 20, 75,  70, "2");
    but3 = myButtons.addButton( 160, 20, 75,  70, "3");
    but4 = myButtons.addButton( 240, 20, 75, 70, "4");
    but5 = myButtons.addButton( 0, 100, 75, 70, "5");
    but6 = myButtons.addButton( 80, 100, 75, 70, "6");
    but7 = myButtons.addButton( 160, 100, 75, 70, "7");
    but8 = myButtons.addButton( 240, 100, 75, 70, "8");
    butY = myButtons.addButton(  0, 199, 100,  40, "reset");
    myButtons.drawButtons();

    myGLCD.print("", 110, 205);
    myGLCD.setColor(VGA_BLACK);
    myGLCD.setBackColor(VGA_WHITE);


    while (1)
    {
      if (myTouch.dataAvailable() == true)
      {
        pressed_button = myButtons.checkButtons();


        {

        }
      }      else if (pressed_button == butY)
      {
        if (default_colors)
        {
          myButtons.setButtonColors(VGA_YELLOW, VGA_RED, VGA_YELLOW, VGA_BLUE, VGA_GRAY);
          myButtons.relabelButton(butY, "_");
          myButtons.drawButtons();
          default_colors = false;
        }
        else
        {
          myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_WHITE, VGA_RED, VGA_BLUE);
          myButtons.relabelButton(butY, "I");
          myButtons.drawButtons();
          default_colors = true;
        }
      }
      if (pressed_button == but1)
        myGLCD.print("contatore", 110, 220);
      if (pressed_button == but2)
        myGLCD.print("int contatore" , 110, 220);
      if (pressed_button == but3)
        myGLCD.print("int contatore", 110, 220);
      if (pressed_button == but4)
        myGLCD.print("contatore", 110, 220);
      if (pressed_button == but5)
        myGLCD.print("contatore", 110, 220);
      if (pressed_button == but6)
        myGLCD.print("contatore", 110, 220);
      if (pressed_button == but7)
        myGLCD.print("contatore", 110, 220);
      if (pressed_button == but8)
        myGLCD.print("contatore", 110, 220);
    }
  }
}

aiuti?

Fammi capire. È saltato fuori ieri sera che hai tempo fino a oggi? Avrebbe fatto comodo saperlo prima. Per la prossima volta, se hai tempi stretti, per favore Cillo subito.
Ho dato una scorsa al programma, ma mi sono perso nelle variabili. Un contatore di impulsi è una cosa che con tre (3) array è fatta. Gli hai mai usati? Cerca li, conviene. Ne basta uno costante di pin, uno di numero impulsi, e uno di stato precedente. L'intero calcolo è

for (byte i=0;i <NUM_SENSORI;i++)
{
bool a =digitalRead (pin [i]);
if  (a != stato [i])
{
stato [i]=a;
impulsi [i]=impulsi [i]+a;
}
}

Quanto al display non ho capito cosa devi scriverci sopra.

alla fine è andata bene. unico neo il display, il programma degli impulsi ha funzionato e ho letto il conteggio sul pc con il monitor seriale.
comunque vorrei lo stesso capire come interagire col display.