Шестнадцатеричный вывод, хотя я всегда определяю целое число

Приведенный ниже код предназначен для считывания показаний 4 термометров и использования значений для включения или выключения нагревателей (я застрял в чтении).

Я очень хорошо читаю и показываю температуру, но тут возникает проблема: я хочу установить предел нагрева, значение 37 градусов. Возникает проблема: когда я хочу прочитать значение «tempa», но Arduino не отвечает должным образом: он каким-то образом считывает значение как символ или я получаю вывод в шестнадцатеричном виде вместо целого числа (хотя я никогда не объявлял символ во всей программе).

Это можно увидеть в последних двух строках перед «CHANNEL_2».

Строки:

lcd.setCursor(10, 0);    //термометр
lcd.write(tempa);    //термометр

absoluta, absolutb, absolutc и absolutd — это переменные, которые технически представляют собой значения температуры в Кельвинах.

tempa, temb, tempc и tempd — переменные, температура в градусах Цельсия.

#include <LiquidCrystal.h>
#define  LM335_pin  0                          // Выходной контакт LM335 подключен к контакту Arduino A0
#define  LM335_pio  1                          // Выходной контакт LM335 подключен к контакту Arduino A0
#define  LM335_pip  2                          // Выходной контакт LM335 подключен к контакту Arduino A0
#define  LM335_pir  3                          // Выходной контакт LM335 подключен к контакту Arduino A0

const int rs = 7, en = 8, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // Подключения ЖК-модуля (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


  //-------ОБОГРЕВАТЕЛИ------------------------ ----------------
//int grelea = 11; //нагреватель_1
//int greleb = 10; //нагреватель_2
//int grelec = 9; //нагреватель_3

void setup() {
  lcd.begin(20, 4);

// pinMode(grelea, OUTPUT);
// pinMode(greleb, OUTPUT);
// pinMode(grelec, OUTPUT);

} 
int  absoluta, tempa; //датчик_1
int  absolutb, tempb; //датчик_2
int  absolutc, tempc; //датчик_3
int  absolutd, tempd; //датчик_4

void loop() {

  delay(1000);                                 

  //-----------------------КАНАЛ_1------------------------ ----------------
  absoluta = analogRead(LM335_pin) * 0.489;
  tempa = absoluta - 273;

  lcd.setCursor(0, 0);    //термометр

  lcd.setCursor(0, 0);    //термометр
  lcd.write("Temp1=");    //термометр

  lcd.setCursor(8, 0);    //термометр
  lcd.write((tempa / 10)% 10  + 48);    //термометр

  lcd.setCursor(9, 0);    //термометр
  lcd.write(tempa % 10  + 48);    //термометр

  lcd.setCursor(10, 0);    //термометр
  lcd.write(char(223));    //термометр

  lcd.setCursor(11, 0);    //термометр
  lcd.write("C");    //термометр

  lcd.setCursor(15, 0);    //термометр
  lcd.write(tempa);    //термометр

  //------------------------------------------------ ---------------


  //-----------------------КАНАЛ_2------------------------ ----------------
  absolutb = analogRead(LM335_pio) * 0.489;
  tempb = absolutb - 273;

  lcd.setCursor(0, 1);    //термометр
  lcd.write("Temp2=");    //термометр

  lcd.setCursor(8, 1);    //термометр
  lcd.write((tempb / 10) % 10  + 48);    //термометр

  lcd.setCursor(9, 1);    //термометр
  lcd.write(tempb % 10  + 48);    //термометр

  lcd.setCursor(10, 1);    //термометр
  lcd.write(char(223));    //термометр

  lcd.setCursor(11, 1);    //термометр
  lcd.write("C");    //термометр
  //------------------------------------------------ ---------------


  //-----------------------КАНАЛ_3------------------------ ----------------
  absolutc = analogRead(LM335_pip) * 0.489;
  tempc = absolutc - 273;

  lcd.setCursor(0, 2);    //термометр
  lcd.write("Temp3=");    //термометр

  lcd.setCursor(8, 2);    //термометр
  lcd.write((tempc / 10) % 10  + 48);    //термометр

  lcd.setCursor(9, 2);    //термометр
  lcd.write(tempc % 10  + 48);    //термометр

  lcd.setCursor(10, 2);    //термометр
  lcd.write(char(223));    //термометр

  lcd.setCursor(11, 2);    //термометр
  lcd.write("C");    //термометр
  //------------------------------------------------ ---------------


  //-----------------------КАНАЛ_4------------------------ ----------------
  absolutd = analogRead(LM335_pir) * 0.489;
  tempd = absolutd - 273;

  lcd.setCursor(0, 3);    //термометр
  lcd.write("Temp4=");    //термометр

  lcd.setCursor(8, 3);    //термометр
  lcd.write((tempd / 10) % 10  + 48);    //термометр

  lcd.setCursor(9, 3);    //термометр
  lcd.write(tempd % 10  + 48);    //термометр

  lcd.setCursor(10, 3);    //термометр
  lcd.write(char(223));    //термометр

  lcd.setCursor(11, 3);    //термометр
  lcd.write("C");    //термометр
  //------------------------------------------------ ---------------
}

, 👍0

Обсуждение

попробуйте lcd.print(tempa);, @Juraj

кстати: это не шестнадцатеричное, только ваши вычисленные значения ascii выходят за пределы раздела цифр кодов ascii, @Juraj


1 ответ


1

lcd.write() запишет один байт на ЖК-дисплей. Он не пытается интерпретировать тип данных входного параметра. Вы можете думать об этом как об отправке «необработанных данных» на ЖК-дисплей.

lcd.print() может быть вызван со многими типами в качестве входных данных и будет интерпретировать, что пользователь хочет напечатать удобочитаемое выражение данных. Кроме того, он может печатать более одного байта.

Например, переменная char с содержимым 'A' представлена в оперативной памяти байтом со значением 65 (код ASCII для 'A'). Если вы вызовете lcd.print('A'), он увидит, что 'A' является char, и отправит любые необработанные данные в ЖК-дисплей, чтобы на экране появилась буква «А». Так уж получилось, что отправка необработанного байта 65 позволит добиться этого, но это совпадение; драйвер ЖК-дисплея понимает ASCII для печати символов на экране.

Если вы вызываете lcd.write(125), фактический байт 125 (в двоичном виде 01111101) отправляется на ЖК-дисплей. . Если вы действительно хотите напечатать трехзначное число 125, lcd.print(125) в конечном итоге отправит 3 байта на ЖК-дисплей: значения ASCII для '1' , '2' и '5' (это 49, 50 и 53). Функция print() позаботится об этой интерпретации за вас.

,

у нее в коде v / 10 + 48. Я не думаю, что ей нужно объяснять двоичную и ASCII-систему., @Juraj