Announcement

Collapse
No announcement yet.

Announcement

Collapse
No announcement yet.

UltraTeknologia: UltraManometro - Grazie Ultrone!

Collapse
X
Collapse
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Font Size
    #1

    UltraTeknologia: UltraManometro - Grazie Ultrone!

    Vorrei solo ringraziare Ultrone per l'idea e le indicazioni sui componenti, soprattutto il sensore di pressione!

    Qui il post originale:
    http://www.daidegasforum.com/forum/t...manometro.html

    E qui il mio risultato



  • Font Size
    #2

    Comment


    • Font Size
      #3
      Dai non ? cos? brutto! E funziona!
      Solo che non usa una batteria al litio, quella non ho ancora studiato come usarla senza che mi scoppi tra le mani...

      Comment


      • Font Size
        #4
        Nono, anzi, ottimo lavoro. Stasera ti d? due dritte per migliorarlo. Intanto pubblica il software che vediamo le minch... ehm... le raffinate tecniche di offuscamento software che hai implementato!

        Ottimo lavoro cmq! BraFo braFo!

        Comment


        • Font Size
          #5
          Originally posted by Ultrone View Post
          Nono, anzi, ottimo lavoro. Stasera ti d? due dritte per migliorarlo. Intanto pubblica il software che vediamo le minch... ehm... le raffinate tecniche di offuscamento software che hai implementato!

          Ottimo lavoro cmq! BraFo braFo!
          Come software ho usato IDE, la scheda di controllo ? un arduino nano V3 (copia cinese ovviamente )
          Avevo scritto anche una parte dove premendo un pulsante ti faceva vedere due tabelle di pressione strada/pista caldo/freddo, poi ho tolto il pulsante tanto non ? che servisse a molto come funzione...

          Code:
          //Display libraries and defines
          #include <SPI.h>
          #include <Adafruit_GFX.h>
          #include <Adafruit_PCD8544.h>
          
          // Hardware SPI (faster, but must use certain hardware pins):
          // SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
          // MOSI is LCD DIN - this is pin 11 on an Arduino Uno
          // pin 5 - Data/Command select (D/C)
          // pin 4 - LCD chip select (CS)
          // pin 3 - LCD reset (RST)
          Adafruit_PCD8544 display = Adafruit_PCD8544(13, 11, 5, 4, 3);
          // Note with hardware SPI MISO and SS pins aren't used but will still be read
          // and written to during SPI transfer.  Be careful sharing these pins!
          
          int sensorPin = A7;    // select the input pin for the pressure sensor
          int button = 12; // input pulsante tabelle pressione
          int sensorValue = 0;  // variable to store the value coming from the sensor
          float pmis = 0; //valore pressione misurato
          float pdis = 0; //valore pressione da visualizzare
          char pmisdisp [4];
          byte Buttonstate = 0;
          byte lastButtonstate = 0;
          byte pressButton = 0;
          
          void rettangolo () {  //RETTANGOLO ESTERNO (colonna-riga iniziale, colonna riga finale)
              display.drawLine(2, 0, 81, 0, BLACK); //top line
              display.drawLine(2, 47, 81, 47, BLACK); //bottom line
              display.drawLine(0, 2, 0, 45, BLACK); //right line
              display.drawLine(83, 2, 83, 45, BLACK); //left line
              display.drawLine(1, 1, 1, 1, BLACK); //punto top left
              display.drawLine(82, 1, 82, 1, BLACK); //punto top right
              display.drawLine(1, 46, 1, 46, BLACK); //punto bottom left
              display.drawLine(82, 46, 82, 46, BLACK); } //punto bottom right
          
          void setup() {
            Serial.begin(9600);
            pinMode(button, INPUT);
            display.begin(); //initialize display done
            display.setContrast(50); //set display contrast
            display.clearDisplay();   // clears the screen and buffer
          }
          
          void loop() {
          //Button reading part
          //  Buttonstate = digitalRead(button);
          //  if(Buttonstate != lastButtonstate)
          //    if (Buttonstate == HIGH)
          //     pressButton = 1;
          //    else
          //     pressButton = 0;
          //  Serial.println(Buttonstate);
          //  Serial.println(lastButtonstate);
          //  Serial.println(pressButton);    
                 
          //Pressure reading part
            // read the value from the sensor:
            sensorValue = analogRead(sensorPin);
            Serial.println(sensorValue);
            //conversione input in valore pressione [Bar]
            pmis = ((sensorValue-40.92)/184.14); 
            if(pmis < 0) //evita di visualizzare valori negativi se vicino a 0
              pdis = 0; 
             else
              pdis = pmis;
            Serial.println(pdis);
          
          //Display part
            //RETTANGOLO ESTERNO (colonna-riga iniziale, colonna riga finale)
            rettangolo();
            if(pressButton == LOW) {
              //SCHERMATA PRINCIPALE
              display.clearDisplay();
              rettangolo();
              display.setTextSize(1);
              display.setTextColor(BLACK);
              display.setCursor(4,4);
              display.println("Pressure[Bar]");
              display.setTextSize(3);
              display.setTextColor(BLACK);    
              display.setCursor(8,18);
              display.println(pdis);    
              display.display(); }
             else {
              // SCHERMATE TABELLE PRESSIONI STRADA/PISTA
              display.clearDisplay();
              rettangolo();
              display.setTextSize(1);
              display.setTextColor(BLACK);
              display.setCursor(4,4);
              display.println("Road [Bar]");    
              display.setCursor(4,14);
              display.println("    Cold Hot");    
              display.setCursor(4,24);
              display.println("Ant  2.3 2.5");    
              display.setCursor(4,34);
              display.println("Post 2.5 2.7"); 
              display.display(); 
              delay(3000);
              display.clearDisplay();
              rettangolo();
              display.setTextSize(1);
              display.setTextColor(BLACK);
              display.setCursor(4,4);
              display.println("Track [Bar]");    
              display.setCursor(4,14);
              display.println("    Cold Hot");    
              display.setCursor(4,24);
              display.println("Ant  2.0 2.3");    
              display.setCursor(4,34);
              display.println("Post 1.8 2.0"); 
              display.display();
              delay(3000); }
              lastButtonstate = Buttonstate;   
              delay(300);    
          }

          Comment


          • Font Size
            #6
            Brevemente...

            Le letture analogiche devono essere campionate e normalizzate, altrimenti hai valori molto ballerini (cifre che galleggiano continuamente).

            Procedi in questo modo:

            Un ciclo for di n cicli, dove n ? una potenza di 2

            for(int i=0; i < 16; i++)
            sensorValue += analogRead(sensorPin);

            In questo modo hai la somma di 16 campioni.

            Per ottenere una media pesata bisogna tenere in considerazione quanto segue:

            Le piccole MCU come Arduino hanno estrema difficolt? (leggi: lentezza) nel calcolare i risultati di una divisione, questo perch? sono dotati di ALU (Aritmetic Logic Unit) molto elementari le quali eseguono le classiche operazioni di algebra booleana e le SOLE due funzioni matematiche di addizione e sottrazione.
            Non dispongono di unit? matematiche in grado di processare divisioni e moltiplicazioni (DSP Engine), per le quali operazioni necessitano di operare artefizi e/o numerosi cicli di addizione che sono fino a 100 volte pi? lente rispetto alla stessa operazione effettuata da un coprocessore matematico.

            Allora com'??

            E' che una divisione per sedici (la media dei sedici valori campionati con l'istruzione precedente) reiterata ogni ciclo diprocesso, comincia a rallentare il fliusso del programma. Se poi ci mettiamo le liBBrerie grafiche che hai utilizzato per gestire il Display, il loop diventa ancora pi? lento.

            La soluzione ? quella di adottare la tecnica del Barrel shifter, ovvero sfruttando la caratteristica della numerazione binaria in base al quale uno spostamento verso destra della cifra oggetto dell'operazione corrisponde ad una divisione x2 per ogni singolo successivo spostamento (spostando verso sinistra le cifre binarie si moltiplica il numero x2 per ogni singolo spostamento)

            da cui l'istruzione:

            sensorValue = sensorValue >> 4;

            sposta la cifra di quattro posizioni verso destra, effettuando una divisione per 16, che ? precisamente il numero dei nostri campioni restituendoci la media matematica.

            Ricapitolando:

            - cancella sensorValue = analogRead(sensorPin);

            e scrivi:

            for(int i=0; i < 16; i++)
            sensorValue += analogRead(sensorPin);
            sensorValue = sensorValue >> 4;

            Leggerai valori molto pi? precisi e molto pi? stabili!

            Comment


            • Font Size
              #7
              Se funzia bene.. c'? modo di farlo figo esteticamente? Ormai basta una stampante 3D..

              Cosa costa 'sta cosa?

              Comment


              • Font Size
                #8
                Originally posted by mito22 View Post
                Se funzia bene.. c'? modo di farlo figo esteticamente? Ormai basta una stampante 3D..

                Cosa costa 'sta cosa?
                'na cazzata!
                Last edited by Ultrone; 02-03-17, 17:35.

                Comment


                • Font Size
                  #9
                  Originally posted by Ultrone View Post
                  Brevemente...

                  Le letture analogiche devono essere campionate e normalizzate, altrimenti hai valori molto ballerini (cifre che galleggiano continuamente).

                  Procedi in questo modo:

                  Un ciclo for di n cicli, dove n ? una potenza di 2

                  for(int i=0; i < 16; i++)
                  sensorValue += analogRead(sensorPin);

                  In questo modo hai la somma di 16 campioni.

                  Per ottenere una media pesata bisogna tenere in considerazione quanto segue:

                  Le piccole MCU come Arduino hanno estrema difficolt? (leggi: lentezza) nel calcolare i risultati di una divisione, questo perch? sono dotati di ALU (Aritmetic Logic Unit) molto elementari le quali eseguono le classiche operazioni di algebra booleana e le SOLE due funzioni matematiche di addizione e sottrazione.
                  Non dispongono di unit? matematiche in grado di processare divisioni e moltiplicazioni (DSP Engine), per le quali operazioni necessitano di operare artefizi e/o numerosi cicli di addizione che sono fino a 100 volte pi? lente rispetto alla stessa operazione effettuata da un coprocessore matematico.

                  Allora com'??

                  E' che una divisione per sedici (la media dei sedici valori campionati con l'istruzione precedente) reiterata ogni ciclo diprocesso, comincia a rallentare il fliusso del programma. Se poi ci mettiamo le liBBrerie grafiche che hai utilizzato per gestire il Display, il loop diventa ancora pi? lento.

                  La soluzione ? quella di adottare la tecnica del Barrel shifter, ovvero sfruttando la caratteristica della numerazione binaria in base al quale uno spostamento verso destra della cifra oggetto dell'operazione corrisponde ad una divisione x2 per ogni singolo successivo spostamento (spostando verso sinistra le cifre binarie si moltiplica il numero x2 per ogni singolo spostamento)

                  da cui l'istruzione:

                  sensorValue = sensorValue >> 4;

                  sposta la cifra di quattro posizioni verso destra, effettuando una divisione per 16, che ? precisamente il numero dei nostri campioni restituendoci la media matematica.

                  Ricapitolando:

                  - cancella sensorValue = analogRead(sensorPin);

                  e scrivi:

                  for(int i=0; i < 16; i++)
                  sensorValue += analogRead(sensorPin);
                  sensorValue = sensorValue >> 4;

                  Leggerai valori molto pi? precisi e molto pi? stabili!
                  Ottimo consiglio! Effettivamente i centesimi di bar sono un po' ballerini...
                  Implemento subito poi da domenica sar? in cantiere dove avr? a disposizione la strumentazione calibrata per verificare che effettivamente il sensore segua la curva del datasheet

                  Il costo non ? del tutto una cazzata purtroppo... Tra tutto sono venuti fuori 35€ di soli componenti, a cui aggiungere altri 5€ per la versione ricaricabile con batteria stilo AA al litio da 2300mAh (lo modificher? ad aprile).
                  Poi c'? il montaggio...

                  Esteticamente non ? venuto neanche male, e lo scatolino che ho trovato ? di un ottimo abs bello elastico. In questo caso la stampante 3D non penso aggiunga molto a parte compensare la mia scarsa abilit? con la lima.
                  Last edited by rei348; 02-03-17, 19:53.

                  Comment


                  • Font Size
                    #10
                    Aggiornamento:
                    in cantiere ho potuto verificare la taratura del manometro in tutto il range utile da 1 a 4,5 Bar: precisione assoluta!
                    Rispetto alla formula indicata nel datasheet del sensore, ho dovuto mettere un +0,014mBar per compensare un errore costante.
                    Una volta fatta la modifica via software, l'errore ? praticamente sparito ed ? rimasto solo quello causato dal campionamento dell'arduino (che pu? "leggere" da 0 a 1023, quindi solo 1024 valori di pressione) e ampiamente "nascosto" dal fatto che il display ha una risoluzione 10mBar (due cifre decimali)

                    Pienamente soddisfatto!!
                    Last edited by rei348; 04-04-17, 13:43.

                    Comment


                    • Font Size
                      #11
                      Originally posted by rei348 View Post
                      Aggiornamento:
                      in cantiere ho potuto verificare la taratura del manometro in tutto il range utile da 1 a 4,5 Bar: precisione assoluta!
                      Rispetto alla formula indicata nel datasheet del sensore, ho dovuto mettere un +0,014mBar per compensare un errore costante.
                      Una volta fatta la modifica via software, l'errore ? praticamente sparito ed ? rimasto solo quello causato dal campionamento dell'arduino (che pu? "leggere" da 0 a 1023, quindi solo 1024 valori di pressione) e ampiamente "nascosto" dal fatto che il display ha una risoluzione 10mBar (due cifre decimali)

                      Pienamente soddisfatto!!
                      E facci due foto!

                      Comment


                      • Font Size
                        #12
                        Originally posted by Ultrone View Post
                        E facci due foto!
                        Le foto del manometro ci sono qualche post indietro, quelle in fase di test non esistono... Purtroppo il cantiere ? su un'isola degli emirati arabi in cui ? vietato portare macchine fotografiche, sicurezza militare dicono
                        Poi il fatto che su google maps la suddetta isola sia visibilissima e abbiano pure aggiornato le foto il mese scorso ? irrilevante!

                        Comment


                        • Font Size
                          #13
                          Prezzo in MP!

                          Comment


                          • Font Size
                            #14
                            Originally posted by rei348 View Post
                            Le foto del manometro ci sono qualche post indietro, quelle in fase di test non esistono... Purtroppo il cantiere ? su un'isola degli emirati arabi in cui ? vietato portare macchine fotografiche, sicurezza militare dicono
                            Poi il fatto che su google maps la suddetta isola sia visibilissima e abbiano pure aggiornato le foto il mese scorso ? irrilevante!
                            Che lavoro fai? Magari facciamo lo stesso lavoro...

                            Comment


                            • Font Size
                              #15
                              Originally posted by Ultrone View Post
                              Che lavoro fai? Magari facciamo lo stesso lavoro...
                              Ingegnere elettrico, settore EPC oil&gas.
                              Non ? proprio lo stesso, a quanto ho capito tu sei un programmatore di DCS o roba simile, io mi occupo di ingegneria dei sistemi di potenza e relativo controllo (tipo sistemi di power management basati su 800xA)

                              Comment

                              X
                              Working...
                              X