domingo, 29 de noviembre de 2015

Monitoreo sensor de distancia con Qc12864-B

   SKETCH



    #include "U8glib.h"
   

    U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7); // CONEXION SERIE
 
   
  
    float sensor=1025 ;
   
    byte x;
    float y[128];
    byte punto;
    long distancia;
long tiempo;
   
    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, "Distanc:");
    u8g.setFontPosTop();
   
    // punto
   
for( punto = 1; punto <= 127; punto++ ) {
  
   u8g.drawPixel(punto,55-54*y[punto]/1024);


}
    // 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);
    //u8g.drawFrame(32,57,75,6);
   
    //leyenda
     
   
     String s =  String(int( distancia)) ;
       
 u8g.setPrintPos(109, 56);
  u8g.print(s);
 //  u8g.drawStr(109, 56, s);
     }
   
    void setup(void) {
 //      Serial.begin(9600);

pinMode(9, OUTPUT); /*activación del pin 9 como salida: para el pulso ultrasónico*/
  pinMode(8, INPUT); /*activación del pin 8 como entrada: tiempo del rebote del ultrasonido*/
         
                  
    }
   
    void loop(void) {
      // picture loop
   
   u8g.firstPage();  

       digitalWrite(9,LOW); /* Estabilización del sensor*/
  delayMicroseconds(5);
  digitalWrite(9, HIGH); /* envío del pulso */
  delayMicroseconds(10);
  tiempo=pulseIn(8, HIGH);
  distancia= int(0.017*tiempo);
     
   
      sensor=1024*distancia/338;
    
    // 
    x= x+1;
    if (x>=126) {
     x=1;
     }
    y[x]=(sensor);

   
    for( punto = 1; punto <= 127; punto++ ) {

    }
    //  // rebuild the picture after some delay
      do {
        draw();
      } while( u8g.nextPage() );
   
   
     
   
   
     // delay(100);
    }




CONEXIONES:
IMPORTANTE: Para conectar en serie con el arduino y no quemar nada tube que desoldar dos resistencias como indico aquí. No hay que hacelo con todos los LCD, pero con mi modelo de lcd de no hacerlo se puede quemar.


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);
    }