domingo, 15 de diciembre de 2013

Generador de frecuencia con Raspberry - PLL

Generador de frecuencia con Raspberry

PLL

xsetaseta@gmail.com

En este montaje aprovechamos el anterior montaje raspfm y modificamos el código fuente para generar una onda de una frecuencia entre 123KHZ y 125MHZ.
He quitado en el programa PIFM todo lo relativo a la modulación de FM y el código de DMA.
El programa pll3 está realizado en C de donde recibe un parámetro de frecuencia a generar. Si por el contrario queremos parar el generador deberemos figurar como parámetro 0.
SETA43 ->Frecuencia: 0.123000 Mhz  Divisor 16650406
SETA43 ->Frecuencia: 0.555000 Mhz  Divisor 3690090
SETA43 ->Frecuencia: 1.000000 Mhz  Divisor 2048000
SETA43 ->Frecuencia: 5.000000 Mhz  Divisor 409600
SETA43 ->Frecuencia: 10.000000 Mhz  Divisor 204800
SETA43 ->Frecuencia: 15.000000 Mhz  Divisor 136533
SETA43 ->Frecuencia: 12.000000 Mhz  Divisor 170667
SETA43 ->Frecuencia: 10.000000 Mhz  Divisor 204800
SETA43 ->Frecuencia: 20.000000 Mhz  Divisor 102400
SETA43 ->Frecuencia: 30.000000 Mhz  Divisor 68267
SETA43 ->Frecuencia: 40.000000 Mhz  Divisor 51200

Salida del programa pll3

Para crear un interface gráfico he utilizado el lenguaje python con la librería gráfica tkinter.
Tiene dos interfaces gráficos pll1.py  y pll2.py , se puede utilizar el que mas guste.


pll2.py

pll1.py









Como vemos en la imágenes, a frecuencia bajas la onda es cuadrada, y según aumentamos la frecuencia se va haciendo senoidal. Con un filtro paso altos  podríamos llegar a una forma de onda casi perfecta.
Con mi osciloscopio podemos ver la forma de la onda hasta un máximo de unos 20MHZ. Con el frecuencímetro  hecho por mi, podemos medir la frecuencia. Existe una desviación de frecuencia que puede ser debido al propio frecuencímetro  por no estar bien tarado.
En cualquier receptor de radio de AM, OC y FM  podemos sintonizar la frecuencia generada.
Deberemos tener cuidado de no pisar las emisoras comerciales, que aunque la potencia es baja podemos tapar la señal de algún vecino.

Archivos de programa

Ahora voy a intentar explicar en lo que pueda, un poco del programa pll3.c .
El BCM2835 es un integrado que además de contener un procesador ARM dispone de una serie de periféricos auxiliares como:
Timers, Interrupt controller, GPIO, USB, PCM / I2S, DMA controller, I2C master, I2C / SPI slave, SPI0, SPI1, SPI2, PWM, UART0, UART1.
Existe un manual BCM2835 ARM Peripherals que explica mas o menos todas las funciones del integrado. Es muy completo pero muy difícil de comprender.
Para utilizarlo como PLL debemos ir a la página 105 , punto 6.3 General Purpose GPIO Clocks.
Colocamos en la dirección CM_GP0CTL las distintas opciones
 struct GPCTL setupword = {6/*SRC*/, 1, 0, 0, 0, 1,0x5a};
Que significan:
Clock source =PLLD
ENAB=1
KILL=0
BUSY=0
FLIP=0
MASH=1
PASSWD=0x5a

Seleccionamos como fuente de reloj PLLD, y MASH control a 1 (equivalente a no MASH divisores).
Ahora establecemos el divisor para el PLL que se coloca en CM_GP0DIV. Variando el valor de este registro podemos variar la frecuencia generada en tiempo real, este es el metodo empleado para generar FM en el montaje de PIFM. Existe dos programas de PIFM, uno que maneja mediante el procesador la frecuencia y otro que utiliza DMA para no sobrecargar el procesador.
Para calcular el divisor que debemos poner en CM_GP0DIV, que genere una frecuencia concreta en el PLL utilizamos la formula:

centerFreqDivider = (int)((500.0 / centerFreq) * (float)(1<<12) + 0.5);


Como ejemplo para una frecuencia de 40.000000Mhz debemos colocar un divisor 51200.
Podéis ver que la formula se puede optimizar bastante, pero no he querido modificar la original para no despistar mucho. El numero 500 se debe a que el PLL se basa en un reloj de 500MHZ y (1<<12) significa 4096, por lo que una forma más rápida sería:

centerFreqDivider =2048000/centerFreq

Como podemos ver, es un tanto difícil de entender.
Después de ver los manuales del ATMEGA del arduino y ver los manuales del BCM2835, la comparación es abismal en favor de ATMEGA,  hecho de menos todas sus explicaciones y esquemas.

Saludos
Juan Galaz



Bibliografía:
http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter
https://github.com/Emerica/pifm/blob/master/pifm.c
https://github.com/Guzunty/Pi/blob/master/src/gzlib/src/gz_clk.c
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=72&t=17975

lunes, 25 de noviembre de 2013

Control de 17 salidas Raspberry - Domótica

Control de 17 salidas Raspberry

Domótica

xsetaseta@gmail.com

Esta es la continuación de mi artículo sobre el control de 17 salidas con la raspberry.
Aquí vamos a dar una utilidad práctica al montaje, para encender y apagar luces de un piso.
Mediante la pulsación sobre las diferentes partes del plano, se encienden o apagan las diferentes salidas de la raspberry. Aquí pondríamos los relés, que encenderían o apagarían las luces.
Para encender vía internet, solo lo podríamos realizar mediante un programa de acceso vía vnc, próximamente se hará mediante un navegador.
Programa funcionando




Vídeo de demostración

ARCHIVO PROGRAMA.
Crea un directorio y descomprime todos los ficheros en el directorio creado.
Se ejecuta con permisos de superusuario. sudo ./raspif

ARCHIVO LIBRERÍAS.
Si no tienes la librería instalada, deberás descomprimir el fichero librerias.tar.gz en /usr/local/lib .
Si quieres además compilar, he añadido el fichero include.tar.gz para que lo descomprimas en /usr/local/include los ficheros de cabeceras.
Recomiendo que visites https://projects.drogon.net/raspberry-pi/wiringpi/ y sigas la instrucciones para compilar e instalar las librerías.


Saludos
Juan Galaz



Bibliografía:

https://projects.drogon.net/raspberry-pi/wiringpi/

martes, 19 de noviembre de 2013

Control de 17 salidas Raspberry

Control de 17  salidas Raspberry

Librería WiringPi - SDL

 Raspberry Pi

xsetaseta@gmail.com

En el anterior montaje Control de 3 salidas Raspberry Pi había realizado la programación en lenguaje Python. En este montaje realizo el control de las 17 salidas de la raspberry en lenguaje C, utilizando la librería wiringPi, y el interface gráfico lo he realizado con la librería SDL.
A cada uno le gusta el lenguaje donde mas ha programado, y en mi caso es C. Este es el motivo de que haya buscado una librería en C para manejar las salidas de la raspberry, y encontré wiringPi. La librería wiringPi la ha realizado Gordons y se encuentra en su página https://projects.drogon.net/raspberry-pi/wiringpi/.
Para manejar las salidas de la raspberry ha simulado el manejo de entradas y salidas de arduino.

void pinMode (int pin, int mode);
para indicar si el pin es de entrada o salida (INPUT, OUTPUT)

void digitalWrite (int pin, int value); escribe un valor alto o bajo (HIGH or LOW)

En el programa lo primero que se hace es  inicializar la librería con  wiringPiSetup (); , y colocar todos los pin del GPIO como salida.

//___________Todos lo GPIO como salidas_____

    wiringPiSetup () ;
    for(z=0;z<17;z++)    pinMode (z, OUTPUT) ;

//________________




Correspondencia entre GPIO y pin.



Para que lea una especie de botones, utilizo una función que detecta zonas de imagen, que una vez activada mediante el ratón, se cambia la imagen del botón.


Imagen del programa funcionando.


Montaje eléctrico. Como prueba solo utilizo 3 pin.


FICHERO FUENTE


Saludos
Juan Galaz



Bibliografía:

https://projects.drogon.net/raspberry-pi/wiringpi/


lunes, 18 de noviembre de 2013

Control de salidas Arduino con Raspberry o PC

Control de salidas Arduino

con Raspberry o PC

 C - SDL

xsetaseta@gmail.com

En este montaje, realizó una comunicación entre la raspberry y el arduino mediante el cable USB.
Además de realizar la comunicación a través del cable usb, el arduino se alimenta de él.
Se basa en un anterior montaje aserie.html que activaba o desactivaba todas las salidas del arduino mediante un interface gráfica realizada en C y con la librería SDL.
Ahora he modificado un poco la programación de mi montaje para que funcione tanto en un PC con Linux como en la Raspberry. Este es mi primer programa para Raspberry que utiliza las librerías SDL.
Para que lea una especie de botones, utilizo una función que detecta zonas de imagen, que una vez activada mediante el ratón se cambia la imagen del botón. Es un sistema muy sencillo que como luego veremos en montajes posteriores, se puede utilizar para activar o desactivar partes de una imagen para encender un dispositivo.


Montaje eléctrico


Control desde el programa en la Raspberry

En el fichero adjunto veremos el programa para el PC y para la Raspberry. El programa en la Raspberry deberá funcionar sin problema en la distribución Raspbian, pero la versión para PC está compilada para Debian 7, para los que tengan otra versión de Linux, deberán compilar los códigos fuentes.

FICHERO FUENTE


Un Saludo
Juan Galaz

jueves, 17 de octubre de 2013

Control de salidas Raspberry - Arduino -Python

Control de salidas

Raspberry - Arduino -Python

 Raspberry Pi

xsetaseta@gmail.com

En este montaje realizó una comunicación entre la raspberry y el arduino mediante el cable USB.
Además de realizar la comunicación a través del cable usb, el arduino se alimenta de él.
Se basa en un anterior montaje aserie.html que activaba o desactivaba todas las salidas del arduino mediante un interface gráfica realizada en C y con la librería SDL.
En este caso hacemos lo mismo pero programando en python y con la librería tk.
Como realmente la raspberry es un ordenador con linux como sistema operativo, la realización se efectúa en el PC con debian por cuestión de velocidad, y luego se pasa a la raspberry donde funciona perfectamente.
El programa de arduino consiste en que se lee constantemente el puerto serie. Cuando se recibe una orden "1Dig13" el arduino interpreta que tiene que poner a 5V la salida de arduino Digital13. Si recibe la orden "0Dig13" el arduino pone la salida Digital13 a 0V.
Para mandar las ordenes al arduino se puede utilizar la consola del programador de arduino o cualquier otro programa de comunicaciones como por ejemplo CuteCom o minicom en  Linux.
void WriteComand()
{
  
   
    if(!strcmp(entrada,"0An0"))
      {
       digitalWrite(14, LOW);
       goto salir1;
      }
    if(!strcmp(entrada,"1An0"))
      {
      digitalWrite(14, HIGH);
       goto salir1;
      }
    
    if(!strcmp(entrada,"0An1"))
      {
      digitalWrite(15, LOW);
       goto salir1;
      }
    if(!strcmp(entrada,"1An1"))
      {
      digitalWrite(15, HIGH);
       goto salir1;
      }
................
Ejemplo de como interpreta el arduino las ordenes a través del interface serie.


def fAn0():
                global An0
                if An0  ==  0:
                        An0=1
                        ser.write('1An0\n')
                else:
                        An0=0
                        ser.write('0An0\n')
                print  "An0",An0                
                return

def fAn0():
                global An0
                if An0  ==  0:
                        An0=1
                        ser.write('1An0\n')
                else:
                        An0=0
                        ser.write('0An0\n')
                print  "An0",An0                
                return
Ejemplo de como manda la raspberry las ordenes a través de interface serie.


El programa funcionando en la rapberry.


Circuito montado y funcionando.

Nos puede surgir algun problema como este:

Traceback (most recent call last):

  File "./raArPy.py", line 5, in <module>
    import serial
ImportError: No module named serial

Significa que no tenemos instalado el modulo serie, se instala con la orden:

sudo apt-get install python-serial

Otro problema que puede surgir es que no tengamos permisos para escribir el los puertos serie, /dev/ttyACMx/dev/ttyUSBx , depende del modelo de arduino que tengamos . Para solucionarlo, debemos dar permisos al usuario que ejecuta el programa con la orden :

adduser usuario dialout

Arreglado estos problemas, ya solo nos queda ejecutar el programa ./raArPy.py .

Archivos del montaje

Un saludo
Juan Galaz

Bibliografía:

http://www.safecreative.org/work/1207302042960-curso-python-para-principiantes
http://docs.python.org/2/contents.html
http://gmendezm.blogspot.com.es/2012/12/tutorial-tkinter-python-gui.html

sábado, 12 de octubre de 2013

Receptor ADS-B con Raspberry - dump1090

Página principal

Receptor ADS-B con Raspberry - dump1090

 Raspberry Pi

xsetaseta@gmail.com

En un artículo anterior había realizado un receptor de ADS-B con linux. Como la raspberry pi es un mini ordenador, con linux de sistema operativo, me he dispuesto a realizar el montaje en la raspberry.
Lo primero es bajar y compilar los programas:

    git clone http://git.osmocom.org/rtl-sdr
    cd rtl-sdr/
    mkdir build
    cd build
    cmake ../ -DINSTALL_UDEV_RULES=ON
    make
    sudo make install
    sudo ldconfig

Con esto hemos compilado las librerías rtl-sdr necesarias.
Ahora debemos bajar y compilar el programa dump1090.

    git clone https://github.com/antirez/dump1090
    cd dump1090/
    make

Ya tenemos todo listo para que funcione.
Conectamos el receptor de TDT-USB  RTL2832U y ejecutamos la orden:

./dump1090 --interactive --net --metric

Para ver los aviones en un mapa, abrimos la dirección:
http://Dirección_IP_raspberry:8080/



Vista de los aviones en la raspberry.
El renderizado en la raspberry es bastante lenta.



Vista de los aviones desde el PC, es muy rápido la presentación de los aviones.



TDT-USB  RTL2832U utilizado. Debido al consumo del TDT he tenido que utilizar un alimentador de mas amperios para la raspberry.

Saludos.
Juan Galaz


Bibliografía:
http://www.stackspace.info/category/raspberry/#Accessing_Hardware
http://www.satsignal.eu/raspberry-pi/dump1090.html


lunes, 7 de octubre de 2013

Transmisor de FM con el Raspberry Pi

Página principal

Transmisor de FM con el Raspberry Pi

xsetaseta@gmail.com

Buscando en internet algún montaje fácil para hacer en Raspberry Pi,  encontré un transmisor de FM.
http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter
 Al principio me parecía un poco difícil que pudiera hacer esto por si solo, por lo que me puse a bajar el programa  y ponerlo a funcionar.
Se baja el programa de la misma ṕagina y se compila con la orden:

gcc -lm -std=c99 pifm.c


Ahora tecleamos:

 ./pifm sound.wav 103.0

Donde sound.wav es el archivo de sonido codificado en mono y con un muestreo de 22Khz.
Por defecto la frecuencia de transmisión es de 103.3Mhz, pero si se quiere cambiar la tenemos que especificar al final de la línea.


Debemos colocar un pequeño cable al pin GPIO 4, a modo de antena, para que la señal llegue mas lejos.


El resultado ha sido perfecto, en mi radio la música suena bastante bien, y la señal llega por toda la casa.



Según lo expuesto en el artículo se utiliza un sintetizador PLLD integrado el el própio chip, con un cristal a 500MHZ el cual se puede programar desde 1 Mhz hasta 250Mhz. Esto puede ser muy útil para otros montajes,


Saludos
Juan Galaz

Bibliografía:

http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter

jueves, 26 de septiembre de 2013

Registro de humedad y temperatura con gráfico - DHT11 - Raspberry Pi


Página principal

Registro de humedad y temperatura con gráfico - DHT11

Raspberry Pi

xsetaseta@gmail.com

Buscando en internet algún montaje para hacer en Raspberry Pi, encontré  en la página
http://www.davidfraj.com/2013/04/crear-una-estacion-meteorologica-con.html , que es la creación de
Crear una estacion meteorologica con raspberry pi y un sensor dth11archivo.pdf
Como tengo todos los componentes incluido el DTH11, me he puesto a realizar el montaje propuesto.
He de comentar que existe diferentes páginas web donde comentan este montaje, no sé exactamente cual es la original, cada una tiene una cosa que la otra no tiene, pero en la que me he basado es en la que he comentado anteriormente.
http://chrisbaume.wordpress.com/author/chrisbaume/
http://www.rpiblog.com/2012/11/interfacing-temperature-and-humidity.html


Conexionado.
RPi VCC (pin 1) -> DHT11 pin 1
RPi GPIO4 (pin 7) -> DHT11 pin 2
RPi GND (pin 6) -> DHT11 pin 4

Imagen copiada de la página web.

En mi caso he colocado una resistencia de 10k.



Montaje eléctrico.

Todo el proyecto lo he realizado en un directorio creado en el directorio raiz llamado /aa , por lo cual todas la referencias se hacen a este directorio. Si alguno quiere cambiar el lugar del directorio, debera también modificar en el resto de programas la referencia a este directorio.

Este proyecto es una mezcla de varios tipos de programación.
En principio utiliza la librería wiringpi para manejar las entradas y salidas del Raspberry  mediante el lenguaje C . Recomiendo ver la página  https://projects.drogon.net/raspberry-pi/wiringpi/ donde te explica muchos proyectos para Raspberry  utilizando C. Gracias Gordons.
Para instalar la librería tecleamos en la consola:

cd /aa
sudo apt-get install git-core build-essential

git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

Una vez instalada la librería, creamos un fichero llamado dth11.c en el directorio wiringPi y lo compilamos con la siguiente orden.

gcc -o dth11 dth11.c -L /usr/local/lib -l wiringPi

Una vez que se obtiene el fichero ejecutable ./dth11 , lo copiamos en el directorio de trabajo /aa .
Si ejecutamos el comando ./dth11 obtendremos la temperatura y la humedad.


dth11.c
//Incluimos librerias necesarias
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

//Definimos constantes
#define MAX_TIME 85
#define DHT11PIN 7
#define ATTEMPTS 5

//Definimos un vector global
int dht11_val[5]={0,0,0,0,0};

/////////////////////////////////////////////////////////////
//Funcion principal para leer los valores del sensor.
int dht11_read_val(){
 uint8_t lststate=HIGH;
 uint8_t counter=0;
 uint8_t j=0,i;
 for(i=0;i<5;i++){
  dht11_val[i]=0;
 }
 pinMode(DHT11PIN,OUTPUT);
 digitalWrite(DHT11PIN,LOW);
 delay(18);
 digitalWrite(DHT11PIN,HIGH);
 delayMicroseconds(40);
 pinMode(DHT11PIN,INPUT);
 for(i=0;i<MAX_TIME;i++){
  counter=0;
  while(digitalRead(DHT11PIN)==lststate){
   counter++;
   delayMicroseconds(1);
   if(counter==255){
    break;
   }
  }
  lststate=digitalRead(DHT11PIN);
  if(counter==255){
   break;
  }
  //Las 3 primeras transiciones son ignoradas
  if((i>=4)&&(i%2==0))
    {
        dht11_val[j/8]<<=1;
        if(counter>16)  dht11_val[j/8]|=1;
        j++;
      }
 }
 
 // Hacemos una suma de comprobacion para ver si el dato es correcto. Si es asi, lo mostramos
 if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF)))
    {
       //printf("%d.%d,%d.%d\n",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3]);
    //printf("data -> %02x, %02x, %02x, %02x  paridad %d\n",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3],dht11_val[4]);
    //printf("Temperatura=%d ºC /10   Humedad=%d /10\n",dht11_val[2]*256+dht11_val[3],dht11_val[0]*256+dht11_val[1]);
    printf("%d,%d\n",dht11_val[0]*256+dht11_val[1],dht11_val[2]*256+dht11_val[3]);
       return 1;
    }
     else
    {
     //printf("Error\n");
       return 0;
     }
}

////////////////////////////////////////////////////////////////
//Empieza nuestro programa principal.
int main(void){
 //Establecemos el numero de intentos que vamos a realizar
 //la constante ATTEMPTS esta definida arriba
 int attempts=ATTEMPTS;

 //Si la libreria wiringPi, ve el GPIO no esta listo, salimos de la aplicacion
 if(wiringPiSetup()==-1){
  exit(1);
 }

 while(attempts){
  //Intentamos leer el valor del gpio, llamando a la funcion
  int success = dht11_read_val();
 
  //Si leemos con exito, salimos del while, y se acaba el programa
  if (success){
   break;
  }
 
  //Si no lee con exito, restamos 1, al numero de intentos
  attempts--;
 
  //Esperamos medio segundo antes del siguiente intento.
  delay(500);
 }
 return 0;
}



Mediante el comando cron creamos un script que se ejecute cada x tiempo, está realizado en Bash, y el resultado se almacena en /var/www/tempe.csv  . Para quitar todos los datos registrados borrar el contenido de tempe.csv menos la primera línea, que contiene el título de la serie de registros.
dth11.sh
#!/bin/bash
FECHA=$(date +\%Y\%m\%d\%H\%M)
COMA=","
TEMP=$(/aa/dth11)
echo "$FECHA$COMA$TEMP" >> /var/www/tempe.csv

Debemos dar permisos de ejecución a dth11.sh.

Ejemplo de tempe.csv .Para borrar el registro, quitar todo menos la primera línea.
Date,Humedad,Temperatura
201309241218,62.2,39.4
201309241219,60.2,44.1
201309241220,55,45
201309241221,54,40
201309241222,54,1
201309241223,54,-10
201309241224,54,-15

Para que ejecute cada minuto un registro de temperatura, editamos las tarea periódica a ejecutar mediante el comando, sudo crontab -e .
Y añadimos
* * * * * /aa/dth11.sh
El servidor apache sirve la página tempe.html , en la cual existe un código en javascript que realiza una grafica. Para realizar la gráfica se utiliza la librería dygraph-combined.js en javascript . Para más información recomiendo visitar la página http://dygraphs.com/index.html . Nunca había realizado nada en javascript por lo que me he tenido que poner las pilas y estudiar algún tutorial.

tempe.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    <script type="text/javascript" src="dygraph-combined.js"></script>
  </head>
  <body>
    <h1><a href="index.html"><small><span style="font-weight: bold;
            color: rgb(0, 102, 0);">Volver</span></small></a></h1>
    <h1>Gr&aacute;fica con humedad y temperatura<br>
    </h1>
    <big><big><span style="font-weight: bold; color: rgb(0, 102, 0);"></span></big></big>
    <hr>
    <div id="normal" style="width:600px; height:300px;"></div>
    <span style="color: rgb(153, 0, 0); font-weight: bold;">Formato -
      Hora:minutos&nbsp;&nbsp;
      D&iacute;a/mes</span>
    <hr>
    <script type="text/javascript">


g4 = new Dygraph(
    document.getElementById("normal"),
    "tempe.csv",
    {
        title: 'Grafico Humedad-Temperatura',
        xlabel: ' ',
        ylabel: 'Humedad  -  Temperatura',
        labelsDivWidth: 150,
        labelsSeparateLines: true,

         axes: {
                    x: {
                   
                     axisLabelFormatter:
                         function(x)
                              {
                                var anyString=x.toString();
                                return (anyString.substring(8,10) + ":" + anyString.substring(10,12) + ".\n"+anyString.substring(6,8)+"/"+anyString.substring(4,6) );               
                              },                   
                           }

                },
    }
  );


</script>
  </body>
</html>



Si abrimos en un ordenador la página http://direcciónIPraspberry/tempe.html obtenemos el registro con la gráfica de la temperatura.



Quizás en la página de esté mejor explicado todo el proceso, pero yo he corregido algunos errores que tenía, modificando a mi gusto el javascript y el código C.

Saludos.
Juan Galaz


Bibliografía:

http://www.davidfraj.com/2013/04/crear-una-estacion-meteorologica-con.html
http://chrisbaume.wordpress.com/author/chrisbaume/
http://dygraphs.com/index.html
http://www.rpiblog.com/2012/11/interfacing-temperature-and-humidity.html
https://projects.drogon.net/raspberry-pi/wiringpi/