Medidor de mperatura y presion para coche

Hola que tal? buenas tardes a todos quería comentar un pequeño problema que me trae de cabeza así que cuento la historia desde el principio, estoy liado con un proyecto para ponerle al coche unos sensores uno que mida la temperatura del anticongelante y otro que mida la presión d aceite que previamente e buscado y personalizado a mi gusto, los dos funcionan correctamente, y me dije, y si combino los dos skect para poder leer las mediciones en un solo LCD y así ahorrar espacio, e combinado los dos y perfecto compila carga, y escinde como se puede ver en la pantalla de abajo el problema viene cuando pongo el pin de señal del sensor DS18B20 en ese momento se queda la plantalla en blanco es decir desaparecen todos los caracteres.
Añado que es un sensor de presión analógico, estoy usando un Arduino Nano, y el sensor de temperatura es del tipo DS18B20 el pin del sensor de temperatura es D10 y el del sensor de presión A0 asi que no debería a ver conflicto e revisado las posiciones de os caracteres y todo correcto, asi que mi saber no da para mas, dejo el skech a ver si alguien encuentra el error.
Otro dato a añadir por si sirve de algo es que el skech original estaba pensado para una pantalla de 20x4 LCD y le hice los cambios pertinentes para que funcionara en una pantalla 16x2 LCD pero dudo que venga de hay el problema.
Creo que son todos los datos que puedo aportar a parte del skech que dejare abajo. Muchas gracias de antemano si e cometido algun eror a la hora de postear pido disculpas de antemano, Gracias

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // libreria para que funcione el display 20X4
LiquidCrystal_I2C lcd (0x27, 16, 2);  // encuentran conectados RS, E, D4, D5, D6, D7
#include <OneWire.h>
OneWire  ds(10);

int ibut = 10 ;     // ibut PIN10 de entrada para el control del botón
int tiempo = 1000 ;    // Tiempo para dar tiempo a retirar el dedo del botón hasta hacer otra lectura
int estadoboton = 0 ;   // Variable para guardar el estado del boton LOW (bajo = 0) o HIGH (alto = 1)
int vista = 1 ;    // Primera vez controla lo que se hace únicamente en el primer bucle, luego se le cambia de valor


int SENSOR;   // variable almacena valor leido de entrada analogica A0
float PRESION;  // valor de presion en en decimales
float SUMA;   // valor de la suma de las 5 lecturas de presion

void setup(void) {                                // encender el LDC 16x2
    Serial.begin(9600);
    Wire.begin();
    lcd.begin (16,2) ;
    lcd.backlight();                    // terminar con luz de fondo encendida   
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print("C");
    lcd.setCursor(9,1); 
    lcd.print((char)223);
    lcd.setCursor(0, 1);
    lcd.print("ACEITE");
    lcd.setCursor(10, 1);
    lcd.print(":");
    pinMode(ibut, INPUT);  // En el PIN 10 entra la medida del circuito del buton abrimos como lNPUT
    delayMicroseconds(50);

 }

void loop() {

  switch (vista) {
 
  case 1:
   SUMA = 0;         // valor inicial de SUMA en cero
  for (int i=0; i < 5; i++){      // bucle que repite 5 veces
  SENSOR = analogRead(A0);      // lectura de entrada analogica A0
  PRESION = map(SENSOR, 102, 921, 0, 20.7);                           // Funcion map () entre 0.5 a 4.5V con 0 a 20.7 psi (lectura de entrada analogica A0)
  SUMA = PRESION + SUMA;      // suma de cada lectura de presion
  delay(200);         // demora de medio seg. entre lecturas
  }
  lcd.setCursor(7, 0);        // cursor en primer fila y primer columna
  lcd.print("BAR:  ");        // escribe Pres:
  lcd.print(SUMA/5.0, 1);     // escribe valor promedio de 5 lecturas con un decimal
  lcd.setCursor(0, 0);        // cursor en primer fila y primer columna
  lcd.print("ACEITE");        // imprime psi

  if ( digitalRead(ibut) == HIGH ) {
            lcd.clear();
            vista = 1;
            delay(200);      
 
          }

  break;
    }

   byte i;
   byte present = 0;
   byte type_s;
   byte data[12];
   byte addr[8];
   float celsius, fahrenheit;
   if(!ds.search(addr)){
      ds.reset_search();
      delay(250);
      return;
   }
   if(OneWire::crc8(addr, 7) != addr[7]) {
      return;
   }
   switch(addr[0]){
   case 0x10:
      type_s = 1;
      break;
   case 0x28:
      type_s = 0;
      break;
   case 0x22:
      type_s = 0;
      break;
   default:
      return;
   } 
   ds.reset();
   ds.select(addr);
   ds.write(0x44, 1);
   delay(1000);
   present = ds.reset();
   ds.select(addr);    
   ds.write(0xBE);
   for( i = 0; i < 9; i++){
      data[i] = ds.read();
   }
   int16_t raw = (data[1] << 8) | data[0];
   if(type_s){
      raw = raw << 3;
      if(data[7] == 0x10) {
         raw = (raw & 0xFFF0) + 12 - data[6];
      }
   }else{
      byte cfg = (data[4] & 0x60);
      if (cfg == 0x00) raw = raw & ~7;
      else if (cfg == 0x20) raw = raw & ~3;
      else if (cfg == 0x40) raw = raw & ~1;
   }
   celsius = (float)raw / 16.0;
   Serial.println(celsius,1);
   lcd.setCursor(12, 1);
   lcd.print(celsius,1);
}

¿Por que el pin del DS18B20 es el mismo que el de ibut?

```
OneWire  ds(10);

int ibut = 10 ;     // ibut PIN10 de entrada para el control del botón
```

Estoy revisando el esquema ibut 10 es el pin donde va un pulsador que se usa para cambiar la lectura de PSI a BAR, como borre del skeck las mediciones PSI no tuve en cuanta eso y lo di por solucionado, pero llevas razón mil gracias, solo con cambiar ese valor de 10 a 11 se soluciona el problema o borro la línea directamente?

map() trabaja con enteros y devuelve un entero, esto

PRESION = map(SENSOR, 102, 921, 0, 20.7);

nunca te va a dar 20.7 (ni ningún otro valor con decimales) porque los enteros no tienen decimales.
Por la misma razón no tendría sentido que PRESION sea float.
Pero hay una solución, haz así

PRESION = map(SENSOR, 102, 921, 0, 207) / 10.0; 

es importante que la división sea por 10.0 para que sea una operación "no entera" y devuelva un resultado tipo float (y no trunque los decimales).

Saludos

Cambia el valor de ibut y por supuesto conecta el botón en el pin 11.

Poniendo un 11 se soluciona aun asi tambien e probado asi.

OneWire  ds(9);

y funciona si lo pongo en el pin 9 tambien valdria? en el fondo cambiando hay de 10 a 9 estoy dando orden de que la entrasa del sensor de temperatura es el 9? tambien e seguido el condejo de Gatul mil gracias

Si, claro, puedes cambiar el pulsador al 11 o el sensor al 9 (tal como lo has hecho).

Fijate lo que te marqué sobre el cálculo de la presión.

Saludos y :clap: :clap: :clap:

Aunque lo de float no se muy bien lo que es, pero lo importanre es que funciona, dejo como a quedado el skech por si a alquien le interesa junto con los esquemas.

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // libreria para que funcione el display 20X4
LiquidCrystal_I2C lcd (0x27, 16, 2);  // encuentran conectados RS, E, D4, D5, D6, D7
#include <OneWire.h>
OneWire  ds(10);

int ibut = 11 ;     // ibut PIN10 de entrada para el control del botón
int tiempo = 1000 ;    // Tiempo para dar tiempo a retirar el dedo del botón hasta hacer otra lectura
int estadoboton = 0 ;   // Variable para guardar el estado del boton LOW (bajo = 0) o HIGH (alto = 1)
int vista = 1 ;    // Primera vez controla lo que se hace únicamente en el primer bucle, luego se le cambia de valor


int SENSOR;   // variable almacena valor leido de entrada analogica A0
float PRESION;  // valor de presion en en decimales
float SUMA;   // valor de la suma de las 5 lecturas de presion

void setup(void) {                                // encender el LDC 16x2
    Serial.begin(9600);
    Wire.begin();
    lcd.begin (16,2) ;
    lcd.backlight();                    // terminar con luz de fondo encendida   
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print("C");
    lcd.setCursor(9,1); 
    lcd.print((char)223);
    lcd.setCursor(0, 1);
    lcd.print("ACEITE");
    lcd.setCursor(10, 1);
    lcd.print(":");
    pinMode(ibut, INPUT);  // En el PIN 10 entra la medida del circuito del buton abrimos como lNPUT
    delayMicroseconds(50);

 }

void loop() {

  switch (vista) {
 
  case 1:
   SUMA = 0;         // valor inicial de SUMA en cero
  for (int i=0; i < 5; i++){      // bucle que repite 5 veces
  SENSOR = analogRead(A0);      // lectura de entrada analogica A0
  PRESION = map(SENSOR, 102, 921, 0, 20.7);                           // Funcion map () entre 0.5 a 4.5V con 0 a 20.7 psi (lectura de entrada analogica A0)
  SUMA = PRESION + SUMA;      // suma de cada lectura de presion
  delay(200);         // demora de medio seg. entre lecturas
  }
  lcd.setCursor(7, 0);        // cursor en primer fila y primer columna
  lcd.print("BAR:  ");        // escribe Pres:
  lcd.print(SUMA/5.0, 1);     // escribe valor promedio de 5 lecturas con un decimal
  lcd.setCursor(0, 0);        // cursor en primer fila y primer columna
  lcd.print("ACEITE");        // imprime psi

  if ( digitalRead(ibut) == HIGH ) {
            lcd.clear();
            vista = 1;
            delay(200);      
 
          }

  break;
    }

   byte i;
   byte present = 0;
   byte type_s;
   byte data[12];
   byte addr[8];
   float celsius, fahrenheit;
   if(!ds.search(addr)){
      ds.reset_search();
      delay(250);
      return;
   }
   if(OneWire::crc8(addr, 7) != addr[7]) {
      return;
   }
   switch(addr[0]){
   case 0x10:
      type_s = 1;
      break;
   case 0x28:
      type_s = 0;
      break;
   case 0x22:
      type_s = 0;
      break;
   default:
      return;
   } 
   ds.reset();
   ds.select(addr);
   ds.write(0x44, 1);
   delay(1000);
   present = ds.reset();
   ds.select(addr);    
   ds.write(0xBE);
   for( i = 0; i < 9; i++){
      data[i] = ds.read();
   }
   int16_t raw = (data[1] << 8) | data[0];
   if(type_s){
      raw = raw << 3;
      if(data[7] == 0x10) {
         raw = (raw & 0xFFF0) + 12 - data[6];
      }
   }else{
      byte cfg = (data[4] & 0x60);
      if (cfg == 0x00) raw = raw & ~7;
      else if (cfg == 0x20) raw = raw & ~3;
      else if (cfg == 0x40) raw = raw & ~1;
   }
   celsius = (float)raw / 16.0;
   Serial.println(celsius,1);
   lcd.setCursor(12, 1);
   lcd.print(celsius,1);
}

12 es un entero
12.5 es un float.
Muestras floats en tu LCD

Muchas gracias, por la ayuda, e conseguido incluir también un voltímetro, y un termómetro Tipo K usando una pantalla LCD 20x4 me falta solo poner unas resistencia y un hacer un divisor de tensión para el voltímetro para que todo funciona, cunado esté listo y probado en el coche ya lo subiré, igual a alguien le viene bien el invento, quiero aprovechar también a preguntar cuántos sensores a la vez puede leer como maximo un Arduino Nano sin que el hardware se sature quiero decir que no sobrepase las especificaciones que tiene y vaya fluido.
Dejo una foto de cómo va el inventó

2 Likes

Esta quedando muy bien!!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.