# Termostato con DS18B20 y 16F877A ajustable.



## miglo (Dic 24, 2012)

Bueno pues despues de romperme un poco el coco y partiendo de que soy muy novatillo en el tema, pues creo que realizado un proyecto de este termostato, que a la vez pienso que puede servir a alguien, si es asi me alegro.
De antemano tengo que decir que utilizado un poquito de infomacion de por aqui y otro poquito de por alli y algo de mi cosecha, que es muy poquito, pero bueno algo esss.
De paso, si es posible, de los que teneis mas capacidad en el tema, me gustaria que me echaseis un cable, ya que me gustaria colocar 2 o 3 sensores y hay me atasco vastante, ya que mi idea es poner la informacion en una pantalla de lcd 20x4, con la que tener controlada la temperatura del coche de ciertas zonas,de momento, y mas adelante en una GLCD, pantalla por cierto que me esta costando aprender un monton.
Una pregunta ya que hay algo que no entiendo, si cambio la frecuencia de 20 Mhz a 4 o 10Mhz en pantalla solo me sale 0.0 grados de temperatura pero si pongo 20 todo perfecto y no doy con la tecla. digo esto por que solo tengo cristales de 4 y 10Mhz. Gracias a quien me pueda explicar el por que.
Este es el codigo en C:



```
#include <16F877A.h>

#device adc=10

#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT     
#use delay (clock=20Mhz)

#include <1wire.c>
#include <lcd.c>
#include <ds18b20.c>

float temperatura;
int min = 20;
int max = 28;


   
void main()
{
 lcd_init();
 
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);


while (1)
{
   
   temperatura = ds18b20_read();

   lcd_gotoxy(1,1);
   printf(lcd_putc,"TEMP: %3.1f ", temperatura);
   lcd_putc(223);
   lcd_putc("C    ");
   delay_us(10);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%d<=>%d",min,max);
   
   if(temperatura <min)
      {
      delay_us(10);
   printf(lcd_putc,"   Frio  ");
   output_high(PIN_D3);
   output_low(PIN_B3);
      }
       else if (temperatura >= min && temperatura <= max){
       
       printf(lcd_putc," Perfecta  ");}
       
        if (temperatura >max){
        printf(lcd_putc,"  Calor   ");
                
   output_low(PIN_D3);
   output_high(PIN_B3);}
     
     if(input(pin_A1)==0){
     max=max+1;}
     if(input(pin_A2)==0){
     max=max-1;}
     if(input(pin_A3)==0){
     min=min+1;}
     if(input(pin_A4)==0){
     min=min-1;}
 }

}
```


----------



## miglo (Dic 24, 2012)

Aqui va un poco mas sobre el tema, con una pantalla lcd 20x4, espero que os guste.
Codigo en C:


```
#include <16F877A.h>
#device adc=10
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT     
#use delay (clock=20Mhz)
#include <1wire.c>
#include <lcd20x4.c>
#include <ds18b20.c>

float temperatura;
int min = 20;
int max = 28;
  
void main()
{
 lcd_init();
 
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);


while (1)
{
   
   temperatura = ds18b20_read();

   lcd_gotoxy(1,1);
   printf(lcd_putc,"TEMP: %3.0f ", temperatura);
   lcd_putc(223);
   lcd_putc("C    ");
   delay_us(10);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Ref(min)= %d",min);
   delay_us(10);
   lcd_gotoxy(1,3);
   printf(lcd_putc,"Ref(max)= %d",max);
   if(temperatura <min)
      {
      delay_us(10);
      lcd_gotoxy(1,4);
   printf(lcd_putc,"   Frio  ");
   output_high(PIN_D3);
   output_low(PIN_B3);
      }
       else if (temperatura >= min && temperatura <= max){
       delay_us(10);
       lcd_gotoxy(1,4);
       printf(lcd_putc," Perfecta  ");}
       
        if (temperatura >max){
        delay_us(10);
        lcd_gotoxy(1,4);
        printf(lcd_putc,"  Calor   ");
                
   output_low(PIN_D3);
   output_high(PIN_B3);}
     
     if(input(pin_A1)==0){
     max=max+1;}
     if(input(pin_A2)==0){
     max=max-1;}
     if(input(pin_A3)==0){
     min=min+1;}
     if(input(pin_A4)==0){
     min=min-1;}
 }

}
```

Una cosa mas si quereis el circuito de como lo he diseñado, no hay problema en subirlo.


----------



## miglo (Feb 8, 2013)

Pues bueno ya que veo que pasa el tiempo y a mi pregunta de como conectar 2 ds18b20 al 16f877A y nadie me da una idea, pues eso, que vuelvo a preguntar, para ver si se os ocurre alguna idea, ya que, dentro de mi lmitacion, he provado todo lo que se me ocurre pero no doy con la manera, decir que mi idea es conectar uno en RA0 y otro en RA1 y poderlo mostrar en pantalla, como lo hecho para un solo sensor.


----------



## D@rkbytes (Feb 8, 2013)

Puedes hacer una función para leer los dos sensores, por ejemplo...

Void Read_DS18B20 (Int1 Sensor){
If (Sensor ==1)
   {
/* Código sensor 1 */

   }
Else
/* Código sensor 2 */

   }

Es una sugerencia.

Saludos.


----------



## miglo (Feb 10, 2013)

No me aclaro de como hacerlo, si no te importa dime que significa = Void Read_DS18B20 (Int1 Sensor)


----------



## D@rkbytes (Feb 10, 2013)

Saludos.
Sería la función para leer los dos sensores, obviamente todas las funciones tienen que saber que sensor controlar.
Por ejemplo, la de reset, escritura y lectura.
Algo así como esto...

```
Int OneWire_Read(Int1 Sensor)
{
Int Count,Data;

   If(Sensor==0)
   {
   For (Count=0; Count<8; ++Count)
   {
   Output_Low(One_Wire_Pin1);                   // Llevar a 0 el Pin RA4
   Delay_Us(2);                                 // Esperar 2uS
   Output_Float(One_Wire_Pin1);                 // Hacer entrada el Pin RA4 (Quedará en alto por Pull up)
   Delay_Us(8);                                 // Esperar a que se estabilice el dispositivo
   Shift_Right(&Data,1,Input(One_Wire_Pin1));   // Cargar el resultado
   Delay_Us(120);                               // Esperar hasta que se lea el fin del bloque.
   }
}
   Else
/* Hacer lo mismo con el otro sensor */  
    For (Count=0; Count<8; ++Count)
   {
   Output_Low(One_Wire_Pin2);
   Delay_Us(2);
   Output_Float(One_Wire_Pin2);
   Delay_Us(8);
   Shift_Right(&Data,1,Input(One_Wire_Pin2));
   Delay_Us(120);
   }
   Return(Data);
}
```
Entonces, si Sensor es 0, se actúa sobre un sensor, caso contrario, se actúa sobre el otro.
¿Ahora comprendes?

Suerte.


----------



## miglo (Feb 12, 2013)

Perdona que haya tardado en contestar.
Vamos haber, no lo entiendo y te explico:
1º No se donde ponerlo ya que lo ponga como lo ponga el compilador me dice error
2º Dices if(sensor==0), o lo que es lo mismo, si sensor es == a 0, que ocurra todo 
lo que pones dentro del for, pero claro como le digo al micro que sensor esta a 0
3º Tambien me pierdo con " output_low(one_wire_pin1);", ya que dices que pone a 0 el
RA4, pero no tiene sentido ya que yo quiero conectar, es mas he puesto, uno en el pin RA0
y otro en el pin RA1.
Espero que entiendas que me voy defenciendo poco a poco y lo que me gustaria es entender 
las instrucciones y el por que, ya que si no las comprendo no voy a ser capaz de hacerlo.


----------



## D@rkbytes (Feb 12, 2013)

miglo dijo:


> Perdona que haya tardado en contestar.
> Vamos haber, no lo entiendo y te explico:
> 1º No se donde ponerlo ya que lo ponga como lo ponga el compilador me dice error
> 2º Dices if(sensor==0), o lo que es lo mismo, si sensor es == a 0, que ocurra todo
> ...


OK. Supuse que tenias algo de conocimientos en C.
Mira, no es difícil de entender.
Vamos a suponer que One_Wire_Pin1 es el sensor que está en el Pin RA0,
y One_Wire_Pin2 es el sensor que está en el Pin RA1.
Entonces a esos pines les ponemos un valor, One_Wire_Pin1 será el 0, y One_Wire_Pin2 será el 1, ¿OK?
Lo que se hará entonces es llamar a cada una de las funciones con el número del sensor que deseas.
Por ejemplo...
Lectura1 = Read_DS18B20 (0); // Leer el sensor 1 (en RA0)
Lectura2 = Read_DS18B20 (1); // Leer el sensor 2 (en RA1)

Como te menciono no es difícil, en cuanto llegue a casa armo la estructura y la subo, para que veas como.



;***********************************************************************
Bien, aquí adjunto el programa controlando dos sensores DS18B20
Incluyo las librerías con las funciones que no comprendías y una simulación del proyecto.

Suerte.


----------



## miglo (Feb 13, 2013)

*OK. Supuse que tenías algo de conocimientos en C.
Mira, no es difícil de entender.
Vamos a suponer que One_Wire_Pin1 es el sensor que está en el Pin RA0,
y One_Wire_Pin2 es el sensor que está en el Pin RA1.
Entonces a esos pines les ponemos un valor, One_Wire_Pin1 será el 0, y One_Wire_Pin2 será el 1, ¿OK?
Lo que se hará entonces es llamar a cada una de las funciones con el número del sensor que deseas.
Por ejemplo...
Lectura1 = Read_DS18B20 (0); // Leer el sensor 1 (en RA0)
Lectura2 = Read_DS18B20 (1); // Leer el sensor 2 (en RA1)
*
Ahora empiezo a entenderlo pero aun con alguna duda y te explico:
Yo intente, y ahora comprendo un pequeño error que cometía, en la librería que tengo de 1Wire, poner #define ONE_WIRE_PIN PIN_A0 y #define ONE_WIRE_PIN PIN_A1 y claro el compilador me decía que estaba duplicando el define, por eso cuando he visto, en la librería que tu has creado 1Wire2, hay como pones los defines:                           #Define One_Wire_Pin1 PIN_A4 y 
#Define One_Wire_Pin2 PIN_A5, que si no te importa, yo por comodidad pondré A0 y A1, espero que no te moleste, es cuando he entendido el por que de duplicado en el compilador.

Tú dices: *Lo que se hará entonces es llamar a cada una de las funciones con el número del sensor que deseas.
Por ejemplo...
Lectura1 = Read_DS18B20 (0); // Leer el sensor 1 (en RA0)
Lectura2 = Read_DS18B20 (1); // Leer el sensor 2 (en RA1)*
Pues yo intente esa idea pero de diferente forma y te explico, declare el pin RA0 y RA1 como canales de entrada para leer los sensores y no habia manera, aunque también te digo que no lo tenia declarado en el código que tengo con un solo sensor y si me funcionaba bien, cosa que no entendía asta que visto lo del *read_ds18b20(0); y read_ds18b20 (1); *
Por otro lado te digo que, visto lo que has hecho, me queda todavía mucho por entender pero que con gente como vosotros es mucho más fácil entender estos temas.
Una pregunta, aprovechándome un poquito del tema, tu me dices si es correcto o no, si yo quisiera poner 3 sensores, tal y como tu has hecho, pero añadiendo un else, me explico tu pones *if (sensor==0) *y luego else, y yo te pregunto declaro los 3 define y todo lo demás y entonces lo hago con if, elseif y else, ¿Qué opinas? podría funcionar?.


----------



## D@rkbytes (Feb 13, 2013)

miglo dijo:


> en la librería que tu has creado 1Wire2, hay como pones los defines:
> #Define One_Wire_Pin1 PIN_A4 y #Define One_Wire_Pin2 PIN_A5,
> que si no te importa, yo por comodidad pondré A0 y A1, espero que no te  moleste, es cuando he entendido el por que de duplicado en el  compilador.


OK. Cosas que pasan, y no importa si modificas cualquier cosa de las librerías. (Son Freeware) 


miglo dijo:


> *Lectura1 = Read_DS18B20 (0); // Leer el sensor 1 (en RA0)
> Lectura2 = Read_DS18B20 (1); // Leer el sensor 2 (en RA1)*
> Pues yo intente esa idea pero de diferente forma y te explico, declare   el pin RA0 y RA1 como canales de entrada para leer los sensores y no había manera, aunque también te digo que no lo tenia declarado en el   código que tengo con un solo sensor y si me funcionaba bien, cosa que no   entendía hasta que he visto lo del *read_ds18b20(0); y read_ds18b20 (1); *
> Por otro lado te digo que, visto lo que has hecho, me queda todavía   mucho por entender pero que con gente como vosotros es mucho más fácil   entender estos temas.


Lo ves, cada día se aprende algo nuevo. Y gracias. 


miglo dijo:


> Una pregunta, aprovechándome un poquito del tema, tu me dices si es  correcto o no, si yo quisiera poner 3 sensores, tal y como tu has hecho,  pero añadiendo un else, me explico tu pones *if (sensor==0) *y  luego else, y yo te pregunto declaro los 3 define y todo lo demás y  entonces lo hago con if, elseif y else, ¿Qué opinas? podría  funcionar?.


Sip. Si debe funcionar y aquí pongo una muestra con 4 sensores, así que inténtalo. 

Suerte.


----------



## miglo (Feb 14, 2013)

Gracias campeón, me pongo manos a la obra y nada mas que lo tenga, si soy capaz, espero que si, lo pongo.
venga un saludo.


----------



## miglo (Feb 17, 2013)

Bueno pues como lo prometido es deuda, y aunque me ha costado un poco pues aqui esta con 3 sensores y una lcd de 20x4, espero que te guste y va por ti, gracias por haberme hechado un grandisimo cable. Si ves algo raro dimelo, entiende que voy poco a poco.


----------



## D@rkbytes (Feb 17, 2013)

miglo dijo:


> Bueno pues como lo prometido es deuda, y aunque me ha costado un poco pues aquí esta con 3 sensores y una lcd de 20x4, espero que te guste y va por ti, gracias por haberme echado un grandisimo cable. Si ves algo raro dímelo, entiende que voy poco a poco.


Tras algunas modificaciones para poder compilar el programa que subiste, lo adjunto con los cambios.
Algunas funciones no estaban bien terminadas y las corregí de otra forma.
Como no incluiste la librería que usaste para controlar el LCD, use la de CCS. (LCD420.C)
También modifique el diseño de la simulación para evitar la sobre carga de memoria.
Como dato extra, también se puede hacer uso de la instrucción Switch para tal efecto.

Bien, pues ya tienes la base y podrás modificarlo a tu gusto para lo que requieras hacer.

PD. Gracias por el agradecimiento en el programa. 

Saludos.


----------



## miglo (Feb 18, 2013)

Mil gracias, un fallo lo de la libreria lcd, no me di cuenta, te la adjunto, la que has puesto tu la tengo pero con una pequeña modificacion para que al hacer el esquema me quede esteticamente mejor.
Tienes razon en lo de la sobrecarga de memoria, tampoco habia caido en ese detalle.
Una ultima pregunta, si no te importa, ¿por que cuando hago la prueba en proteus en la pantalla cada vez que hace la lectura de los sensores se ve como si se resetease la lectura de las temperaturas?, digo esto por que, si se puede evitar, como imagen queda mas bonito.
Te comento de paso que con un poquito de paciencia lo colocare para tener un poco mas controlada la temperatura en mi vieja renault kangoo y para mejorar el control, en el reactor, de mi produccion casera de biodiesel.
bueno un saludote y yo creo que este tema, gracias a ti a quedado muy majo, ¿no te parece?.


----------



## D@rkbytes (Feb 18, 2013)

miglo dijo:


> Mil gracias, un fallo lo de la librería lcd, no me di cuenta, te la adjunto, la que has puesto tu la tengo pero con una pequeña modificación para que al hacer el esquema me quede estéticamente mejor.


OK. Ya hice pruebas con la librería y funciona bien, salvo que produce advertencias por contención lógica.
Esto en proteus, ya que físicamente no hay problemas al mostrar los datos en la pantalla.
No tengo una de 20x4 como la de tu proyecto, pero hice las pruebas con una de 16x2 y todo bien.


miglo dijo:


> Una última pregunta, si no te importa, ¿por que cuando hago la prueba en  proteus en la pantalla cada vez que hace la lectura de los sensores se  ve como si se resetease la lectura de las temperaturas?, digo esto por  que, si se puede evitar, como imagen queda mas bonito.


Eso es normal al estar borrando la pantalla cada vez que se muestra una nueva lectura de datos.
Y se realiza aquí: printf(lcd_putc,"\fTemp1: %03.2f ßC   ",temp1);
\f es el comando para borrar la pantalla, y \n es el comando para pasar a la siguiente línea.
Se puede evitar el parpadeo de la pantalla si se hace esto.

```
lcd_gotoxy(1,1);
   printf(lcd_putc,"Temp1: %03.2f ßC     ",temp1);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Temp2: %03.2f ßC     ",temp2);
   lcd_gotoxy(1,3);
   printf(lcd_putc,"Temp3: %03.2f ßC     ",temp3);
```
Con los espacios que se colocan después de mostrar los datos, se garantiza borrar todos los caracteres.
Y ahí ya van 5 espacios por línea, que harán que se borren los caracteres que existan de una escritura previa.


miglo dijo:


> Te comento de paso que con un poquito de paciencia lo colocare para  tener un poco mas controlada la temperatura en mi vieja renault kangoo, y  para mejorar el control en el reactor de mi producción casera de  biodiesel.
> Bueno un saludote y yo creo que este tema, gracias a ti a quedado muy majo, ¿no te parece?.


Bien hecho, algo vi sobre eso en Discovery Channel, y me parece muy bien. 
Y pues si, ya cambio de 2 sensores a 3, y como te diste cuenta, se puede aumentar la cantidad sin problemas.
El problema es que con cada sensor agregado, se va aumentando el tiempo de proceso.

Bien, pues ahora agrega esas nuevas líneas de código y ve como funciona la pantalla con ese cambio.

Suerte, y gracias por los comentarios.


----------



## juankry (Jun 13, 2013)

Hola, una preguntilla, ¿es posible poner dos termómetros en un mismo bus one wire, o hay que ubicarlos en buses diferentes? Tengo entendido que con un solo bus se pueden controlar varios dispositivos one wire, lo que ya no se es si se puede con dos dispositivos iguales.


----------



## ricbevi (Jun 13, 2013)

juankry dijo:


> Hola, una preguntilla, ¿es posible poner dos termómetros en un mismo bus one wire, o hay que ubicarlos en buses diferentes? Tengo entendido que con un solo bus se pueden controlar varios dispositivos one wire, lo que ya no se es si se puede con dos dispositivos iguales.



Hola..se puede controlar mas de un dispositivo en el mismo "bus"( no recuerdo cuantos pero el identificador es de 64bit) aunque sean del mismo tipo debido a que cada uno tiene un identificador único...el problema pasa por "hacerse" de  dicho identificador con un "bus" con varios dispositivos "hablando" y depurar el de todos ellos para después direccionar la informacion de cada dispositivo en sí. 
Saludos.

Ric.


----------



## juankry (Jun 14, 2013)

Hola,

Muchas gracias por contestar, ya tengo dos termómetros funcionando en un mismo bus one wire, lo que hago es, como bien dices, en primer lugar identificar e número de termómetros que hay en el bus y su código de 64 bit, los almaceno en una variable de arrays, destinada para tal fin (asocio un código al dispositivo 1, 2, 3 ...), para finalmente leer el termómetro que yo elija.

Me he ayudado de una biblioteca en c que encontré en la red (la cual he adaptado a mi biblioteca one wire), del manual del ds18b20 y del driver one wire creado por mi para mi MCU.

Lo único extraño que no logro averiguar es lo siguiente:

Mi MCU te da la opción de configurar la patilla en modo Pull-up, sin necesidad de colocar resistencia de pull-up, pues bien, si configuro la patilla como no-pull y le coloco la resistencia de 4k7 de pull-up no me funciona el bus one wire, sin embargo, sin resistencia y configurando la patilla como pull-up sí.

Por poner un ejemplo, con el bus I2C, me funciona de las dos maneras, pero prefiro ponerlo con resistencias externas, así que con el one wire me conformaré con que me funcione.

Es un poco lioso de explicar... lo se.

De todas formas solo escribía para darte las gracias puesto que tu post, aunque no lo creas, me ha ayudado mucho para conseguir que todo funcione.

saludos,

juankry


----------



## ricbevi (Jun 14, 2013)

juankry dijo:


> Hola,
> 
> Muchas gracias por contestar, ya tengo dos termómetros funcionando en un mismo bus one wire, lo que hago es, como bien dices, en primer lugar identificar e número de termómetros que hay en el bus y su código de 64 bit, los almaceno en una variable de arrays, destinada para tal fin (asocio un código al dispositivo 1, 2, 3 ...), para finalmente leer el termómetro que yo elija.
> 
> ...




Ok...Entiendo que te funciona con el  Pull-up interno programable del MCU pero no al des-habilitar el mismo y hacerlo mediante una resistencia externa...es extremadamente raro pero no se que MCU estas usando y como tiene implementada dicha salida/entrada en cuanto al hardware interno en el momento que se des-habilitan dichas "resistencia"...en los proyectos que he echo no he tenido la necesidad de compartir el bus así que por simplicidad a la hora de programar y viendo las complicaciones que acarreaba el echo de identificar los dispositivos opte por tenerlos independientes y alimentados externamente así como su Pull-up.
Ric.


----------



## jjimmy (Sep 10, 2013)

hola darbyte disculpa con que programa puedo  compilar tu archivo que dejas 
y con que programa funciona su archivos que dejan por que yo lo quiero compilar en mikroC v6.0 y me sale error


----------



## D@rkbytes (Sep 10, 2013)

jjimmy dijo:


> Hola D@rkbytes. Disculpa, ¿con que programa puedo  compilar tu archivo que dejas?
> ¿Y con que programa funcionan sus archivos que dejan, porque yo lo quiero compilar en mikroC v6.0 y me sale error?


Está escrito en PICC y compilado con PCWHD Compiler de CCS.

Saludos.


----------



## jjimmy (Sep 10, 2013)

entonces el programa se llama PCWHD compiler ccs
como podria adquirirlo


----------



## D@rkbytes (Sep 10, 2013)

jjimmy dijo:


> entonces el programa se llama PCWHD compiler ccs
> ¿cómo podría adquirirlo?


Si, así es como se llama: CCS C Compiler o PCHWD Compiler de la compañía CCS.
Desde la página oficial puedes realizar la compra o descargar un demo.
http://www.ccsinfo.com/downloads.php


----------



## jjimmy (Sep 11, 2013)

D@rbytes ¿Con este programa lo escribo en c y ah*í* mismo me genera el .hex?



¿Con este programa escribo el texto y genero el .hex o tengo que jalarlo de otra carpeta para generar el .hex?


----------



## D@rkbytes (Sep 11, 2013)

jjimmy dijo:


> D@rbytes ¿Con este programa lo escribo en c y ah*í* mismo me genera el .hex?
> 
> 
> 
> ¿Con este programa escribo el texto y genero el .hex o tengo que jalarlo de otra carpeta para generar el .hex?


Si, ese programa tiene el editor y el compilador entre otras herramientas para el desarrollo de programas con PIC.
Busca por aquí en el Foro los cursos y tutoriales que hay sobre programación en C con el CSS.
En Internet también podrás encontrar mucha información al respecto.

Saludos.


----------



## jjimmy (Oct 3, 2013)

hola darbyte el archivo que pusiste en .rar de 3 ds1820 con lcd cuando lo compilo en ccs me sale error la libreria 3wire y lcd20x4


----------



## D@rkbytes (Oct 3, 2013)

jjimmy dijo:


> hola Darbytes el archivo que pusiste en .rar de 3 ds1820 con lcd cuando lo compilo en ccs me sale error la librería 3wire y lcd20x4


Los programas que adjunté anteriormente fueron compilados con CCS PCM C Compiler, Version 4.130
Asegúrate que tu compilador esté actualizado, ya que la librería LCD420.C se encuentra en esa versión de CCS y no es de libre distribución.

Los archivos 1Wire y DS18B20 (de libre distribución) se fueron modificando como se fue requiriendo en los programas adjuntos, pero se agregaron en cada proyecto.

Suerte.


----------



## remondino (Oct 27, 2013)

Estaba leyendo el tema de conectar dos o más ds18b20, no se nada de C porque uso siempre assembler, se puede conectar muchos sensores sobre un mismo port, yo hice un programita en el cual se transmite al sensor el código de lectura de ROM y te devuelve su address, anotas estas direcciones de cada uno de ellos, después en el programa principal antes de pedirle que lea la temperatura transmitimos el address del sensor que queremos y a continuación el pedido de lectura de temperatura y sólo va a contestar el que corresponda con el address enviado, si de algo te sirve te mandó los dos programitas (en assembler)


----------



## planchibus (Nov 11, 2013)

miglo dijo:


> Pues bueno ya que veo que pasa el tiempo y a mi pregunta de como conectar 2 ds18b20 al 16f877A y nadie me da una idea, pues eso, que vuelvo a preguntar, para ver si se os ocurre alguna idea, ya que, dentro de mi lmitacion, he provado todo lo que se me ocurre pero no doy con la manera, decir que mi idea es conectar uno en RA0 y otro en RA1 y poderlo mostrar en pantalla, como lo hecho para un solo sensor.



No se si te ayudará esto pero yo he hecho uno parecido con un sensor para picaxe.


----------



## remondino (Nov 12, 2013)

Insisto sobre el tema de como conectar dos o mas DS18B20, Yo hice en asembler pero evidentemente se puede hacer en C o cualquier otra forma. La idea es la siguiente primero hice un programa en que se conecta un solo sensor por vez, se envia primero el SKIP ROM (CCh) a continuacion el REED ROM (33h), luego los pulsitos de clock y se lee lo que devuelve el DS18B20, grabo estos los ocho byte en la EEPROM del PIC, saco el PIC y en el programador leo lo que hay en la primeras posiciones de la EEPROM eso es la direccion que tiene grabada ese DS18B20, hago lo mismo con todos los sensores que quiero conectar juntos. Ahora el programa que realmente lee las temperaturas funciona asi, despues del RESET en envia un SKIP ROM a continuacion un CONVER T (44h) y "todos juntos" los DS18B20 pasan a medir la temperatura y guardan ese dato en su memoria, despues se envia nuevamente el RESET luego el MATCH ROM (55h) luego los ocho byte correspondiente al lector que querramos, luego el READ SCRATCHPAD [BEh] y a continuacion los pulsitos y solamente el sensor que corresponda con esa direccion responde, despues hacemos los mismo con los otros sensores, las temperaturas despues las mostramos en LCD o lo que sea, ese es otro asunto, espero haber sido claro y poder transmitir esa experiencia


----------



## XSGAV (Dic 3, 2013)

Como le agrego al mismo proyecto para variar la temperatura, ya sea con push button o potenciometro, que varie de 35 a 90°c, alguien tendra algo parecido?


----------



## miglo (Dic 4, 2013)

planchibus gracias por tu documentacion, ya hace tiempo que lo solucione gracias D@rkbytes, aunque la idea de remondino me parece muy buena.


----------



## D@rkbytes (Dic 4, 2013)

miglo dijo:


> gracias D@rkbytes, aunque la idea de remondino me parece muy buena.


¿Algo así cómo el sistema que adjunto?

El proyecto aún tiene detalles, pero funciona. 

Saludos.


----------



## miglo (Dic 4, 2013)

Ya te digo, eso esta muy bien.
Te crearia algun problema poner un trozito del codigo con la explicacion de las funciones, para entenderlo, si no es posible lo entiendo y no pasa nada.
Con ese sistema te ahorras cantidad de cables que no veas, es una pasada.


----------



## D@rkbytes (Dic 4, 2013)

miglo dijo:


> Te crearía algun problema poner un trozito del código con la explicación de las funciones, para entenderlo, si no es posible lo entiendo y no pasa nada.


Por lo general suelo poner el código completo, pero esta vez me gustaría que lo intentaran antes de subirlo. 

Por aquí están los métodos a usar y mucha información: Maxim DS18B20 Technical Documents

Saludos.


----------



## rabinator (Feb 2, 2014)

Hola que tal, si bien este tema es medio viejito espero que no les moleste mi pregunta 
Que cambios debo hacerle al codigo del 16f877 + 2 ds18b20 para hacerlo funcionar en un 16f628a?
eh metido mano y logro leer un sensor pero el otro parece no leerlo, alguien podria guiarme un poco?

Desde ya gracias


----------



## D@rkbytes (Feb 2, 2014)

rabinator dijo:


> ¿Qué cambios debo hacerle al código del 16F877 + 2 DS18B20 para hacerlo funcionar en un 16F628A?
> He metido mano y logro leer un sensor pero el otro parece no leerlo.
> ¿Alguien podría guiarme un poco?


Son mínimos los cambios, pero mejor adjunto el proyecto modificado para un PIC16F628A para que compares.

Suerte.


----------



## Juxn3 (Jun 20, 2014)

Bueno he visto la simulacion de D@rkbytes y me parece espectacular, tengo una pregunta especifica, como haces para leer la ROM de varios sensores cuando todos estan conectado en el mismo pin, trabajo en BASIC C y usando la idea de remondino he logrado leer la temperatura de varios sensores, pero solo si ya he leido previamente la ROM de cada uno por separado y usando el 55h para selecionar cada sensor.


----------



## D@rkbytes (Jun 21, 2014)

Juxn3 dijo:


> Bueno he visto la simulacion de D@rkbytes y me parece espectacular, tengo una pregunta especifica, como haces para leer la ROM de varios sensores cuando todos estan conectado en el mismo pin, trabajo en BASIC C y usando la idea de remondino he logrado leer la temperatura de varios sensores, pero solo si ya he leido previamente la ROM de cada uno por separado y usando el 55h para selecionar cada sensor.


Mira por aquí: Dallas DS18B20, 1 wire bus, +/-, multi device, Light codes.
Tal vez esto te ayude a resolver tus dudas.

saludos.


----------



## miglo (Ene 8, 2015)

Bueno. Pues después de bastante tiempo intentando a mi manera y cómo no, con la inestimable ayuda que me aporta D@rkbytes, pues tengo terminado y listo para montar y probar este controlador de temperatura con un DS18B20, el cual por un error mío no tiraba para delante. Al final explicaré el error.

Me gustaría, si es posible, me digáis donde he cometido algún error, ya que cuando lo pruebo en proteus, aunque va como yo quiero, me marca enseguida la saturación de CPU a niveles altos incluidos 100%.
La casi totalidad de las ideas del programa vienen dadas por D@rkbytes, no sé si las he entendido bien pero lo he intentado.

El gran error al que me refería y espero que os sirva alguna vez como ejemplo de lo mala que es la confianza, y encima que me pase a mi aún, es doblemente peor, ya que como técnico que soy se supone que no me debería haber pasado. "Grave error de confianza".
Es que cuando terminé de montar la placa con los componentes el LM7805, todavía no sé como, lo monté al revés, con lo que cada vez que lo miraba estaba seguro de que estaba bien puesto, y lo mas curioso es que se calentaba.
Después de cambiar 3, le echaba la culpa a los chinos, porque pensaba que los que compré eran defectuosos.
Menos mal que se me ocurrió mirar en Internet. Todavía me estoy dando golpes en la cabeza. Jejeje.

Adjunto archivo rar.


----------



## D@rkbytes (Ene 8, 2015)

miglo dijo:


> Me gustaría, si es posible, me digáis donde he cometido algún error, ya que cuando lo pruebo en proteus, aunque va como yo quiero, me marca enseguida la saturación de CPU a niveles altos incluidos 100%


Lo único que tienes que hacer para reducir la carga de CPU, es cambiar la resistencia pull-up del DS18B20 de análoga a digital.

Igualmente para otras resistencias que realicen algún tipo de conmutación. (Por ejemplo, LED's o transistores.)
En la simulación es mejor que algunas resistencias sean digitales para evitar la sobrecarga.


----------



## miglo (Ene 8, 2015)

Sí señor, ese era el problema. Gracias de nuevo, D@rkbytes.
Lo que no entiendo es el por qué de que se sature, si se supone que no debería influir como lo hace. Pero bueno, ya sé algo más.
Una pregunta: ¿Se supone que sólo afecta en el programa de proteus, verdad?


----------



## D@rkbytes (Ene 9, 2015)

miglo dijo:


> Lo que no entiendo es el por qué de que se sature, si se supone que no debería influir como lo hace. Pero bueno, ya sé algo más.


Se satura el programa por la cantidad de datos a los que está siendo expuesta la resistencia.
Al trabajar en modo análogo, se está comportando como una resistencia normal y eso es lo que produce la sobrecarga.


miglo dijo:


> Una pregunta: ¿Se supone que sólo afecta en el programa de proteus, verdad?


Así es. Eso únicamente ocurrirá en el simulador, en el montaje físico no existe ese tipo de problema.


----------



## picnoob (Nov 16, 2015)

Buenas, estoy tratando de hacer funcionar el codigo con un pic 16f887 pero me arroja valores negativos, no se si es porque desactive el delay por medio del crystal.

Se agradece la ayuda.

Adjunto archivo en ccs y proteus con 16f887


----------



## MrCarlos (Nov 16, 2015)

Hola picnoob

En el archivo main.h tienes definido esto: #use delay(clock=8000000) pero el PIC tiene programado 1MHz.
Lo cambié y ya no da valores negativos.

saludos
a sus ordenes


----------



## picnoob (Nov 16, 2015)

MrCarlos dijo:


> Hola picnoob
> 
> En el archivo main.h tienes definido esto: #use delay(clock=8000000) pero el PIC tiene programado 1MHz.
> Lo cambié y ya no da valores negativos.
> ...



Gracias!  El que no sabe es como el que no ve.

Ahora mi pregunta es, este pic tiene oscilador interno, ya lo he utilizado antes, pero este circuito trae con crystal, si elimino esta parte del circuito sera que funcionara correctamente?


----------



## D@rkbytes (Nov 17, 2015)

Debe funcionar igual, porque no necesitas conteos de precisión y tampoco frecuencias de operación elevadas.
La salida del DS18B20 es digital, así que no debe preocuparte el tipo de oscilador.


----------



## ingeniero18 (Abr 10, 2016)

Gente!!! Primero que nada, hace rato que vengo buscando info de cómo conectar este sensor a un pic, y es la primera vez que encuentro algo concreto y que ande.
Mis conocimientos de programación son mínimos, pero tengo ganas de agregar unas cosillas al proyecto.
La idea principal sería un PIC con lcd y un sensor DS18B20 (tal cual como comenzaron hablando en este tema del foro) pero me gustaría agregar a esto que los valores de temperatura puedan almacenarse en una tarjeta SD o pendrive y que, mediante un real time clock, almacenar también los datos de fecha y hora para cada valor de temperatura. Mi consulta inicial sería cómo puedo comenzar a conectar la SD y el RTC y, dicho sea de paso, en qué formato podrían quedar los valores almacenados para luego verlos en una PC.

Muchas gracias!!!!


----------



## D@rkbytes (Abr 13, 2016)

ingeniero18 dijo:


> Mi consulta inicial, sería. ¿Cómo puedo comenzar a conectar la SD y el RTC? Y dicho sea de paso. ¿En qué formato podrían quedar los valores almacenados para luego verlos en una PC?


La conexión de una memoria SD o uSD es por SPI y el RTC, por ejemplo, un DS1307, es por I2C.
El formato depende de la forma de obtener las lecturas.
Y se pueden guardar como Float o Word usando 4 bytes, o se pueden dividir las lecturas y guardarlas como bytes.


----------



## ingeniero18 (Abr 13, 2016)

D@rkbytes dijo:


> La conexión de una memoria SD o uSD es por SPI y el RTC, por ejemplo, un DS1307, es por I2C.
> El formato depende de la forma de obtener las lecturas.
> Y se pueden guardar como Float o Word usando 4 bytes, o se pueden dividir las lecturas y guardarlas como bytes.


Gracias por el aventón!!! Voy a arrancar por eso y con unos pdf q encontré en internet. 
Si alguien más tiene más para adentrar en el tema sería genial. 
Gracias!!!


----------



## AleSergi (Abr 13, 2016)

no recuerdo... creo que el DS1305 era por SPI...
algun ahorro de pines al manejarlo desde el mismo bus que las SD.


----------



## D@rkbytes (Abr 13, 2016)

Si, el DS1305 se controla por SPI, pero el DS1307 que mencioné, se controla por I2C, menos pines y más sencillo.

Existen módulos listos para usar.

Este módulo RTC con DS1307 ya cuenta con todo lo necesario, hasta con batería y una EEPROM 24LC32


Y este otro es un adaptador para micro SD por SPI.

Si no hay que almacenar muchos datos, yo optaría por usar la memoria interna del PIC.​


----------



## SEBAS9878 (Jul 19, 2017)

*H*ola*,* soy nuevo y estoy montando un circuito con el sensor ds18b20 *,* Pic 16f877a y lcd 2x 16 para mi pecera*,* ya tengo todo pero estoy estudiando c*ó*mo utilizarlo ya que solo he manejado el lm35 pero ese no se puede sumergir*, *entonces*, *cualquier cosa puedo solicitar su ayuda?


----------



## george.manson.69 (Jul 19, 2017)

Puedes Revisar este tema hay un ejemplo y libreria para trabajar con el sensor de temperatura DS18B20

https://www.forosdeelectronica.com/f24/probando-ejemplos-xc8-99800/


----------



## SEBAS9878 (Ago 6, 2017)

Hola

*E*stoy montando un control de temperatura para mi pecera con el ds18b20 y pic 16f877a y no me lee el sensor*, ¿A*lguien me puede ayudar*?,*  adjunto programa y esquema


----------



## D@rkbytes (Ago 7, 2017)

El programa está muy mal estructurado y contiene bastantes declaraciones que no son necesarias.

Fuera de eso, el problema lo tienes en la librería DS18B20.C
En la función ds1820_read(); debes seleccionar el resultado para un DS18B20 y dejar comentado (//) el resultado para un DS18S20.


----------



## SEBAS9878 (Ago 7, 2017)

*B*uenos dias 

*S*er*á* que usted me*_*puede ayudar*? E*s que es la primera vez que utilizo ese sensor y lo que he hecho es basado en lo que he encontrado en internet*,*  le agradeceria


----------



## D@rkbytes (Ago 7, 2017)

Saludos. Ya te mencioné lo que se tiene qué hacer.
Aquí te dejo la parte del cambio en la librería DS18B20.C

```
//result = (float) temp3 / 2.0;   //Calculation for DS18S20 with 0.5 deg C resolution 
result = (float) temp3 / 16.0;  //Calculation for DS18B20 with 0.1 deg C resolution
```
Como verás, sólo es cambiar un tipo de resultado por otro.


----------



## Cesareus (Oct 11, 2018)

Hola, estoy tratando de implementar la librería modificada para 2 sensores en un 16f886 uso proteus 8.5 para simular y el compilador pcwhd. implementando la librería para un solo sensor no tuve inconvenientes, pero con estas en 0.5 ° de precisión me da 0° en display y con 0.1 me da -0.6°. No se donde puedo haber cometido el error o si es algún inconveniente del compilador o el emulador. Adjunto el comprimido. Desde ya gracias por la respuesta y la ayuda.


----------



## D@rkbytes (Oct 11, 2018)

Cesareus dijo:


> No sé dónde puedo haber cometido el error o si es algún inconveniente del compilador o el emulador.


Es un problema en el simulador, muy común cuando se usan resistencias pull-up.
Solución: Establecer la propiedad de las resistencias que serán pull-up/down como digitales en lugar de análogas.


----------



## Cesareus (Oct 12, 2018)

Genial. Tema resuelto. 1000 gracias por responder!.


----------

