Taller de Arduino

  • Iniciador del tema Iniciador del tema jmcadsl
  • Fecha de inicio Fecha de inicio
Estado
Cerrado para nuevas respuestas.
joer y yo buscando por el nombre de la pantalla, HD44780 1602 16x2 LCD Display Module Blue Blacklight
No sabia que se conectaran todas igual...

a ver si me llegan los cables y la conecto.

Muchas gracias Karagos, me estaba complicando demasiado. ^^U
 
Para los que tenemos pantalla serial.
al carga un programa nuevo hay que reiniciar el arduino y en mi caso la pantalla dejo de funcionar... asi que mirando me he encontrado una libreria muy curiosa para en vez de utilizar el pin tx utilicemos un pin digital evitando el problema del reinicio de pantalla ademas de la posible rotura de la misma.
la libreria esta en:
y os pongo un ejemplo y configuaraciones para funcionar con esta libreria que es bien sencillo. muestra la hora y usa el pin digital 8
//////////////////////////////////////////////////////////////////////////
#include <NewSoftSerial.h>
#include <Wire.h> // Esta es la libreria de comunicacion I2C
#define DS1307_I2C_ADDRESS 0x68
NewSoftSerial LCD(0,8); // serial LCD connected to pin #5

// Convierte números normales decimales a BCD (binario decimal codificado)
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convierte BCD (binario decimal codificado) a números normales decimales
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock

void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(decToBcd(second));
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour));
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.endTransmission();
}

// Establece la fecha y la hora del reloj
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Resetea el registro puntero
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Alguno de estos necesitan enmascarar porque ciertos bits son bits de control

*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f);
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}

void setup()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
LCD.begin(9600);


/*
// la primera vez debemos poner en hora, active esta parte y luego vuelva a quitarla
second = 00;
minute = 37;
hour = 01;
dayOfWeek = 4;
dayOfMonth = 27;
month = 1;
year = 11;

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
*/
}

void loop()
{
clearLCD();
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

goTo(0);

LCD.print("hora: ");
if (hour < 10) LCD.print("0");
LCD.print(hour, DEC);
LCD.print(":");
if (minute < 10) LCD.print("0");
LCD.print(minute, DEC);
LCD.print(":");
if (second < 10) LCD.print("0");
LCD.print(second, DEC);
goTo (18);
LCD.print("OK");
delay(1000); //Pausa durante 1 segundo

}



// LCD LCD COMMAND CODES
//Apagar LCD
void lcdoff()
{
LCD.print(0x7C, BYTE); //establecer brillo
LCD.print(0, BYTE);//cantidad para dejarla oscura 0
}
// Initiates a function command to the display
void serCommand() {
LCD.print(0xFE, BYTE);
}
// Resets the display, undoing any scroll and removing all text
void clearLCD() {
serCommand();
LCD.print(0x01, BYTE);
}
// Starts the cursor at the beginning of the first line (convienence method for goTo(0))
void selectLineOne() { //puts the cursor at line 0 char 0.
serCommand(); //command flag
LCD.print(128, BYTE); //position
}
// Starts the cursor at the beginning of the second line (convienence method for goTo(16))
void selectLineTwo() { //puts the cursor at line 0 char 0.
serCommand(); //command flag
LCD.print(192, BYTE); //position
}
// Sets the cursor to the given position
// line 1: 0-15, line 2: 16-31, 31+ defaults back to 0
void goTo(int position) {
if (position < 16) {
serCommand(); //command flag
LCD.print((position+128), BYTE);
} else if (position < 32) {
serCommand(); //command flag
LCD.print((position+48+128), BYTE);
} else {
goTo(0);
}
}
espero que salve muchas serial ejejej
Un saludo
 
Eso no vale si la hemos conectado a 12v en vez de a 5v ¿no? jajajaja.
Vaya rachita llevo, esta tratando de "mejorar" arduacuarios.com para poder subir videos y alguna cosa más y no se si me le cagado....espero que no, ya os contare.

jmerino, los 2 arduinos los tengo conectados via I2c, es muy sencillo, cuando llege a casa te pego el trozo de código con un par de ejemplos para que lo veas.

Salu2
 
si enciende prueba con el codigo de reset que deje unos post atras que la mia tp funcionaba nada y resucito. animo con esas cosas! a mi tb se me ha fundido un pin por usar resistencias gordas para los botones a un pin jejej que desastre.
 
Karagos, gracias, lo suponia, pero mejor preguntar para asegurar.

Estoy pensando en poner otro tipo de pantalla, ya os dire.

A ver si con lo del año nuevo chino no se retrasan mucho los pedidos.
 
jackes intenta compilar y subir el blink o alguno muy basico de los que ya trae el complilador de arduino para descartar.....

Hola, acabo de probar lo que me has dicho y me sigue dando el mismo error.

En este caso es problema del software no ???

Voy a ver si me bajo otro y pruevo.

Un saludo
 
Bueno, lo que me pasa es que cargo el programa del reloj, en el serial monitor veo como sale la fecha y la hora, quito el conector usb del ordenador, lo pongo otra vez y el arduino parece que no trabaja, miro el terminal console y no sale nada, escribo lst y send, empieza a mostrar otra vez la fecha y la hora mientras parpadea un led de la placa, esto es asi?

Segun he leido creo que las resistencias para el boton en pin digital son de 10k, me lo podeis confirmar?

jmerino, el codigo de jmcadsl lo he conseguido entender hasta yo, con lo zeporron que soy, en verdad de vuestros codigos estoy montando el mio, gegege, aunque hay algunas cosillas que no entiendo muy bien, luego falta que funcione, que ya os achicharrare a preguntaros, si quieres el codigo de jmcadsl, con su permiso te lo mando, tambien tengo el codigo con el que consigo imprimir por la pantalla con el puerto spi, pero tengo que buscar mas comandos spi para ver que mas consigo hacer, pero por lo menos he conseguido dibujar tu pantalla en la mia, si quereis os lo pongo aqui.

Saludos
 
Comunicar 2 Arduinos mediante I2C

Uno de los Arduinos sera el "Maestro" y los otros "Esclavos", es decir, el maestro dara ordenes y los esclavos haran algo (la comunicación puede ser tambien al reves, los esclavos pueden tambien mandar info al maestro).

En mi caso el Arduino maestro tiene las lecturas de todos los sensores y según el valor de estos manda una u otra orden al maestro, que se encarga de los reles, peristalticas etc etc..

Código en el maestro:
Código:
//Antes de nada incluir la libreria
#include <Wire.h>
byte programa=0;//Declaramos variable Numero programa I2C que se va a mandar que haga el esclavo
// Subfuncion para envio de programas I2C al esclavo
void i2c(int programa)
{
  Wire.beginTransmission(2);// El 2 es la direccion del esclavo que hemos de definirla en el esclavo como ahora veremos
  Wire.send(programa);
  Wire.endTransmission();
}


void loop()
{
//Aqui nuestro programa y en el momento que necesitemos que el esclavo haga algo le decimos, i2c(x) donde x es el numero de programa que queremos que haga. Por ejemplo...
i2c(10);//Mandamos al esclavo hacer el programa 10
}
  //I2C

Y en el esclavo ponemos el siguinte código:
Código:
//Libreria
#include <Wire.h>  //I2C
int programa=0;
//en el setup añadir esto
void setup()
{
Wire.begin(2);// Direccion arduino esclavo I2c
Wire.onReceive(receiveEvent); // I2c
}

//añadimos esta subfuncion
//recepcion I2C
void receiveEvent(int howMany)
{
   programa = Wire.receive(); // receive byte as a character
}


void loop()
{
  
  if (programa>0)//si ha entrado algun programa pasa a ejecutarlo
  {
   i2c();
   }
 
}

void i2c()
{
  
if (programa ==10)//PERISTALTICA 1 (A) 4SEG --> 8ML
{
programa=0;//reiniciamos la variable
digitalWrite(P1,HIGH);
delay (4000);
digitalWrite(P1,LOW);

//aqui tendriamos todos los "if programa== xx que necesitemos
}

Pues esto es todo, cualquier duda me lo comentais...
Salu2
Voy a ver si me pego un rto con la otra web....
 
MIRAR QUE BOTONCITOS mas majos par el arduino. No se si valdran para nuestros proyectos pero tienen buena pinta:
 
Jmcadsl, no se si sere el unico, pero no funcionan los enlaces que has puesto en el primer post, da un error.
 
Pues es cierto, ya no funcionan.....la verdad es que no los puse yo, los puso ArrecifeMadrid (creo recordar), algo habrán cambiado en la estructura del foro, porque en su dia funcionaban....es un pena la verdad...

Por cierto acabo de conseguir que Arduacuarios funcione de nuevo jejeje, menos mal!!!! Y todo por trara de actualizar la versión del phpBB.

Salu2
 
Pongo aquí lo que hago para que me funcione la pantalla por spi, si veis algún fallo o algo que se puede quitar o mejorar decírmelo.

Código:
#include*<avr/io.h>*
#include*<stdlib.h>*

[color=#7E7E7E]/*LCD*CONTROL[/color]
[color=#7E7E7E]CONTROL*CHARACTER*DECIDED*BY*INTERNAL*OPERATION*OF*[/color]
[color=#7E7E7E]ATTINY2313*SPI*LCD*/*RS232*CONTROLLER[/color]
[color=#7E7E7E]T0*SEND*CONTROL*CHARACTERS.[/color]
[color=#7E7E7E]*****Serial.write(CR);[/color]
[color=#7E7E7E]*****Serial.write(CD);[/color]
[color=#7E7E7E]*********OR[/color]
[color=#7E7E7E]*****Comm*(CD,0)**(0*for*SPI*and*1*for*RS232)[/color]
[color=#7E7E7E]*********[/color]
[color=#7E7E7E]SEND*ASCII*250*AND*THEN*ANY*CONTROL*CHARACTER***/[/color]

#define*CR*250**[color=#7E7E7E]//TO ACCESS CONTROL REGISTER[/color]

[color=#7E7E7E]/*SEE*PAGE*191,192,193*OF*HITACHI*LCD*CONTROLLER*HD44780*DATSHEET[/color]
[color=#7E7E7E]0*0*0*0*0*0*0*1****/[/color]
#define*CD*1****[color=#7E7E7E]//CLEAR DISPLAY [/color]



[color=#7E7E7E]//*0*0*0*0*1*D*C*B[/color]
#define*CBY*0X0F***[color=#7E7E7E]//CURSOR ON BLINK ON 00001DCB[/color]
#define*CBN*0X0C***[color=#7E7E7E]//CURSOR 0FF BLINK 0FF[/color]

#define*SCK*13
#define*MISO*12
#define*MOSI*11
#define*RESET*10

[color=#CC6600]int[/color] RCByte;
[color=#CC6600]int[/color] TCByte = 0xff; 
[color=#CC6600]int[/color] mv = 0;
[color=#CC6600]int[/color] tog = 0;
[color=#CC6600]char[/color] c[30];

[color=#7E7E7E]///SETUP////[/color]
[color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]()
{
***
**[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]begin[/color](9600);
*[color=#CC6600]pinMode[/color](6,[color=#006699]OUTPUT[/color]);
*[color=#CC6600]pinMode[/color](7,[color=#006699]OUTPUT[/color]);
*[color=#7E7E7E]// following delays may not work on all targets...[/color]
**[color=#CC6600]pinMode[/color](RESET, [color=#006699]OUTPUT[/color]);
**[color=#CC6600]digitalWrite[/color](RESET, [color=#006699]LOW[/color]);
**[color=#CC6600]delay[/color](50);
**[color=#CC6600]digitalWrite[/color](RESET, [color=#006699]HIGH[/color]);
**[color=#CC6600]delay[/color](50);
**[color=#CC6600]pinMode[/color](SCK, [color=#006699]OUTPUT[/color]);
**[color=#7E7E7E]//digitalWrite(SCK, LOW);[/color]
**[color=#CC6600]pinMode[/color](MISO, [color=#006699]INPUT[/color]);
**[color=#CC6600]pinMode[/color](MOSI, [color=#006699]OUTPUT[/color]);
***
**spi_init();
**[color=#7E7E7E]//pinMode(9,OUTPUT);[/color]
*[color=#7E7E7E]//digitalWrite(9,LOW);[/color]
*[color=#7E7E7E]//digitalWrite(10,LOW);[/color]
*[color=#7E7E7E]//delay(50);[/color]
*[color=#7E7E7E]//pinMode(10,INPUT);[/color]
*[color=#7E7E7E]//digitalWrite(10,HIGH);[/color]
*[color=#7E7E7E]// myspi.init();[/color]
*[color=#CC6600]digitalWrite[/color](6,[color=#006699]LOW[/color]);
*LCD_Reset(0);
*[color=#CC6600]digitalWrite[/color](6,[color=#006699]HIGH[/color]);
*[color=#CC6600]digitalWrite[/color](7,[color=#006699]LOW[/color]);
*LCD_Reset(0);
*[color=#CC6600]digitalWrite[/color](7,[color=#006699]HIGH[/color]);
*LCD_Reset(1);

}







[color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]()                     [color=#7E7E7E]// run over and over again[/color]
{
**[color=#CC6600]if[/color](tog==0){
***[color=#CC6600]digitalWrite[/color](7,[color=#006699]HIGH[/color]);
***[color=#CC6600]digitalWrite[/color](6,[color=#006699]LOW[/color]);
***tog*=*1;*}
**[color=#CC6600]else[/color]{
***[color=#CC6600]digitalWrite[/color](7,[color=#006699]LOW[/color]);
***[color=#CC6600]digitalWrite[/color](6,[color=#006699]HIGH[/color]);
***tog*=*0;*
**}
******
***spi_send(CR);**[color=#7E7E7E]//  | Alternate |[/color]
***spi_send(CBN);
***
***
***[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]write[/color](CR);
*
*infolcd();
****
***[color=#CC6600]delay[/color](500);  
**
***spi_send(CR);

***
***
***[color=#7E7E7E]//digitalWrite(6,HIGH);[/color]
***[color=#7E7E7E]//digitalWrite(7,LOW);[/color]
***[color=#7E7E7E]////BLINK LED CONNECTED TO ATTINY2313 SPI OPTOISOLATED I/O BOARD[/color]
**[color=#7E7E7E]//for (int i=0; i <= 5; i++){[/color]
****
***[color=#7E7E7E]//TCByte = 0;[/color]
***[color=#7E7E7E]//RCByte = myspi.Transmit(TCByte);[/color]
***[color=#7E7E7E]//delay(500);  [/color]
******
***[color=#7E7E7E]//TCByte = 0XFF;[/color]
***[color=#7E7E7E]//RCByte = myspi.Transmit(TCByte);[/color]
*******
***[color=#7E7E7E]//delay(500);  [/color]
***[color=#7E7E7E]//}[/color]



}

[color=#7E7E7E]//Dibujamos*la*pantalla*principal[/color]
[color=#CC6600]void[/color] infolcd(){
*setCur(0,0);
**spi_trans([color=#006699]"URN"[/color]);
**setCur(8,0);
**[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](223, [color=#006699]BYTE[/color]);
**spi_trans([color=#006699]"C"[/color]);
**setCur(0,1);
**spi_trans([color=#006699]"SUM"[/color]);
**setCur(8,1);
**[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](223, [color=#006699]BYTE[/color]);
**spi_trans([color=#006699]"C"[/color]);
**setCur(12,1);
**spi_trans([color=#006699]"PH"[/color]);
**setCur(0,2);
**spi_trans([color=#006699]"EXT"[/color]); 
**setCur(8,2);
**[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](223, [color=#006699]BYTE[/color]);
**spi_trans([color=#006699]"C"[/color]);
**setCur(12,2);
**spi_trans([color=#006699]"ORP"[/color]);

**setCur(0,3);
**spi_trans([color=#006699]"Rls|"[/color]);
**setCur(7,3);
**spi_trans([color=#006699]"|"[/color]);
**setCur(11,3);
**spi_trans([color=#006699]"|"[/color]);
**setCur(15,3);
**spi_trans([color=#006699]"|"[/color]);
**setCur(19,3);
**spi_trans([color=#006699]"|"[/color]);
}


[color=#CC6600]void[/color] setCur( uint8_t ln, uint8_t row ) 
{
**uint8_t*lnP;
**
*[color=#CC6600]if[/color] (row == 0){
**lnP*=*0x80*|*ln;**
**spi_send(CR);
*spi_send(lnP);*
****
**}
**[color=#CC6600]if[/color] (row == 1){
**lnP*=*0xC0*|*ln;**
**spi_send(CR);
**spi_send(lnP);***
****
**}
**ln*=*ln*+*20;
**[color=#CC6600]if[/color] (row == 2){
**lnP*=*0x80*|*ln;*
**spi_send(CR);
**spi_send(lnP);
**}
**[color=#CC6600]if[/color] (row == 3){
**lnP*=*0xC0*|*ln;*
**spi_send(CR);
**spi_send(lnP);
**}
}

[color=#CC6600]void[/color] clearDisp(){
**
**[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]write[/color](CR);
**[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]write[/color](CD);
**
}
[color=#CC6600]void[/color] LCD_Reset(uint8_t inter) [color=#7E7E7E]//inter is for interface: 0 for SPI: 1 for RS232[/color]
{
*Comm(0b00110000,inter);
*[color=#CC6600]delay[/color](5);
*Comm(0b00110000,inter);
*[color=#CC6600]delayMicroseconds[/color](100); 
*Comm(0b00110000,inter);
*Comm(0b00111000,inter);*
*Comm(0b00001100,inter);
*Comm(0b00000001,inter);*
*Comm(0b00000110,inter);*
*
}

[color=#CC6600]void[/color] Comm(uint8_t mval, uint8_t inter){
***[color=#CC6600]if[/color] (inter == 0){  
***spi_send(CR);
***spi_send(mval);**}
**[color=#CC6600]if[/color] (inter == 1){  
***[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]write[/color](CR);
***[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]write[/color](mval);  
}
}

[color=#CC6600]void[/color] spi_init() {
**uint8_t*x;
**SPCR*=*0x53;
**x=SPSR;
**x=SPDR;
}
[color=#CC6600]void[/color] spi_wait() {
**[color=#CC6600]do[/color] {
**}*
**[color=#CC6600]while[/color] (!(SPSR & (1 << SPIF)));
}

uint8_t*spi_send(uint8_t*b)*{
**uint8_t*reply;
**SPDR=b;
**spi_wait();
**reply*=*SPDR;
**[color=#CC6600]delay[/color](2);[color=#7E7E7E]//very importent for the LCD board to process[/color]
**[color=#CC6600]return[/color] reply;
**
}
uint8_t*spi_trans(const*[color=#CC6600]char[/color] *str) 
*{
**[color=#CC6600]while[/color] (*str)
****spi_send(*str++);
}

Saludos

PD: parte del codigo es de jmerino con alguna modificación
 
Última edición:
No habrá sido por mi culpa??? Upps

Jajaja, no no que va..es que vi que hay una nueva version de phpBB y lo trate de actualziar pero algo fue mal y se jodio el tema....
Pero bueno, pude salvar la base de datos e instalar todo de nuevo....lo mejor de todo es que ya se algo más de php y de Sql jejeje.
 
Jejeje, pues entonces te ha servido de formación. Php es muy divertido y muy potente, no dejes en el olvido lo que hayas aprendido.
 
a ver que me decis de esta pantalla
.
No tengo claro lo del VT-100, disculpar por tanta pregunta.
 
Ahora hay otro problemita, intento que me muestre la temperatura en la pantalla y no lo consigo, alguien tiene idea de como hacerlo?

Saludos
 
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba