Lectura de múltiples DS18B20 [Solucionado]

Hola compañeros tengo un problema con mi codigo espero me puedan ayudar resumo el problema

Lo que tengo problema es en que siga midiendo el sensor DS18B20 tanto en serial como en LCD 16X2 ya que cuando presiono el Keypad en cada "case" solo me mide un valor y ocupo que siga midiendo hasta que presione otro "case" estoy utilizado el protocolo "one wire" espero me ayuden ya que no se que otra cosa hacer gracias por su tiempo

#include <Keypad.h> 
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const int pinDatosDQ = 12;  // Pin donde se conecta el bus 1-Wire
OneWire oneWireObjeto(pinDatosDQ); // Instancia a las clases OneWire y DallasTemperature
DallasTemperature sensorDS18B20(&oneWireObjeto);
DeviceAddress a = {0x28,0xA5,0xB8,0x1B,0x0A,0x00,0x00,0x1E};
DeviceAddress b = {0x28,0xF1,0xCD,0x1B,0x0A,0x00,0x00,0x53}; 
DeviceAddress c = {0x28,0x51,0xBE,0x1B,0x0A,0x00,0x00,0x2C};
DeviceAddress d = {0x28,0xCF,0xBA,0x1B,0x0A,0x00,0x00,0x91};
DeviceAddress e = {0x28,0x18,0xCB,0x1B,0x0A,0x00,0x00,0x70};
DeviceAddress f = {0x28,0x6E,0xAF,0x1B,0x0A,0x00,0x00,0x54};
DeviceAddress g = {0x28,0x1D,0xBF,0x1B,0x0A,0x00,0x00,0xE9};
DeviceAddress h = {0x28,0xC9,0xB2,0x1B,0x0A,0x00,0x00,0x1D};
DeviceAddress i = {0x28,0x76,0xB4,0x1B,0x0A,0x00,0x00,0xA2};

const byte ROWS = 4; //filas
const byte COLS = 4; //columnas
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

const byte rowPins[ROWS] = {2,3,4,5}; //filas
const byte colPins[COLS] = {6,7,8,9}; //columnas

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); //Pines donde va conectada la pantalla (RS, E, D4, D5, D6, D7)

void setup() {
   Serial.begin(9600);
   
   sensorDS18B20.begin(); // Iniciamos el bus 1-Wire
//float temp1 = a;
      lcd.begin(16, 2);          //Inicializa la librería
      //lcd.clear();
   lcd.print("Leyendo datos");  // Mandamos comandos para toma de temperatura a los sensores
    delay(20);
    lcd.setCursor(0,1);                // Mueve el cursor al principio de la segunda línea
    lcd.print("Indique sensor");
    delay(40);
    lcd.noDisplay();
}
 
void loop() {
    
    char key = keypad.getKey();//
    
    sensorDS18B20.requestTemperatures();
    
    lcd.begin(16, 2);
        
        switch (key)
        {
      case '1': 
      sensor1();
      case '2':
      sensor2();
      case '3':
      sensor3();
      case '4':
      sensor4();
      case '5':
      sensor5();
      case '6':
      sensor6();
      case '7':
      sensor7();
      case '8':
      sensor8();
      case'9':
      sensor9();
          }
       }
          
void sensor1() {
      float temp1= sensorDS18B20.getTempC(a);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 1");
      lcd.setCursor(0,1);
      lcd.print(temp1); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 1  = ");
      Serial.println(temp1);
      delay(200);
     }

void sensor2() {
      float temp2= sensorDS18B20.getTempC(b);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 2");
      lcd.setCursor(0,1);
      lcd.print(temp2); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 2  = ");
      Serial.println(temp2);
      delay(200);
     }
void sensor3() {
      float temp3= sensorDS18B20.getTempC(c);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 3");
      lcd.setCursor(0,1);
      lcd.print(temp3); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 3  = ");
      Serial.println(temp3);
      delay(200);
     }
void sensor4() {
      float temp4= sensorDS18B20.getTempC(d);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 4");
      lcd.setCursor(0,1);
      lcd.print(temp4); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 4  = ");
      Serial.println(temp4);
      delay(200);
     }
void sensor5() {
      float temp5= sensorDS18B20.getTempC(e);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 5");
      lcd.setCursor(0,1);
      lcd.print(temp5); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 5  = ");
      Serial.println(temp5);
      delay(200);
     }
void sensor6() {
      float temp6= sensorDS18B20.getTempC(f);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 6");
      lcd.setCursor(0,1);
      lcd.print(temp6); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 6  = ");
      Serial.println(temp6);
      delay(200);
     }
void sensor7() {
      float temp7= sensorDS18B20.getTempC(g);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 7");
      lcd.setCursor(0,1);
      lcd.print(temp7); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 7  = ");
      Serial.println(temp7);
      delay(200);
     }
void sensor8() {
      float temp8= sensorDS18B20.getTempC(h);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 8");
      lcd.setCursor(0,1);
      lcd.print(temp8); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 8  = ");
      Serial.println(temp8);
      delay(200);
     }
void sensor9() {
      float temp9= sensorDS18B20.getTempC(i);//Se obtiene la temperatura en °C del sensor 1
      lcd.print("SENSOR 9");
      lcd.setCursor(0,1);
      lcd.print(temp9); //Imprime el valor recogido
      lcd.print(" C           "); 
      Serial.print("Temperatura 9  = ");
      Serial.println(temp9);
      delay(200);
     }

Prueba con este código pero antes te digo que cada case debe terminar en un break; y ninguno de los tuyos lo tiene.

#include <Keypad.h> 
#include <Wire.h>         // mi compilador necesita esta librería. Borrala si te da error.
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const int pinDatosDQ = 12;  // Pin donde se conecta el bus 1-Wire
OneWire oneWireObjeto(pinDatosDQ); // Instancia a las clases OneWire y DallasTemperature
DallasTemperature sensorDS18B20(&oneWireObjeto);

#define NUM_SENSORS 9              // the number of DS18B20 sensors on the 1-Wire bus.

const DeviceAddress sensor_address[NUM_SENSORS] = 
                            { {0x28,0xA5,0xB8,0x1B,0x0A,0x00,0x00,0x1E},
                              {0x28,0xF1,0xCD,0x1B,0x0A,0x00,0x00,0x53}, 
                              {0x28,0x51,0xBE,0x1B,0x0A,0x00,0x00,0x2C},
                              {0x28,0xCF,0xBA,0x1B,0x0A,0x00,0x00,0x91},
                              {0x28,0x18,0xCB,0x1B,0x0A,0x00,0x00,0x70},
                              {0x28,0x6E,0xAF,0x1B,0x0A,0x00,0x00,0x54},
                              {0x28,0x1D,0xBF,0x1B,0x0A,0x00,0x00,0xE9},
                              {0x28,0xC9,0xB2,0x1B,0x0A,0x00,0x00,0x1D},
                              {0x28,0x76,0xB4,0x1B,0x0A,0x00,0x00,0xA2}
                            };

const byte ROWS = 4; //filas
const byte COLS = 4; //columnas

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

const byte rowPins[ROWS] = {2,3,4,5}; //filas
const byte colPins[COLS] = {6,7,8,9}; //columnas

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); //Pines donde va conectada la pantalla (RS, E, D4, D5, D6, D7)

void setup() {
  Serial.begin(9600);

  sensorDS18B20.begin();        // Iniciamos el bus 1-Wire
  //float temp1 = a;
  lcd.begin(16, 2);             // Inicializa la librería
  //lcd.clear();
  lcd.print("Leyendo datos");   // Mandamos comandos para toma de temperatura a los sensores
  delay(20);
  lcd.setCursor(0,1);           // Mueve el cursor al principio de la segunda línea
  lcd.print("Indique sensor");
  delay(40);
  lcd.noDisplay();
}
 
void loop() {
    
    char key = keypad.getKey();//
    sensorDS18B20.requestTemperatures();
    lcd.begin(16, 2);

    sensor(key-48);
}

void sensor(int tmp) {
    char buffer[20];

    float temp = sensorDS18B20.getTempC(sensor_address[tmp-1]);//Se obtiene la temperatura en °C del sensor 1
    sprintf(buffer, "SENSOR %d", tmp);
    lcd.print(buffer);
    lcd.setCursor(0,1);
    lcd.print(temp); //Imprime el valor recogido
    sprintf(buffer, "Temperatura %d = ", tmp);
    Serial.print(buffer);
    Serial.println(temp);
    delay(200);
}

Muchas gracias por tu contestación analizare tu código y rectificare el mio a ver que me lee se te agrace tu respuesta buen día SURBYTE

Upsss lamentablemente no sigue midiendo el sensor seleccionado y mide el valor cuando no tienes sensor o no me explique bien creo " seleccionas el sensor y sigue midiendo el mismo sensor" pero muchas gracias por tu ayuda y me diste una idea con tu código gracias

Prueba esto y me dices como reacciona.

#include <Keypad.h> 
#include <ctype.h>
#include <Wire.h>         // mi compilador necesita esta librería. Borrala si te da error.
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const int pinDatosDQ = 12;  // Pin donde se conecta el bus 1-Wire
OneWire oneWireObjeto(pinDatosDQ); // Instancia a las clases OneWire y DallasTemperature
DallasTemperature sensorDS18B20(&oneWireObjeto);

#define NUM_SENSORS 9              // the number of DS18B20 sensors on the 1-Wire bus.

const DeviceAddress sensor_address[NUM_SENSORS] = 
                            { {0x28,0xA5,0xB8,0x1B,0x0A,0x00,0x00,0x1E},
                              {0x28,0xF1,0xCD,0x1B,0x0A,0x00,0x00,0x53}, 
                              {0x28,0x51,0xBE,0x1B,0x0A,0x00,0x00,0x2C},
                              {0x28,0xCF,0xBA,0x1B,0x0A,0x00,0x00,0x91},
                              {0x28,0x18,0xCB,0x1B,0x0A,0x00,0x00,0x70},
                              {0x28,0x6E,0xAF,0x1B,0x0A,0x00,0x00,0x54},
                              {0x28,0x1D,0xBF,0x1B,0x0A,0x00,0x00,0xE9},
                              {0x28,0xC9,0xB2,0x1B,0x0A,0x00,0x00,0x1D},
                              {0x28,0x76,0xB4,0x1B,0x0A,0x00,0x00,0xA2}
                            };

const byte ROWS = 4; // filas
const byte COLS = 4; // columnas

char keys[ROWS][COLS] = {
                          {'1','2','3','A'},
                          {'4','5','6','B'},
                          {'7','8','9','C'},
                          {'*','0','#','D'}
                        };

byte rowPins[ROWS] = {2,3,4,5}; //filas
byte colPins[COLS] = {6,7,8,9}; //columnas

Keypad teclado = Keypad( makeKeymap(keys),  rowPins, colPins, sizeof(rowPins), sizeof(colPins) );
//Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); //Pines donde va conectada la pantalla (RS, E, D4, D5, D6, D7)

void setup() {

  Serial.begin(9600);
  Serial.println("Inicializado.");

  sensorDS18B20.begin();        // Iniciamos el bus 1-Wire
  //float temp1 = a;
  lcd.begin(16, 2);             // Inicializa la librería
  //lcd.clear();
  lcd.print("Leyendo datos");   // Mandamos comandos para toma de temperatura a los sensores
  delay(20);
  lcd.setCursor(0,1);           // Mueve el cursor al principio de la segunda línea
  lcd.print("Indique sensor");
  delay(40);
  lcd.noDisplay();
}
 
void loop() {
    
    char key = teclado.getKey();//

    if (key) {
        Serial.println(key);
        sensorDS18B20.requestTemperatures();
        lcd.begin(16, 2);

        sensor(key-48);    
    }
    
}

void sensor(int tmp) {
    char buffer[20];

    float temp = sensorDS18B20.getTempC(sensor_address[tmp-1]);//Se obtiene la temperatura en °C del sensor 1
    sprintf(buffer, "SENSOR %d", tmp);
    lcd.print(buffer);
    lcd.setCursor(0,1);
    lcd.print(temp); //Imprime el valor recogido
    sprintf(buffer, "Temperatura %d = ", tmp);
    Serial.print(buffer);
    Serial.println(temp);
    delay(200);
}

Buenas noches SURBYTE casi lo lograste solo que se queda solo un valor estático y no se varea al cambio de la temperatura eres muy bueno en la programación con solo unas pocas lineas haces lo que hice en 50 te agradezco tu esfuerzo y estoy buscando sobre la variable buffer que se me hiso muy interesante te mando la respuesta

Inicializado.
1
Temperatura 1 = 22.81 // aqui es donde seguiria midiendo hasta que mandas el valor del 2
2
Temperatura 2 = 22.81
3
Temperatura 3 = 22.87
4
Temperatura 4 = 22.94

gracias y espero no pienses que soy flojo solo se me acabaron las ideas y sigo buscando sobre tu código y mi código

Te explico entonces

Todo esto

char buffer[20];

    sprintf(buffer, "SENSOR %d", tmp);
    lcd.print(buffer);

Es pra poder imprimir en el lcd

"SENSOR 1" o 2 o lo que se haya digitado.

buffer es un vector de 20 caracteres. Porque 20? porque tu pantalla tiene 20 columnas, de modo que para que mas. De un golpe limpio todo, e imprimo lo que quiero y nunca necesito usar un lcd.clear() como la mayoría usa.

sprintf es una fantástica función que convierte lo que pongas dentro de las comillas en la variables buffer. Asi que luego solo la imprimo.

Para ello uso de los comandos %d y otros que te invito a estudiar/leer en este link. No es exactamente sprintf pero sirve para que veas lo que pongo a continuación
%d se usa para enteros
%x se usa para hexadecimales
%0 se usa para números octales
%s se usa para cadenas
%c se usa para caracteres
%f se usa para float pero en los Arduinos no puede usarse pero si en los ESP8266
%ld se usa para los enteros largos

La ventaja extra es que si quieres imprimir solo 2 digitos usas esto
%2d
Si quieres imprimir algo cuya variable va de 0 a 59 como los segundos usas esto
%02d y lo mariavillos es que cualquier segundo que será impreso como ss
de modo que 0 a 9 se vera como 00 a 09 y lo que vaya de 10 a 59 se verá de igual modo.
Eso evita esos códigos de instructables donde ves

if (seconds < 10) tal cosa 
else
tal otra

todo para poder imprimir en la misma columna.

El código

Temperatura 1 = 22.81 // aqui es donde seguiria midiendo hasta que mandas el valor del 2

Entonces no quieres que dado un número siga mostrando esa temperatura.
De hecho esa tendria que hacer tu código de haber funcionado bien.
Si no quieres que haga eso pues al final de la subrutina

void sensor(int tmp) {
    char buffer[20];

    float temp = sensorDS18B20.getTempC(sensor_address[tmp-1]);//Se obtiene la temperatura en °C del sensor 1
    sprintf(buffer, "SENSOR %d", tmp);
    lcd.print(buffer);
    lcd.setCursor(0,1);
    lcd.print(temp); //Imprime el valor recogido
    sprintf(buffer, "Temperatura %d = ", tmp);
    Serial.print(buffer);
    Serial.println(temp);
    delay(200);
    key= 0;
}

Y por favor quita el Serial.print que muestra que tecla a sido presionada.
Es a los fines de ver si funciona correctamente pero cuando lo hace bien ya resulta molesto visualmente.

surbyte:
buffer es un vector de 20 caracteres. Porque 20? porque tu pantalla tiene 20 columnas, de modo que para que mas.

¡Cuidado! Un “vector de 20 caracteres” puede almacenar una cadena de hasta 19 caracteres “útiles” ya que se ha de reservar uno para indicar el final de la cadena con el carácter nulo (valor numérico cero) según el estándar de cadenas del lenguaje C.

Por ejemplo, el siguiente fragmento de programa asignará valores a los primeros veintiún bytes apuntados por buffer. El vigésimo valor será el carácter ’4’ (valor numérico 52), mientras que el vigesimoprimero será el carácter nulo (valor numérico cero).

int hora = 2;
int minuto =34;
sprintf(buffer, "La hora actual %02d:%02d", hora, minuto);

Si se han reservado únicamente 20 bytes para alojar la cadena, el carácter finalizador de la cadena se guardará en una zona de memoria que “no le pertenece” alterando muy posiblemente el valor de otra variable. Esto podría afectar al comportamiento del programa y causar fallos difícilmente localizables.

Así que si queremos una cadena de 20 caracteres útiles, hemos de “reservar” 21.

char buffer[21];

Aún así, recomiendo siempre para estos casos ser un poco más “generoso” y reservar algo más de memoria por si accidentalmente la cadena resulta ser un poco más grande de lo previsto. Tomemos como caso el ejemplo anterior en el que la variable minuto llegase a valer 100. Entonces la cadena sería

"La hora actual 02:100"

porque el %02 indica que se quiere que el número sea de al menos dos dígitos (añadiendo ceros por la izquierda si fuera necesario) pero no se “recorta” si tiene más de dos dígitos. Entonces para almacenar esta cadena se necesitan 22 bytes (los 21 “que vemos” más el carácter nulo que indica el final de la cadena en C/C++). Así que, si se han reservado solo 21, volvemos a tener el peligro de que se escriba un valor cero en una zona de memoria que no deba. Corrompiendo tal vez el valor de otra variable.

Pero tampoco nos pasemos a la hora de definir el tamaño de un buffer de estos, que no andamos sobrados de memoria.

Recuerden: el carácter

'A'

es un único byte. Minetras que la cadena "A" son dos bytes, el carácter

A

seguido de un carácter nulo.

Hola buen día gracias por la explicación es mejor que lo que encontré en la red nunca imagine que me ayudarían tanto en un foro y te agradezco mucho
sobre el código que me mandaste queda igual key= 0; este en la función sensor da error por que no esta declado en nada y en la función loop no empieza la cadena igualmente pasa en mi código crees que sea por el protocolo one wire? o por el teclado que swichea por que si le quito la función del teclado a un solo sensor si me sigue variando al tocar el sensor o soplando gracias por tu tiempo SURBYTE y tu advertencia ING-ABS

No comprendo a que te refieres. Traduce al español tu comentario

sobre el código que me mandaste queda igual key= 0; este en la función sensor da error por que no esta declado en nada y en la función loop no empieza la cadena igualmente pasa en mi código crees que sea por el protocolo one wire?

Cuesta mucho usar un . seguido? Algo de signos de puntuación que te habrán enseñado en algún momento. Digo porque me resulta dificil leer un texto donde no hay nada que termine y todo sea de corrido.

Luego el error por favor puedes copiar y pegarlo? Ya dije que nada de capturas de toda la pantalla sino solo el error.
Lo copias y pegas como código usando etiquetas.

Bueno respecto de key, definelo como global antes del setup

char key;

y luego reemplaza en el loop

char key = teclado.getKey();//

por

key = teclado.getKey();//

Eso es algo que por tu cuenta deberías poder resolver.

Buen día perdón por mi forma de escribir desorganizada, se que es un poco molesto pero no soy muy bueno en explicar por escrito.
Sobre el proyecto sigue funcionando de igual manera que del principio, no hace ningún cambio.
ya lo intente con ciclos y arreglos pero solo me da el valor estático.
y con interrupciones ningún valor, te lo mando a ver si me lo puedes revisar por favor.

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const int pinDatosDQ = 31&&33&&35&&37&&41&&43&&45&&47;  // Pin donde se conecta el bus 1-Wire

OneWire oneWireObjeto(pinDatosDQ); // Instancia a las clases OneWire y DallasTemperature
DallasTemperature sensorDS18B20(&oneWireObjeto);
int a=31;
int b=33;
int c=35;
int d=37;
int e=39;
int f=41;
int g=43;
int h=45;
int i=47;

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); //Pines donde va conectada la pantalla (RS, E, D4, D5, D6, D7)

void setup(){
  sensorDS18B20.begin(); // Iniciamos el bus 1-Wire
  Serial.begin(9600);
  for(int z=0; z<0; z++)
  {
  pinMode(z,OUTPUT);
  }
}

  
void uno()
{
  digitalWrite(sensorDS18B20.getTempC(a),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);
  }

void dos()
{
  digitalWrite(sensorDS18B20.getTempC(b),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(a),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);
  }
void tres()
{
  digitalWrite(sensorDS18B20.getTempC(c),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(a),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);
  }

void cuatro()
{
  digitalWrite(sensorDS18B20.getTempC(d),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(a),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);

  }

void cinco()
{
  digitalWrite(sensorDS18B20.getTempC(e),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(a),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);
  }

void seis()
{
  digitalWrite(sensorDS18B20.getTempC(f),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(a),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);
  }

void siete()
{
  digitalWrite(sensorDS18B20.getTempC(g),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(a),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);
  }

void ocho()
{
  digitalWrite(sensorDS18B20.getTempC(h),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(a),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);
  }

void nueve()
{
  digitalWrite(sensorDS18B20.getTempC(i),HIGH); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(a),LOW);
  }

void limpiar()
{
  digitalWrite(sensorDS18B20.getTempC(a),LOW); 
  digitalWrite(sensorDS18B20.getTempC(b),LOW);
  digitalWrite(sensorDS18B20.getTempC(c),LOW);
  digitalWrite(sensorDS18B20.getTempC(d),LOW);
  digitalWrite(sensorDS18B20.getTempC(e),LOW);
  digitalWrite(sensorDS18B20.getTempC(f),LOW);
  digitalWrite(sensorDS18B20.getTempC(g),LOW);
  digitalWrite(sensorDS18B20.getTempC(h),LOW);
  digitalWrite(sensorDS18B20.getTempC(i),LOW);
  }

  
void loop(){
  char customKey = customKeypad.getKey();
  
  
  if (customKey){
 
    switch (customKey)
    { 
      case '1':
      limpiar();
      uno();
      Serial.println(customKey);
      break;

      case '2':
      limpiar();
      dos();
      Serial.println(customKey);
      break;

      case '3':
      limpiar();
      tres();
      Serial.println(customKey);
      break;

      case '4':
      limpiar();
      cuatro();
      Serial.println(customKey);
      break;

      case '5':
      limpiar();
      cinco();
      Serial.println(customKey);
      break;

      case '6':
      limpiar();
      seis();
      Serial.println(customKey);
      break;

      case '7':
      limpiar();
      siete();
      Serial.println(customKey);
      break;

      case '8':
      limpiar();
      ocho();
      Serial.println(customKey);
      break;

      case '9':
      limpiar();
      nueve();
      Serial.println(customKey);
      break;
      
      }
    
  }
}

Que son valores estáticos? Porque no explicas.
Presionas 1 y responde una vez? A eso llamas valores estáticos?

Ahora me acabo de dar cuenta que has cambiado todo el código!!!

No me gusta cuando la gente descarta algo en lo que se invierte tiempo y luego sin expliación comienza con otra cosa totalmente fuera de contexto, volviendo a repetir los mismos errores del código inicial

Te dejo con el nuevo enfoque y que otra persona te ayude.

Disculpa si te ofendí sigo con el mismo código, solo me gusta hacer varias formas por que lo ingreso a matlab y labview y me gustan las alternativas para ver sus funciones (soy estudiante).

Sobre lo de estático efectivamente presiono una vez y responde una vez.

Si gustas no ayudarme lo comprendo y estoy muy agradecido por todo lo que me ayudaste y me enseñaste y sobre todo el tiempo que invertiste en mi, no muchos hacen eso por personas que no conocen.

A ver si nos entendemos.
Yo modifico tu código y tu eres libre de hacer como gustes pero te estoy pidiendo cierto feedback (Respuestas) y en función de eso vuelvo a destinar tiempo y luego me encuentro con otro código donde regresas a lo inicial con cambios leves. Entonces.. por eso te respondo del modo que lo hice

No tienes porque seguir mi línea pero yo digo en esa línea y si tu cambias y regresas a lo inicial tengo que volver a reinvertir tiempo para explicar lo mismo.
Entonces por eso mi comentario.

Cuando a una tecla tu le pones 0 como key = 0, interrumples la función de repeticion. Te lo dejé claro antes.
Entonces si quieres que siga repetiendo no le pongas key = 0. Simple!!

si tienes oportunidad de ver una demostración sobre el sistema es un enlace de youtube. El valor no cambia con o sin "key=0;" y es lo que me pasa desde el principio

A ver con estos cambios

#include <Keypad.h> 
#include <ctype.h>
#include <Wire.h>         // mi compilador necesita esta librería. Borrala si te da error.
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const int pinDatosDQ = 12;  // Pin donde se conecta el bus 1-Wire
OneWire oneWireObjeto(pinDatosDQ); // Instancia a las clases OneWire y DallasTemperature
DallasTemperature sensorDS18B20(&oneWireObjeto);

#define NUM_SENSORS 9              // the number of DS18B20 sensors on the 1-Wire bus.

const DeviceAddress sensor_address[NUM_SENSORS] = 
                            { {0x28,0xA5,0xB8,0x1B,0x0A,0x00,0x00,0x1E},
                              {0x28,0xF1,0xCD,0x1B,0x0A,0x00,0x00,0x53}, 
                              {0x28,0x51,0xBE,0x1B,0x0A,0x00,0x00,0x2C},
                              {0x28,0xCF,0xBA,0x1B,0x0A,0x00,0x00,0x91},
                              {0x28,0x18,0xCB,0x1B,0x0A,0x00,0x00,0x70},
                              {0x28,0x6E,0xAF,0x1B,0x0A,0x00,0x00,0x54},
                              {0x28,0x1D,0xBF,0x1B,0x0A,0x00,0x00,0xE9},
                              {0x28,0xC9,0xB2,0x1B,0x0A,0x00,0x00,0x1D},
                              {0x28,0x76,0xB4,0x1B,0x0A,0x00,0x00,0xA2}
                            };

const byte ROWS = 4; // filas
const byte COLS = 4; // columnas

char keys[ROWS][COLS] = {
                          {'1','2','3','A'},
                          {'4','5','6','B'},
                          {'7','8','9','C'},
                          {'*','0','#','D'}
                        };

byte rowPins[ROWS] = {2,3,4,5}; //filas
byte colPins[COLS] = {6,7,8,9}; //columnas

Keypad teclado = Keypad( makeKeymap(keys),  rowPins, colPins, sizeof(rowPins), sizeof(colPins) );
//Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); //Pines donde va conectada la pantalla (RS, E, D4, D5, D6, D7)
char key, tecla;

void setup() {

  Serial.begin(9600);
  Serial.println("Inicializado.");

  sensorDS18B20.begin();        // Iniciamos el bus 1-Wire
  //float temp1 = a;
  lcd.begin(16, 2);             // Inicializa la librería
  //lcd.clear();
  lcd.print("Leyendo datos");   // Mandamos comandos para toma de temperatura a los sensores
  delay(20);
  lcd.setCursor(0,1);           // Mueve el cursor al principio de la segunda línea
  lcd.print("Indique sensor");
  delay(40);
  lcd.noDisplay();
}
 
void loop() {
    
    key = teclado.getKey();//
    if (isDigit(key)) {
        tecla = key;
        Serial.println(key);
    }
    if (isDigit(tecla)) {
        sensorDS18B20.requestTemperatures();
        sensor(tecla-48);
        lcd.begin(16, 2); 
    }       
}

void sensor(int tmp) {
    char buffer[20];

    float temp = sensorDS18B20.getTempC(sensor_address[tmp-1]);//Se obtiene la temperatura en °C del sensor 1
    sprintf(buffer, "SENSOR %d", tmp);
    lcd.print(buffer);
    lcd.setCursor(0,1);
    lcd.print(temp); //Imprime el valor recogido
    sprintf(buffer, "Temperatura %d = ", tmp);
    Serial.print(buffer);
    Serial.println(temp);
    //delay(200);
}

Pruébalo y nos cuentas.

Buen dia SURBYTE eres un genio ya responde bien, solo no muestra el lcd pero eso yo lo puedo arreglar me ayudaste mucho y me enseñaste también.
Cuando lo ponga bien a funcionar te mando el link para que veas lo que ayudaste a lograr espero te vaya bien y gracias por tu paciencia

El lcd lo probé con un simulador y funcionaba.
De todos modos verifica con la ultima versión.

Cuando lo termines, pubícalo acá asi queda lo que funciona y edita el primer hilo con [SOLUCIONADO]

Muchas gracias por tu ayuda y paciencia así es como queda solucionado el problema el problema espero les ayude en sus proyectos futuros.

//Librerias a utilizar
#include <Keypad.h> 
#include <Wire.h>         
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const int pinDatosDQ = 12;  // Pin donde se conecta el bus 1-Wire
OneWire oneWireObjeto(pinDatosDQ); // Instancia a las clases OneWire y DallasTemperature
DallasTemperature sensorDS18B20(&oneWireObjeto);

#define NUM_SENSORS 9              // Numero de sensores

const DeviceAddress sensor_address[NUM_SENSORS] = // Direcciones de los sensores
                           { {0x28,0xA5,0xB8,0x1B,0x0A,0x00,0x00,0x1E},
                             {0x28,0xF1,0xCD,0x1B,0x0A,0x00,0x00,0x53}, 
                             {0x28,0x51,0xBE,0x1B,0x0A,0x00,0x00,0x2C},
                             {0x28,0xCF,0xBA,0x1B,0x0A,0x00,0x00,0x91},
                             {0x28,0x18,0xCB,0x1B,0x0A,0x00,0x00,0x70},
                             {0x28,0x6E,0xAF,0x1B,0x0A,0x00,0x00,0x54},
                             {0x28,0x1D,0xBF,0x1B,0x0A,0x00,0x00,0xE9},
                             {0x28,0xC9,0xB2,0x1B,0x0A,0x00,0x00,0x1D},
                             {0x28,0x76,0xB4,0x1B,0x0A,0x00,0x00,0xA2}
                           };

const byte ROWS = 4; // Filas del keypad
const byte COLS = 4; // Columnas del keypad

char keys[ROWS][COLS] = {
                         {'1','2','3','A'},
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'*','0','#','D'}
                       };

byte rowPins[ROWS] = {2,3,4,5}; //pines de las filas
byte colPins[COLS] = {6,7,8,9}; //pines de las columnas

Keypad teclado = Keypad( makeKeymap(keys),  rowPins, colPins, sizeof(rowPins), sizeof(colPins) );

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); //Pines donde va conectada la pantalla (RS, E, D4, D5, D6, D7)
char key, tecla;

void setup() {

 Serial.begin(9600);
 Serial.println("Inicializado.");

 sensorDS18B20.begin();        // Iniciamos el bus 1-Wire
 lcd.begin(16, 2);             // Inicializa la librería
 lcd.print("Leyendo datos");   // Inicia la lectura
 delay(2000);
 lcd.setCursor(0,1);           // Mueve el cursor al principio de la segunda línea
 lcd.print("Indique sensor");
 delay(2000);
 lcd.noDisplay();             // Apaga el display
}

void loop() {
// Lectura del datos  
   key = teclado.getKey();//
   if (isDigit(key)) {
       tecla = key;
       Serial.println(key);
       lcd.begin(16, 2);
       lcd.setCursor(0,1); 
       lcd.print(key);
   }
   if (isDigit(tecla)) {
      sensorDS18B20.requestTemperatures();
       sensor(tecla-48);
        
   }       
}

void sensor(int tmp) {
   char buffer[20];

   float temp = sensorDS18B20.getTempC(sensor_address[tmp-1]);//Se obtiene la temperatura en °C de los sensores
   sprintf(buffer, "SENSOR %d", tmp);
   lcd.print(buffer);
   lcd.setCursor(0,1);
   lcd.print(temp); //Imprime el valor recogido
   sprintf(buffer, "Temperatura %d = ", tmp);
   Serial.print(buffer);
   Serial.println(temp); //Imprime el valor recogido
   //delay(200);
}

Y esto es todo lo que agregaste para decir

solo no muestra el lcd pero eso yo lo puedo arreglar me ayudaste mucho y me enseñaste también.

       lcd.begin(16, 2);
        lcd.setCursor(0,1); 
        lcd.print(key);

Se colo un

lcd.begin(16, 2);

cuando debio ser

lcd.setCursor(0,0);

Pensé que eran mas cambios.
Bueno me alegro.

Edita el post anterior que olvidaste colocar las etiquetas.