Шестнадцатеричный вывод, хотя я всегда определяю целое число
Приведенный ниже код предназначен для считывания показаний 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"); //термометр
//------------------------------------------------ ---------------
}
@Jakey, 👍0
Обсуждение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
- Очень простая операция Arduino Uno Serial.readString()
- Как преобразовать строку в массив байтов
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Arduino: как записать значение переменной в текстовый файл и изменить его на SD-карте?
- Буфер char в String в Arduino UNO
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
- Объявленная переменная внутри void setup не видится в void loop
попробуйте
lcd.print(tempa);
, @Jurajкстати: это не шестнадцатеричное, только ваши вычисленные значения ascii выходят за пределы раздела цифр кодов ascii, @Juraj