martes, 13 de mayo de 2014

Arduino Reloj con medidor de temperatura y humedad externa. 433MHz - MX-05V

Página principal


Arduino
Reloj con medidor de temperatura y humedad externa.
433MHz - MX-05V

xsetaseta@gmail.com

Con los dos montajes anteriores, ya podemos montar un reloj con visualizador de temperatura y humedad externa.
Reloj con Nokia 3310 . http://seta43.duckdns.org/arnok.html
Receptor temperatura y humedad.   http://seta43.duckdns.org/ardurx.html


Esquema del circuito y su simulación


Montaje del circuito en placa Board.

En este montaje no he tenido en cuenta el consumo del circuito, si se quiere reducir deberíamos  sacar el micro de la placa arduino, y hacer alguna modificación del programa.
Como no quiero que utilicen este trabajo para presentarlo como propio, no he ajustado mucho el programa, dejo al que quiera que lo mejore a su gusto.
Se puede mejorar mucho, detección de falta de señal, temperaturas máximas y mínimas, alarmas, detección de identificación del transmisor, etc...
En el transmisor se puede aumentar  la potencia, alimentando el emisor con una tensión mayor en el modulo transmisor mediante dobladores de tensión.
También se puede eliminar el cristal y los condensadores en el transmisor, al utilizar el oscilador interno de 8 MHz.

PROGRAMA

Hasta pronto.
JUAN GALAZ

Bibliografía:
 http://playground.arduino.cc/Main/DS1302
 http://playground.arduino.cc/Code/PCD8544
 http://www.microsyl.com/index.php/2010/03/24/nokia-lcd-library/
http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
http://seta43.duckdns.org/ardurab.html
http://playground.arduino.cc/Main/DHTLib
http://www.pjrc.com/teensy/td_libs_VirtualWire.html



miércoles, 7 de mayo de 2014

Arduino-Receptor temperatura y humedad 433MHz - MX-05V

Página principal


Arduino
Receptor temperatura y humedad
433MHz - MX-05V

xsetaseta@gmail.com

Esta es la segunda parte del montaje en el arduino para transmitir temperatura y humedad mediante radio en la frecuencia de 433MHz.


Circuito receptor MX-05V.



Esquema MX-05V.



Conexión en el arduino.

Programa
//-------------
// SETA43
// 07/05/2014
//-------------
//
//Receptor
//

#include <VirtualWire.h>
const int RX_DIO_Pin = 2;


 float h,humedad,temperatura;
 int dato1,dato2;
 byte indice;

void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
/* Initialises the DIO pin used to receive data from the Rx module */
vw_set_rx_pin(RX_DIO_Pin);
/* Receive at 2000 bits per second */
vw_setup(2000);
/* Enable the receiver */
vw_rx_start();
}

/* Main program */
void loop()
{
uint8_t Buffer_Size = 2;
unsigned int Data;
int Data1;
uint8_t RxBuffer[Buffer_Size];


if (vw_get_message(RxBuffer, &Buffer_Size)) // Non-blocking
  {
    digitalWrite(13, HIGH);
    Data = RxBuffer[0] << 8 | RxBuffer[1];
    h=Data; h=h/100;
    if(h==333.33)
        {
         indice=0;
         Serial.print("Humedad: ");
         Serial.print(humedad);
         Serial.print(" % ");
         Serial.print("Temperatura: ");
         Serial.print(temperatura);
         Serial.print(" C ");
         Serial.print(dato1);
         Serial.print(" ");
         Serial.println(dato2);
        }
      else
        {
          indice++;
          if(indice==1) humedad=h;
          if(indice==2)
             {
               if (Data>=35000)
                {
                  Data1=Data-65536;
                  h=Data1;
                }
                else
                {
                 h=Data; 
                }                
              h=h/100;   temperatura=h; 
             }
          if(indice==3) dato1=Data;
          if(indice==4) dato2=Data;
        }
    digitalWrite(13, LOW);
  }
}


En el programa se reciben 5 datos.
El primero es 33333, es un numero de sincronización de la recepción.
El segundo es la humedad, multiplicada por 100, esto es para que sean enteros de 2 bytes.
El tercero es la temperatura, multiplicada por 100, esto es para que sean enteros de 2 bytes.
El cuarto es 222, este numero se lo he puesto a modo de seguridad. Debido a que puede recibir señales de múltiplos transmisores, se debe identificar con un numero de identificación único. Para simplificar el programa, no he utilizado la identificación por numero.
El quito es un numero consecutivo del 0 al 100.



Salida del puerto serie.



Hasta pronto.
JUAN GALAZ

Bibliografía:
http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
http://seta43.duckdns.org/ardurab.html
http://playground.arduino.cc/Main/DHTLib
http://www.pjrc.com/teensy/td_libs_VirtualWire.html

martes, 6 de mayo de 2014

Arduino-Transmisor temperatura y humedad 433MHz -mx-fs-03v

Página principal


Arduino
Transmisor temperatura y humedad
433MHz - mx-fs-03v
xsetaseta@gmail.com

Navegando por la red,http://www.hobbycomponents.com/, encontré un kit de transmisión y recepción para el arduino en la frecuencia de 433MHz.
Es sencillo de programar y se puede obtener por menos de 2€.
Dicho y hecho, lo pedí y en menos de 15 días lo tenía en casa.
El montaje lo he separado en dos artículos, transmisor y receptor, en este primer montaje voy a explicar como he hecho el transmisor.


Kit transmisor
Esquema del transmisor


Esquema del montaje en la placa arduino.


Esquema del montaje en el ATMEGA328.

Para poder medir el consumo del circuito por partes y quitar el consumo de los componentes de la placa arduino, he sacado el Atmega en un modulo board. También he añadido un conversor USM->rs232 para poder programar el microcontrolador.


Montaje del circuito.

Para entender este circuito conviene ver mis dos anteriores artículos:
Reduciendo consumo.Parte 2. Reloj - DS1302. ardurab
Reduciendo consumo.Parte 1. Reloj - DS1302. arduraa

El consumo total del circuito quitado el adaptador usb-to-TTL es de 0.08 mA a 4.2V.
Cuando transmite el circuito consume 15mA ,el tiempo de transmisión dura aproximadamente 1 segundo.
Mediante un interruptor podemos indicarle al circuito que transmita cada  1 segundo o cada 60 segundos.
Una pila AA pude tener una capacidad entre 1100mAh(Zinc–carbono)
y 2900mAh (NiMH).
Si hacemos cálculos con un consumo de 15mA cada 60 segundos, con una pila de 1100mAh , tendremos para aproximadamente 4400 horas, 183 días.
Si utilizaríamos pilas alcalinas con poca autodescarga y cambiaríamos el programa para que transmitiera cada mas tiempo, duraría años el circuito transmitiendo.


Todo esto es bastante teórico, las baterías se autodescargan con el tiempo.

Programa
//-------------
// SETA43
// 06/05/2014
//-------------

#include <avr/io.h>
#include <avr/interrupt.h>

#include <avr/sleep.h>

#include <Wire.h>
#include <VirtualWire.h>
#include "DHT.h"

#define DHTPIN 3     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

unsigned int ih,it;
int sensorValue1, sensorValue2;

DHT dht(DHTPIN, DHTTYPE);

const int TX_DIO_Pin = 2;

int z,contador;

void setup() {
  
  pinMode(13, OUTPUT);
  pinMode(12, INPUT);

  vw_set_tx_pin(TX_DIO_Pin);
  vw_set_ptt_inverted(true);
  vw_setup(2000);

  Serial.begin(9600);
  Serial.println("DHTxx test!");
 
  dht.begin();
  
  watchdogOn(); // Turn on the watch dog timer.
  //Desactiva conversor A/D
  ADCSRA = ADCSRA & B01111111;
  ACSR = B10000000;
 
  contador=0;
}

void loop() {
 unsigned int Data;
 byte TxBuffer[2];
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();


  if (isnan(t) || isnan(h))
    {
    Serial.println("Failed to read from DHT");
    }
  else
    {
    
    ih=h*100;
    it=t*100;
 
    sensorValue1=222;
    sensorValue2=contador;
    
    digitalWrite(13, HIGH);
    
    TxBuffer[0] = 33333 >> 8;
    TxBuffer[1] = 33333;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = ih >> 8;
    TxBuffer[1] = ih;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = it >> 8;
    TxBuffer[1] = it;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = sensorValue1 >> 8;
    TxBuffer[1] = sensorValue1;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = sensorValue2 >> 8;
    TxBuffer[1] = sensorValue2;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
        
    Serial.print(ih); Serial.print(" %  ");
    Serial.print(it); Serial.print(" C  ");
    Serial.println(contador);  
    
    delay(500);
    digitalWrite(13, LOW);
    
    for(z=0;z<60 && HIGH==digitalRead(12) ;z++)goToSleep();
    contador++;
    if(contador>100) contador=0;
    delay(100);

    digitalWrite(13, HIGH);

    }
  
}

void goToSleep()   
{    
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode.
  sleep_enable(); // Enable sleep mode.
  sleep_mode(); // Enter sleep mode.
  sleep_disable(); // Disable sleep mode after waking.                     
}

void watchdogOn()
{
  //Fuente http://www.fiz-ix.com/2012/11/low-power-arduino-using-the-watchdog-timer/
  // Clear the reset flag, the WDRF bit (bit 3) of MCUSR.
  MCUSR = MCUSR & B11110111;
  WDTCSR = WDTCSR | B00011000;
  //WDTCSR = B00000101; //0.5S
  WDTCSR = B00000110; //1S
  //WDTCSR = B00100001; //8S

  // Enable the watchdog timer interupt.
  WDTCSR = WDTCSR | B01000000;
  MCUSR = MCUSR & B11110111;
}


ISR(WDT_vect)
{
  //No hace nada
  
}



Hasta pronto.
JUAN GALAZ

Bibliografía:
http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
http://seta43.duckdns.org/ardurab.html
http://playground.arduino.cc/Main/DHTLib
http://www.pjrc.com/teensy/td_libs_VirtualWire.html

lunes, 14 de abril de 2014

Arduino Reloj con Nokia 3310

Página principal


Arduino
Reloj con Nokia 3310
xsetaseta@gmail.com

Recién adquirido un LCD 3310, que llevaban los modelos de Nokia, me he dispuesto a pasar los montajes de relojes que hice con un lcd de 16x2, artime.html , arduds.html ,  al LCD 3310.
Existen una librerías: Adafruit_GFX y  Adafruit_PCD8544 para manejar el LCD, pero tienen un problema, no funcionan con versión 1.0.5, que es la que tengo instalada, por lo que he utilizado otra forma. En la página oficial de arduino existe un ejemplo, http://playground.arduino.cc/Code/PCD8544 , el cual le he adaptado a mi programa.
Como podemos observar en las características del LCD 3310, debe funcionar a 3.3V, y las salidas del arduino funcionan a 5V. He visto varios montajes utilizando resistencias, pero  en uno  decía que el LCD podía funcionar a 5V, pero el Led de iluminación solo se podía poner a 3.3V, y eso es lo que he hecho. A pesar de lo que dice el fabricante funciona a 5V, no se por cuanto tiempo. Hemos de pensar que el ATMega328 funciona perfectamente a 3V, por lo cual podemos alimentar todo el conjunto con baterías de 3V.

Programa


Datos técnicos del LCD.



Esquema reloj simple mediante interrupciones.


Montaje
reloj simple mediante interrupciones.


Esquema de reloj mediante DS1302


Montaje
de reloj mediante DS1302



Los dos modos que tiene de tamaño de hora.

He hecho una modificación en el montaje con el DS1302 , para poderlo desbloquear la primera vez que se pone en marcha. Manteniendo pulsados a la vez los dos pulsadores mientras se resetea o se inicia, se desbloquea el
DS1302 , poniendo una fecha determinada.


Hasta pronto.
JUAN GALAZ

Bibliografía:
 http://playground.arduino.cc/Main/DS1302
 http://playground.arduino.cc/Code/PCD8544
 http://www.microsyl.com/index.php/2010/03/24/nokia-lcd-library/
 http://seta43.duckdns.org/electro.html


jueves, 3 de abril de 2014

Viejos montajes Grabador de EPROM - Puerto paralelo LPT1

Página principal

Viejos montajes
Grabador de EPROM
Puerto paralelo LPT1
xsetaseta@gmail.com

 http://seta43.duckdns.org/graba.html
Removiendo papeles en la estantería, he encontrado un viejo montaje de un grabador de memorias EPROM. Este es un montaje desarrollado enteramente por mi, es una utilidad a un anterior circuito,  CONTROLADOR DE 8255 MEDIANTE PUERTO PARALELO, STANDARD O BIDIRECCIONAL, port.htm.
A finales de los años 80 realice un montaje para el Spectrum que venía en un revista, pedí la placa por correo, y lo monté, en algún cajon aún existe, en aquel tiempo me sirvió para hacer montajes con el Z80.
El borrado era mediante rayos ultravioletas, también me compre un tubo de rayos ultravioletas. Los rayos ultravioletas se utilizan en algunas peluquerías para matar bichos, y son peligrosos si se miran directamente, puedes perder vista.
Ya con los años las memorias EPROM que tenían diferentes voltajes de programación, se fueron sustituyendo por las EEPROM que se podían borrar eléctricamente, ya no hacía falta la pequeña ventanilla para borrarlos mediante (UV).
Pero eso es otra historía, el montaje se quedo en programador EPROM, con visos de hacer un programador de EEPROM.
Realice varios programas en Turbo C, para las diferentes modelos de EPROM 2K, 4K, 8K, etc...
Existen muchos tipos de EPROM, para programar un tipo de memoria debemos mirar la hoja del fabricando y ajustar el voltaje de programación.

Aquí muestro todos los planos, imágenes y programas.

Programas

Pulsar para zoom.
Grabador montado con alguna modificación.

.
Pulsar para zoom.
Esquema

.
Pulsar para zoom.
Segundo prototipo

.
Pulsar para zoom.
Primer prototipo

.
Pulsar para zoom.
Tipos de memoria


Saludos
Juan Galaz



lunes, 17 de marzo de 2014

Frecuencímetro 16f648. Interface serie-usb. Programación Basic.

Página principal

Frecuencímetro 16f648.

Interface serie-usb.

Programación Basic.

xsetaseta@gmail.com

Estamos otra vez aquí con otro frecuencímetro, este es una continuación del frecupl2.html, esta vez la visualización se realiza en el PC.
El 16F648 se configura como un medidor de frecuencia con autorango, y la medida se manda a través de un interface serie-usb, donde en el PC se visualiza la frecuencia.
La diferencia entre el montaje original y este, aparte de la eliminación del LCD y la eliminación del pulsador de cambio de escala, es la utilización de un cristal de 16MHz. La alimentación de 5V la toma del  propio USB, con lo cual solo es pinchar y usar.
Para las diferentes pruebas he utilizado como medida el propio reloj del PIC a 16MHz.
La programación esta hecha en C mediante el compilador CCS. Se utiliza la emulación por software de la interface serie.
En principio la programación en el lado del PIC no fue difícil se hizo relativamente rápido. Para la visualización se utilizó en un principio un terminal de serie como el cutecom en linux. El funcionamiento era correcto pero poco vistoso, por lo que decidí hacer un programa especifico. Aquí tuve la disyuntiva de hacerlo en C que era lo lógico, o retornar al pasado, y volver mis inicios en la programación, el Basic.
Navegando por la red encontré la página http://basic.mindteq.com donde  hace una recopilación de los diferentes interpretes y compiladores de Basic que existen.
Probando uno y probando otro he realizado varios programas de visualización de frecuencia con diferentes compiladores de Basic. Por lo que este montaje se a convertido en un ejercicio de programación Basic.


Esquema del circuito y su simulación



Montaje del circuito en placa Board.



Adaptador Serie-Usb.  En mi caso es un PL2303 Serial Port.
En windows hace falta drivers, linux ya los tiene.

Programa del PIC


Programación en Basic

El primer basic que probé fue el Freebasic  , es un programa que compila programas hechos en Basic, Puede tener un alto nivel de compatibilidad con QuickBASIC. Existen versiones para Windows y Linux y está bastante bien documentado y extendido. He realizado dos programas uno para consola y otro con interface gtk.

Programa en Freebasic consola.


Programa en Freebasic gtk.

Rapidq
Es un buen programa de compilación de basic, existe versiones para Windows y Linux, en este caso el programa lo he hecho para Windows. Es muy fácil de utilizar con entorno ide.

Programa en Rapidq para windows.

Purebasic
Es el único programa propietario usado, tiene versiones para diferentes plataformas.
Te permite usarlo gratis para un numero bajo de líneas de programa, suficiente para nuestro propósito.
Completo y fácil de usar.


Gambas_3
Es un entorno de desarrollo de basic, muy completo, bastante parecido a Vbasic, muy bueno, para hacer programas de todo tipo, bases de datos, juegos, etc... El único pero,  es que debes tener instalado las librerías para su funcionamiento, y que de unas versiones a otras debes de recopilar los programas.


Todos los programas en basic



Saludos
SETA43

Juan Galaz


Bibliografía:

http://basic.mindteq.com
Freebasic 
http://gambas.sourceforge.net/en/main.html
http://rapidq.phatcode.net/download/
http://www.purebasic.com/



sábado, 1 de febrero de 2014

Arduino reproductor de voz mediante tarjeta SD - Interface LCD

Página principal

Arduino reproductor de voz mediante tarjeta SD

Interface LCD

wav - 8bits -11KHz

xsetaseta@gmail.com

Continuando con mi anterior montaje  Arduino reproductor de voz mediante SD, ahora realizo un interface mediante 2 botones, un potenciómetro y un LCD.
La elección del potenciómetro para seleccionar las canciones es un motivo práctico, de fácil realización y sencillo.
Mediante el potenciómetro seleccionamos las canciones que deben estar creadas en la SD como números del 0 al 63 y con la extensión wav , ejemplo: 1.wav . Para su reproducción pulsamos el botón PLAY y para parar el botón STOP.
Las canciones tienen que estar en formato wav, mono , resolución 8bits y con una frecuencia de 11KHz.
En este formato cada minuto ocupa 0.65M, con lo cual con una tarjeta de 4G  tendremos 6153 minutos, unas 102 horas.
La tasa de frecuencia de muestreo de 11KHz es suficiente para la reproducción de voz .

Esquema del circuito.


Montaje del circuito.

Vídeo del funcionamiento



Muestra de una señal de 500Hz.


//SETA43
//xsetaseta@gmail.com
//arduvoc  Reproductor de audio con arduino
//01/02/2014


#include <LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

int sensorValue ;
int oldsensorValue=-1;

#include <SD.h>
File dataFile;

String inputString = ""; 
char fileplay[20] ;
boolean stringComplete = false; 

byte valor;
byte bufer0[100];
byte bufer1[100];
int din=0;
int dout=0;
byte nf=0;
byte vacio=1;
byte fin=1;

byte e1Pin=18;
byte e2Pin=19;

void setup()
{
  lcd.begin(16, 2);
  pinMode(9, OUTPUT); //Salida audio

 // pinMode(4, OUTPUT);    // si utilizamos la salida 4 como CS de la tarjeta SD
 // if(!SD.begin(4)){    // 
   pinMode(10, OUTPUT);    // si utilizamos la salida 4 como CS de la tarjeta SD
  if(!SD.begin(10))
  {
    lcd.print("ERROR Tarjeta ");    // Texto informativo
    return;
  }
  else
  {
    lcd.print("Tarjeta OK ");    // Texto informativo
  }   
  delay(900);
  lcd.clear();
  lcd.print("Arduino VOC");
  delay(500);
  lcd.clear();
   
 cli();//stop interrupts

  //timer1 PWM 31KHz
  TCCR1A = 0x81;
  TCCR1B = 0x01;
  OCR1A = 255;
  TIMSK1=0;

  //set timer2 interrupt at 11kHz
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2  = 0;
  OCR2A = 182;
  TCCR2A =2;
  TCCR2B =2;     
  TIMSK2=2;
 
sei();//allow interrupts
 
}
//end setup


ISR(TIMER2_COMPA_vect)  //timer1 interrupt 11kHz toggles
{
 if(fin==0)
  {
  if(nf==0)
    valor=bufer1[dout];
   else
    valor=bufer0[dout];
   
  dout++;
  if(dout>99)
    {
     vacio=1;
     dout=0;
     if(nf==1)
       nf=0;
      else
       nf=1;      
    } 
  OCR1AH = 0;
  OCR1AL = valor;    
  }
}


void loop()
{
    if(!digitalRead(e2Pin))
        {
         clearBuffer();        
         lcd.clear();
         lcd.setCursor(0, 0); lcd.print("PLAY WAV "); lcd.print(inputString);
         inputString.toCharArray(fileplay,19);
         dataFile.close();
         dataFile = SD.open(fileplay,FILE_READ);
         //dataFile = SD.open("11.wav",FILE_READ);
         while(!digitalRead(e2Pin));
         if (dataFile)
          {          
           for(din=0;din<200;din++) dataFile.read(); //quita 200 bytes del wav
           fillBuffer(); 
           fin=0;         
          }
          else
          {
           lcd.setCursor(0, 0); lcd.print("NO   WAV ");          
          }                           
        }
       
    if(!digitalRead(e1Pin))
        {           
         clearBuffer();
         dataFile.close(); 
         lcd.setCursor(0, 0); lcd.print("STOP WAV ");  
         while(!digitalRead(e1Pin));        
        }

  sensorValue = analogRead(A0)>>4;
  if(oldsensorValue != sensorValue)
    {
    inputString=String(sensorValue,DEC);
    inputString+=".wav";
    lcd.setCursor(0, 1);
    lcd.print(inputString);
    lcd.print("    ");
    }
  oldsensorValue = sensorValue;
  fillBuffer();
}


//Borrar buffer
void clearBuffer()
{
   fin=1;
   for(din=0;din<100;din++){ bufer0[din]=128;  bufer1[din]=128;} //vacia bufer
}

//llenado de buffer
void fillBuffer()
{  
  if(vacio == 1 && fin == 0)
    {    
     if(nf==0)
       for(din=0;din<100;din++) bufer0[din] = dataFile.read();
      else
       for(din=0;din<100;din++) bufer1[din] = dataFile.read();
      
     vacio=0;
     if(!dataFile.available())
       {
         lcd.setCursor(0, 0); lcd.print("END  WAV ");
         fin=1;
         for(din=0;din<100;din++){ bufer0[din]=128;  bufer1[din]=128;} //vacia bufer        
       }
    }  
}

Código fuente.




Saludos
Juan Galaz



Bibliografía:
http://ravc00cs.blogspot.com.es/2012/07/pwm.html
https://github.com/TMRh20/TMRpcm/wiki
http://apcmag.com/arduino-project-5-digital-audio-player.htm
http://arduino-info.wikispaces.com/Arduino-PWM-Frequency
http://hykrion.com/?q=node/153
http://arduino.cc/es/Tutorial/SecretsOfArduinoPWM