lunes, 16 de noviembre de 2015

Monitoreo de un sensor con QC12864-B y arduino.(Conexión serie.)




En este caso, por  simplicidad y dejar libre el mayor número de pines, hemos utilizado comunicación serie entre el arduino y el LCD.  En mi modelo, el QC1286-B-1, para poder hacerlo hay que quitar un par de resistencias de 0 Ohmios de la trasera del LCD: R9 y R11, y esto es importante porque de no hacerlo estaremos puenteando los 5V con masa y en el mejor de los casos no va a funcionar, y en el peor nos  cargaremos el arduino y/o el LCD. 

IMPORTANT! For this LCD to work using this method, you need to de-solder R9 and R11 at the back panel of the LCD.

Por lo que he visto en internet, en la misma pagina donde saqué la información del desoldado  , en otros proyectos podremos seguir usando nuestro LCD en modo paralelo uniendo el pin PSD  a la salida 5V, tal y como se hacía con otros modelos anteriores de QC12864 . (5V+.conexión paralelo y a masa para serie). Quien tenga uno de los  modelos más antiguos no va a tener  que hacerles nada porque ya vienen sin el puenteo de estas resistencias.






También puede usarse en modo paralelo, por lo que se gana algo en velocidad, pero tan poca que no merece la pena sacrificar esos 8 pines ni el cableado, como ventaja no hay que desoldar nada, pero las conexiones que yo indico en el esquema  para paralelo no sirven y habrá que hacer otras, también utilizará 7 ó 8  pines más del arduino, de ahí la conveniencia de usar la conexión en serie.



Conexiones.


Para simular el sensor he representado un potenciómetro, el de arriba de la imagen. El de la parte inferior será de 10K y sirve para elegir el contraste adecuado.

La foto de los pines es la parte trasera del LCD, lo que queda abajo, entonces una vez apollada en el protoboard la parte de arriba corresponde con la derecha del esquema de conexiones y la de abajo con la izquierda.

 





El sketch
El programa está basado en la librería u8glib , que puede descargarse aquí y permite dibujar gráficos no sólo en el
QC12864, sino también en otros muchos modelos, tanto en conexión serie como paralelo.
Modificando el Delay del final el escanéo puede ser ralentizado.  La lectura que muestra es la que lee la entrada analógica, esto es entre 0 y 1024  que equivalen de  0 a 5V,



      https://www.youtube.com/watch?v=pQ-HUbdc4Cg
    #include "U8glib.h"
  

    U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7);  // For ST7920_128X64  serie - QC12864
    //     U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);  //For ST7920_128X64   paralelo
  
    float sensor=1025 ;
  
    byte x;
    float y[128];
    float y2;
    float ycal;
    byte punto;
  
    void draw(void) {
    
      // graphic commands to redraw the complete screen should be placed here
    
    u8g.drawFrame(0,0,128,56);
      u8g.setFont(u8g_font_04b_03);
      u8g.setFontPosTop();
    u8g.drawStr(0, 56, "Sensor:");
    u8g.setFontPosTop();
  
    // punto
  
for( punto = 1; punto <= 127; punto++ ) {
 
   ycal=55-54*y[punto]/1024;
   u8g.drawLine(punto-1,y2,punto,ycal);

 y2=ycal;
}
    // barra de nivel
  
    u8g.drawFrame(32,57,75,6);
    u8g.drawBox(33,58,74*(sensor/1024),4);
    u8g.setColorIndex(0);
    u8g.drawBox(33+74*(sensor/1024),58,73-74*(sensor/1024),4);
    u8g.setColorIndex(1);

  
    // Lectura en número    
  
     String s =  String(int( sensor)) ;
      
 u8g.setPrintPos(109, 56);
  u8g.print(s);

     }



    ////////////////////
  
    void setup(void) {

    
      // assign default color value
      if ( u8g.getMode() == U8G_MODE_R3G3B2 )
        u8g.setColorIndex(255);     // white
      else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
        u8g.setColorIndex(3);         // max intensity
      else if ( u8g.getMode() == U8G_MODE_BW )
        u8g.setColorIndex(1);         // pixel on
  
                 
    }
  
    void loop(void) {
      // picture loop
  
   u8g.firstPage(); 

   
         //u8g.prepare();
       
      sensor=analogRead(A0);
   
    //   Posición x


    for( x= 0; x <= 126; x++ ) {
    y[x]= y[x+1];
  
         }
       
    y[127]=(sensor);

/// Dibujar

      do {
        draw();
      } while( u8g.nextPage() );
 
  
     // delay(100);
    }

 

//    Aquí muestro un video del funcionamiento:



  

1 comentario:

Unknown dijo...

Hola, excelente entrada,visité la página en inglés porque tengo un arduino uno, y tengo una pregunta a ambos casos, puedo utilizar los pines de salida digital que quiera para comunicarme con la tarjeta o tienen que ser exactamente los que pone usted?. Gracias de antemano.