Taller de Arduino

  • Iniciador del tema Iniciador del tema jmcadsl
  • Fecha de inicio Fecha de inicio
Estado
Cerrado para nuevas respuestas.
Hola Ya he pedido dos placas de reles de 4 a los chinos.



Solo me hace falta que el codigo me empiece a funcionar...

Una pregunta. La alimentación del LCd Serie la sacáis también del arduino verdad?.

Saludos.

Esta placa es la que estoy utilizando yo y va camo un reloj suizo. De momento cero problemas. (recomendable 100%)
Tengo que decir que tengo otra que ahora no recuerdo, que me gusta mas pero como todavia no la he utilizado pues calladito estoy mas guapo.

A la pregunta, pues si, del 5v del arduino, hay quien la tiene en un pin digital PWM, así puedes dimear la iluminación de la pantalla, que esto tambien está muy bien, para dimear por la noche por ejemplo.

Cuidadito en utilizar pines que ahora sobran........lo digo por experiencia, puedo decir que tengo todos y digo todos los pines del arduino ocupados y me faltan para hacer cosas, por eso lo de utilizar varios botones con un solo pin.....(recomiendo el arduino mega para ir sobrado de pines!!!) creo que es la segunda vez que lo recomiendo.
 
Última edición:
Hola Ya he pedido dos placas de reles de 4 a los chinos.



Solo me hace falta que el codigo me empiece a funcionar...

Una pregunta. La alimentación del LCd Serie la sacáis también del arduino verdad?.

Saludos.

Correcto, debes sacarla del +5v de arduino.
 
Despues de casi un mes funcionando sin problema, mi Arduino, hoy ha dicho se termino. Ha dejado de funcionar. El lcd, no se retro ilumina, y lo unico que consigo distinguir es una serie de caracteres repetidos.

Alguien me puede dar una idea de que ha podido pasar.
 
Hola nuevamente.

El plasta de los Madriles al aparato¡¡¡¡

Este es el codigo en el que me estoy basando para mi controlador.

Quiero que presenta INFINITY-REEF VER 2.0

Luego despues de una pausa me gustaria que muestre en la primera fila ( Superior) la hora con el reloj marcando tambien los segundos.

#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68
#include <SLCD.h> //LCD
#define numRows 2 //LCD filas
#define numCols 16 //LCD columnas
SLCD lcd = SLCD(numRows, numCols); //LCD

byte decToBcd(byte val)//RELOJ
{
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;//RELOJ

void setup()
{
Wire.begin(); //RELOJ
lcd.init(); //LCD
Serial.begin(9600); //LCD
}


//BUCLE PRINCIPAL
void loop ()
{
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // LEEMOS LA HORA
InfoLcd(); //Informacion cada hora en pantalla lcd

}

// FUNCIONES PRINCIPALES

// Establece la fecha y el tiempo del ds1307
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); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}


// INFORMACION EN PANTALLA LCD
void InfoLcd ()
{
//Nombre proyecto
lcd.print("INFINITY-REEF", 0, 2);
lcd.print("VER 2.0", 1, 4);
delay(2000);
lcd.clear(); // borra pantalla
// ahora para mostrar fecha y hora
lcd.print("Hora:",0,1);
if (hour < 10) Serial.print("0");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10) Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10) Serial.print("0");
Serial.print(second, DEC);

switch (dayOfWeek)
{
case 1:
lcd.print("Lun , ",1,0);
break;
case 2:
lcd.print("Mar , ",1,0);
break;
case 3:
lcd.print("Mie , ",1,0);
break;
case 4:
lcd.print("Jue , ",1,0);
break;
case 5:
lcd.print("Vie , ",1,0);
break;
case 6:
lcd.print("Sab , ",1,0);
break;
case 7:
lcd.print("Dom , ",1,0);
break;
}
Serial.print(dayOfMonth, DEC);
Serial.print("/");
if (month < 10) Serial.print("0");
Serial.print(month, DEC);
Serial.print("/");
Serial.print("20");
if (year < 10) Serial.print("0");
Serial.print(year, DEC);
}

Realmente con estew codigo solo consigo saltosm, es decir, me muestra:

HINFINITY-REEF
LUN VER 2.0/2010

Tengo problemas con el salto de la presentacion a el mostrar la hora.

Que puede pasar señores??,

Muchas gracias y una ayudita por favor.

NOTA: Decir que tengo las librerias instaladas: SLCD, onWire y Wire.
 
Buenas,
hacía mucho tiempo que no pasaba por el foro y veo que me he perdido muchas cosas!

El caso es que por hobbie me gusta mucho hacer cosas con Arduino. Hace 2 veranos experimenté con un sensor de temperatura para automatizar el ventilador, y cosas por el estilo.

Leo que algunas personas tienen problemas con las rutinas de limpiado de pantalla, o cosas por el estilo. Si tienes un LCD de 16 pins (creo que no cuesta ni 4€) puedes hacerte una placa shield para usarla con tu Arduino, con muy poco trabajo.

Os dejo una URL de mi blog donde hace poco dejé un esquema, video de ejemplo y el código fuente de unas rutinas útiles para usarlas con una pantalla LCD:


https://www.labsnetwork.com/lcd-custom-shield-and-print-source-code/


Espero que sirva de ayuda,
Suerte a todos
 
Hola buenos días a todos;

LA pantalla es la de Sparfun serial ( Bricogeek), una pantalla mas que probada por estas lindes. Aunque estoy pensando en comprar otra serial con las Lineas de 20x4 o 16x4. Me aconsejáis algo serial por favor?.

No se que puede ocurrir.
Con el código de activación de reloj y demás va de cine. Lo pongo en hora y demás y muestra la hora por el Monitor serial, pero cuando le conecto la pantalla me aparecen esos errores. No limpia la pantalla o algo en el código la bloquea.

Por otro lado, me acaba de enviar el Chino Cudeiro un mail indicándome que ya han salido las tarjetas rele de la China con destino Navalcarnero.

Una pregunta mas. ¿ Tenemos algún esquema de como conectar las placas de Rele a nuestro engendro?. En el foro no lo he localizado y me extraña.

Un saludo .-)
 
Alguien tiene un lcd serial para venderme, por que es lo que se me ha muerto, el arduino esta bien.
 
Hola.

Ya he corregido algunas cosas.

El Delay 3000 primero lo he subido a 6000.

Luego he modificado la presentacion y he excluido al final del codigo el Lcdoff y fade.

Como lo veis?.
#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68
#include <SLCD.h> //LCD
#define numRows 2 //LCD filas
#define numCols 16 //LCD columnas
SLCD lcd = SLCD(numRows, numCols); //LCD

byte decToBcd(byte val)//RELOJ
{
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;//RELOJ

void setup()
{
Wire.begin(); //RELOJ
lcd.init(); //LCD
Serial.begin(9600); //LCD
}


//FUNCIONES SECUNDARIAS

//Iniciar LCD
void Lcdini ()
{
lcd.displayOn();
lcd.clear();
}

void lcdoff()
{
lcd.displayOff();
lcd.brightness(0);
}

// borra pantalla con fade
void FadeLcd()
{

for (char i=99; i>=4; i -= 5) {
lcd.brightness(i);
delay(50);
}

lcd.clear();

for (char i=0; i<100; i += 5) {
lcd.brightness(i);
delay(50);
}
}


// Pausa 3 segundos////////MOFIFICADA A 6////////////////
void p ()
{
delay (6000);
}




//BUCLE PRINCIPAL
void loop ()
{
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // LEEMOS LA HORA
InfoLcd(); //Informacion cada hora en pantalla lcd

}




// FUNCIONES PRINCIPALES

// Establece la fecha y el tiempo del ds1307
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); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}


// INFORMACION EN PANTALLA LCD
void InfoLcd ()
{
//Nombre proyecto
Lcdini();
lcd.print("Iscarman control", 0, 0);
lcd.print("VER 1.0", 1, 4);

p();
FadeLcd(); // borra pantalla con fade

// ahora para mostrar fecha y hora
p();//pausa 3segundos

lcd.print("Hora:",0,1);
if (hour < 10) Serial.print("0");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10) Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10) Serial.print("0");
Serial.print(second, DEC);

switch (dayOfWeek)
{
case 1:
lcd.print("Lun , ",1,0);
break;
case 2:
lcd.print("Mar , ",1,0);
break;
case 3:
lcd.print("Mie , ",1,0);
break;
case 4:
lcd.print("Jue , ",1,0);
break;
case 5:
lcd.print("Vie , ",1,0);
break;
case 6:
lcd.print("Sab , ",1,0);
break;
case 7:
lcd.print("Dom , ",1,0);
break;
}
Serial.print(dayOfMonth, DEC);
Serial.print("/");
if (month < 10) Serial.print("0");
Serial.print(month, DEC);
Serial.print("/");
Serial.print("20");
if (year < 10) Serial.print("0");
Serial.print(year, DEC);

p();
/////////////////QUITANDO EL FADELCD Y EL LCDOFF FUNCIONA MEJOR/////////////////
/*
FadeLcd(); // borra pantalla con fade
lcdoff();
*/
}

Saludos.
 
Infinity con esas modificaciones ya te funciona correctamente? .... yo tengo el mismo lcd que tu y no tengo esos porblemas....es raro...
 
Hola Jmcadsl.

Si tenemos el mismo Lcd y todo pero a mi me va mal curiosooo.

¿ Que puede ser?-

Con el Fade y el Lcdoff me da saltos en el pagado y demás y no me gusta.

Saludos.
Una pregunta. hay alguna forma de que el reloj muestre el cambio de los segundos en tiempo real en pantalla?.
 
Hola compis sabéis alguna tienda donde vendan todos los cacharros estos para no tener que pedir cada uno a un chino. Si es tienda física en Madrid pues mejor
Un saludo
 
hola karagos

Queria saber si por algun casual has puesto varios sensores de temperatura ( varios ds1820 en la misma linea ) yo los he probado y no he dado con la solucion de poner varios sensores.

A ver sim me puedes ayudar

Un saludo
 
Hola nuevamente.

Preguntas por favor:

Alguien dispone de plantilla de corte para el Lcd de Sparkfun. Es decir la plantilla para realizar el hueco en la caja y que el display salga por la misma con los taladros y demas??.

Jmcadsl_ si quito el Lcdoff del final, y en la primera parte, pongo el delay en 6000 , funciona genial¡¡¡¡.
Poco a poco...

Hoy he comprado una caja para meter todo el proyecto con altavoz incluido que es una pasada. 20 euritos.

Cuantos botones pulsadores son necesarios para el menú completo?.

Como se regula la intensidad ( brillo ) en lineas de codigo?.

Muchas gracias y un abrazo.
 
Hola karagos

Gracias por la explicacion grafica que nunca biene mal.

El problema que tengo es en el codigo que no se como difireciar entre el sensor 1 , 2 , 3 ó 4 (para poder trabajar con distintas temperaturas). A no ser que te haga una media de todos los sensores que pongas.

A ver si me puedes ayudar
 
hola
cdistri
este codigo es el que tienes que crear o modificar

metemos dentro de la variable acuatemp el valor de --sensors.getTempCByIndex(0)-- si queremos leer otro sensor cambiamos el (0) por un numero superior
Serial.println(acuatemp); //asi lo sacamos por pantalla
si metemos la temperatura en una variable la es mas facil de comparar para actuar:
por ejemplo:
int acuatemp = sensors.getTempCByIndex(0); //leemos el primero si queremos el siguiente cambiamos el 0 por 1 y asi sucesivamente
if (acuatemp>28||acuatemp<23) {//aqui dice si acuatemp es mayor de 28 o acuatemp es menor de 23. " || este simbolo es o(OR), no cero"
noTone(2);// apaga el alttavoz
tone (2,530,1000);// da el tono (2 es el pin) (530 es el tono mas alto mas agudo y viceversa)(1000 la duracion es milisegundos)

}
"tone()" es para hacer un pitido en un altavoz y asi crear una alarma.
todo lo que vaya detras de // podeis borrarlo.
aqui leemos e imprimimos por pantalla directamente.
Serial.println(sensors.getTempCByIndex(1)); // Index 1, es el 2º sensor del cable
de todas maneras que alguno de los maestros lo mire y te lo confirme. ;)
pd: "||" esto se crea con "alt gr" que no es lo mismo "//" que se crea con mayusculas + 7
 
Última edición:
Hola karagos

En tu ejemplo de lectura de temperatura lo realizas con ds.( algo ) para la captura de la temperatura.


OneWire ds(11); // on pin 11
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;


void loop(void) {
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { data = ds.read();}
Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature
Temp=Temp>>4;//divide by 16 to get pure celcius readout

Hasta aqui haces la lecura de la temperatura , realizas la conversion y lo grabas en una variable TEMP.

Mi pregunta es en que momento tengo hacer la lectura de cada sensor de temperatura con el ds. ó ya cuando se guarda en la variable TEMP.

Os comento esto porque estoy trabajando en dos modelos diferentes. Uno es igual que el de karagos y otro es con el siguiente codigo.

#include <OneWire.h>//temperatura
#include <DallasTemperature.h>//temperatura
#define ONE_WIRE_BUS 7//temperatura, pin de entrada 7
OneWire oneWire(ONE_WIRE_BUS);//temperatura
DallasTemperature sensors(&oneWire);




void setup()
{
sensors.begin();//Temperatura
}

void loop ()
{
sensors.requestTemperatures();

Serial.print(sensors.getTempCByIndex(0)); //Index 0 , es el primer sensor

Serial.print(sensors.getTempCByIndex(1)); // Index 1, es el 2º sensor del cable

}

El problema es que este ambos me detectan un solo sensor. he comprobado el circuito y esta correctamente .

A ver si me puedes ayudar

Un saludo
 
Última edición:
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba