12 ago. 2011

Mi estación meteorologica

A continuación podreis ver como me construí mi estación meteorologica





En realidad lo que veis en la foto no es una estación meteorologica aunque a mi me guste llamarla así no tiene cientos de sensores ni demás cosas interesantes, pero cumple la misma función que una estación meteorologica


Lo que podeis ver en las fotos no es más que un arduino duemilanove conectado a un LCD HD44780 donde muestro la información procedente de un rss ( yahoo weather ), y todo ello controlado gracias a LCDsmartie y a algunos plugins que hacen posible el funcionamiento de LCDsmartie con el rss de yahoo weather, pero todo ello comenzó asi:


 Primero como todos mis proyectos los pongo en una protoboard para ver si todo funciona correctamente, despues de comprobarlo comienzo con lo que más trabajo me costó , la caja:


Comencé haciendole el agujero del LCD, como veis lo ajusté al milimetro, tanto por el frente como por la parte de detras, que tube que hacer unas pequeñas piezas de maderas para acoplar perfectamente el LCD




 Después le hice los agujeros del USB y de la alimentación al arduino, y le puse 3 roscas metricas incrustadas en la madera para poder sacarlo y ponerlo de nuevo cuando me hiciese falta





A continuación puse ya dentro todo de la caja y hice el cableado siguiendo el siguiente esquema:








Para finalizar le he puesto un cierre acorde con los acabados que le estaba dejando:




Para hacerlo todo funcionar como ya he dicho he empleado LCDsmartie y el codigo que vereis al final para arduino, aparte de la libreria para arduino LC4BIT  y el resultado después de todo el proceso es este:




A continuación os dejo un link con todos los archivos necesarios para hacerlo funcionar, al igual que el codigo que empleé para arduino

Link Megaupload



codigo:

#include "LCD4Bit_mod.h"
#include <EEPROM.h>
//#include <Streaming.h>
const byte backLight = 10;

//create object to control an LCD.
//number of lines in display=1
LCD4Bit_mod lcd = LCD4Bit_mod(2);


void setup() {
  pinMode(backLight, OUTPUT);  //makes the backLight an output
  digitalWrite(backLight,HIGH);//turns the backLight on
  Serial.begin(19200);

  lcd.init();
  lcd.clear();
   lcd.printIn(" Hola ");
  lcd.cursorTo(2,0);
  lcd.printIn(" Mundo ");
}


byte serial_getch(){

  int incoming;
  while (Serial.available()==0){
  }
  // read the incoming byte:
  incoming = Serial.read();

  return (byte) (incoming &0xff);
}



void loop(){

  byte rxbyte;
  byte temp;
  byte addr;
  byte pin;
  int myVal;
  int val;

  rxbyte = serial_getch();

  if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
  {
    switch (serial_getch())
    {

    case 50: // Read analog pin, then send value back
	pin = serial_getch();
	myVal = analogRead(pin)/4;
	delay(10);
	Serial.print(myVal, BYTE);
	break;
    case 64: // EEPROM Write (address, value)
	addr = serial_getch();
	delay(10);
	val = serial_getch();
	EEPROM.write(addr, val);
	break;

    case 65: // EEPROM Read  (address)
	addr = serial_getch(); // EEPROM address
	val = EEPROM.read(addr); //
	Serial.print(val, BYTE);
	break;

    case 66: //backlight on (at previously set brightness)
	// not implemented
	digitalWrite(backLight, HIGH);
	break;

    case 70: //backlight off
	// not implemented
	digitalWrite(backLight, LOW);
	break;

    case 71:  //set cursor position
	temp = (serial_getch() - 1);  //get column byte
	switch (serial_getch())  //get row byte
	{
	  //line 1 is already set up
	case 2:
	  temp += 0x40;
	  break;
	case 3:
	  temp += 0x14;
	  break;
	case 4:
	  temp += 0x54;
	  break;
	default:
	  break;
	}
	lcd.commandWrite(0b10000000 + temp);
	break;

    case 72:  //cursor home (reset display position)
	lcd.commandWrite(2);
	break;

    case 74:  //show underline cursor
	lcd.commandWrite(0b00001110);
	break;

    case 75:  //underline cursor off

    case 84:  //block cursor off
	lcd.commandWrite(0b00001100);
	break;

    case 76:  //move cursor left
	lcd.commandWrite(16);
	break;

    case 77:  //move cursor right
	lcd.commandWrite(20);
	break;

    case 78:  //define custom char
	lcd.commandWrite(64 + (serial_getch() * 8));  //get+set char address
	for (temp = 7; temp != 0; temp--)
	{
	  lcd.print(serial_getch()); //get each pattern byte
	}
	break;

    case 83:  //show blinking block cursor
	lcd.commandWrite(0b00001111);
	break;
    case 86:  //GPO OFF
	//implement later
	break;

    case 87:  //GPO ON
	/*temp = serial_getch();
	 				if (temp == 1)
	 				{
	 					GPO1 = GPO_ON;
	 				}*/
	break;

    case 88:  //clear display, cursor home
	lcd.commandWrite(1);
	break;

	/*###############################################################
	 case 152: //set and remember (doesn't save value, though)
	 case 153: //set backlight brightness
	 //not implemented
	 break;
	 //these commands ignored (no parameters)
	 //case 35: //read serial number //USING FOR EEPROM//
	 //case 36: //read version number
	 case 55: //read module type
	 case 59: //exit flow-control mode
	 //case 65: //auto transmit keypresses
	 case 96: //auto-repeat mode off (keypad)
	 case 67: //auto line-wrap on
	 case 68: //auto line-wrap off
	 case 81: //auto scroll on
	 case 82: //auto scroll off
	 case 104: //init horiz bar graph
	 case 109: //init med size digits
	 case 115: //init narrow vert bar graph
	 case 118: //init wide vert bar graph
	 break;
	 ###############################################################*/

    default:
	//all other commands ignored and parameter byte discarded
	temp = serial_getch();  //dump the command code
	break;
    }
    return;
  } //END OF COMMAND HANDLER

  //change accented char to plain, detect and change descenders
  //NB descenders only work on 5x10 displays. This lookup table works
  //  with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
  switch (rxbyte)
  {
    //chars that have direct equivalent in LCD charmap
    /*		case 0x67: //g
     			rxbyte = 0xE7;
     			break;
     		case 0x6A: //j
     			rxbyte = 0xEA;
     			break;
     		case 0x70: //p
     			rxbyte = 0xF0;
     			break;
     		case 0x71: //q
     			rxbyte = 0xF1;
     			break;
     		case 0x79: //y
     			rxbyte = 0xF9;
     			break;
     */  case 0xE4: //ASCII "a" umlaut
    rxbyte = 0xE1;
    break;
  case 0xF1: //ASCII "n" tilde
    rxbyte = 0xEE;
    break;
  case 0xF6: //ASCII "o" umlaut
    rxbyte = 0xEF; //was wrong in v0.86
    break;
  case 0xFC: //ASCII "u" umlaut
    rxbyte = 0xF5;
    break;

    //accented -> plain equivalent
    //and misc symbol translation
  case 0xA3: //sterling (pounds)
    rxbyte = 0xED;
    break;
    /*		case 0xB0: //degrees symbol
     			rxbyte = 0xDF;
     			break;
     */  case 0xB5: //mu
    rxbyte = 0xE4;
    break;
  case 0xC0: //"A" variants
  case 0xC1:
  case 0xC2:
  case 0xC3:
  case 0xC4:
  case 0xC5:
    rxbyte = 0x41;
    break;
  case 0xC8: //"E" variants
  case 0xC9:
  case 0xCA:
  case 0xCB:
    rxbyte = 0x45;
    break;
  case 0xCC: //"I" variants
  case 0xCD:
  case 0xCE:
  case 0xCF:
    rxbyte = 0x49;
    break;
  case 0xD1: //"N" tilde -> plain "N"
    rxbyte = 0x43;
    break;
  case 0xD2: //"O" variants
  case 0xD3:
  case 0xD4:
  case 0xD5:
  case 0xD6:
  case 0xD8:
    rxbyte = 0x4F;
    break;
  case 0xD9: //"U" variants
  case 0xDA:
  case 0xDB:
  case 0xDC:
    rxbyte = 0x55;
    break;
  case 0xDD: //"Y" acute -> "Y"
    rxbyte = 0x59;
    break;
    /*		case 0xDF: //beta  //mucks up LCDSmartie's degree symbol??
     			rxbyte = 0xE2;
     			break;
     */  case 0xE0: //"a" variants except umlaut
  case 0xE1:
  case 0xE2:
  case 0xE3:
  case 0xE5:
    rxbyte = 0x61;
    break;
  case 0xE7: //"c" cedilla -> "c"
    rxbyte = 0x63;
    break;
  case 0xE8: //"e" variants
  case 0xE9:
  case 0xEA:
  case 0xEB:
    rxbyte = 0x65;
    break;
  case 0xEC: //"i" variants
  case 0xED:
  case 0xEE:
  case 0xEF:
    rxbyte = 0x69;
    break;
  case 0xF2: //"o" variants except umlaut
  case 0xF3:
  case 0xF4:
  case 0xF5:
  case 0xF8:
    rxbyte = 0x6F;
    break;
  case 0xF7: //division symbol
    rxbyte = 0xFD;
    break;
  case 0xF9: //"u" variants except umlaut
  case 0xFA:
  case 0xFB:
    rxbyte = 0x75;
    break;
  default:
    break;
  }

  lcd.print(rxbyte);  //otherwise a plain char so we print it to lcd
  return;


}




8 comentarios:

sergio dijo...

que crack tio, es todo impresionante.

Mister_geek dijo...

Muchas gracias Sergio

Anónimo dijo...

impresionante...un crack...
slds desde fc

Mister_mst dijo...

Gracias :)

Brais dijo...

Hola mister, voy a intentar hacer este proyecto pero tengo muchas dudas y me gustaria poder contactar contigo a por si me puedes ayudar.


saludos

Majid azzi dijo...

Se sigue pudiéndose hacer?

Tengo un arduino Uno serviría?

Fernando dijo...

hace muchos años utilice el LCD Smartie, realmente aprovechando muy bien su practicidad, lo usaba para los mails, aviso de noticias, con el Winamp, con el Tiempo, etc. Todavia tengo guardado la caja con el display. Te hago una consulta ? para que usaste el arduino y si podrias subir el link de Mega nuevamente, porque está caido, o colocarlo en el Google Drive o alguno similar. Gracias y saludos

Unknown dijo...

Fernando, cuanto costaría hacer la caja esa?

Se puede pedir en alguna tienda en que te la hagan?

ir arriba