Отображение 2 сообщений об ошибках на дисплее 16x02
Я пытаюсь отобразить на ЖК-дисплее 16x02 2 кода ошибки. Сообщение об ошибке появляется, когда один или оба провода термопары отсоединяются, а второе сообщение об ошибке появляется, когда температура паяльника превышает 432 C. Я использую модуль MAX6675. Проблема в том, что когда я отсоединяю один провод термопары (+ или -) иногда появляется сообщение "Перегрев!!!" вместо "Нет соединения !!!".
Есть ли способ отобразить правильную ошибку?
heaterTemp = thermocouple.readCelsius();
Input = heaterTemp - 100;
//Нет связи с ТК
if (isnan(Input)) // Нет соединения с TC
{
while (true) {
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NO TC CONN !!!");
delay(1000);
}
}
//Перегрев паяльника
if (Input >= 432)
{
while (true) {
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("OVERHEATING !!!");
delay(1000);
}
}
Редактировать: я, наконец, решил использовать одно и то же сообщение для обеих ошибок - отсутствие соединения TC и перегрев. Я использовал код ниже:
heaterTemp = thermocouple.readCelsius();
Input = 0.779828 * heaterTemp - 10.3427;
if (isnan(heaterTemp) or Input >= 432) // Нет соединения с ТП ИЛИ перегрев
{
while (true) {
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
for (int i=0; i<=1; i++){
lcd.clear();
lcd.setCursor(0, i);
lcd.write((byte)0);
lcd.setCursor(1, i);
lcd.write((byte)0);
lcd.setCursor(5, i);
lcd.print("ERROR!");
lcd.setCursor(14, i);
lcd.write((byte)0);
lcd.setCursor(15, i);
lcd.write((byte)0);
delay(1000);
}
}
}
и
byte thermometer[8] = //иконка для термометра
{
B00100,
B01010,
B01010,
B01110,
B01110,
B11111,
B11111,
B01110
};
Код отображает символ термометра в начале и в конце строки, а текст (включая символы) перемещается из одной строки в другую.
Теперь достаточно вывести сообщение об ошибке при отключении термопары или повышении температуры утюга выше 432 *C.
Я также оставил 2 цикла while(true), потому что мне нужно, чтобы программа оставалась в цикле и отображала сообщение об ошибке, пока я не выключу питание и снова не включу паяльную станцию.
@beard999, 👍1
Обсуждение4 ответа
Думаю, перед тем, как будет обнаружено отключение, он перегреется (может быть, всего на несколько миллисекунд).
Однако, поскольку в части перегрева есть цикл while (true)
, никогда не будет отображаться ошибка NO TC CONN
.
Если вы считаете, что ошибка NO TC CONN
выше, чем ошибка OVERHEATING
, тогда проверьте в цикле while
OVERHEATING
также для ошибки NO TC CONN
и отображения NO TC CONN
при ее обнаружении.
Я бы зарезервировал строку №1 для одного сообщения и строку №2 для другого
heaterTemp = thermocouple.readCelsius();
Input = heaterTemp - 100;
lcd.clear();
//Нет связи с ТК
if (isnan(Input)) // Нет соединения с TC
{
while (true) {
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
// lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NO TC CONN !!!");
delay(1000);
}
}
//Перегрев паяльника
if (Input >= 432)
{
while (true) {
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
// lcd.clear();
// lcd.setCursor(0, 0);
lcd.setCursor(1, 0);
lcd.print("OVERHEATING !!!");
delay(1000);
}
}
Согласно таблице данных MAX6675, стр. 5, бит 2 регистра SPI будет установлен в HIGH, когда термопара открыта. Однако библиотека Adafruit MAX6675 изменила это, чтобы возвращать NAN, когда бит 2 установлен при вызове readCelsius()
метод библиотеки, поэтому вам следует проверить isnan(heaterTemp)
вместо innan(Input)
.
heaterTemp = thermocouple.readCelsius();
if (isnan(heaterTemp)) // Нет соединения с ТП
{
while (true) {
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NO TC CONN !!!");
delay(1000);
}
}
else
{
Input = heaterTemp - 100;
//Перегрев паяльника
if (Input >= 432)
{
while (true) {
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("OVERHEATING !!!");
delay(1000);
}
}
}
Вы должны избавиться от циклов while(true)
, потому что, войдя в один из них, вы никогда не выйдете из него.
void loop()
{
heaterTemp = thermocouple.readCelsius();
Input = heaterTemp - 100;
//No TC connection
if (isnan(Input)) // No TC Connection
{
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NO TC CONN !!!");
}
//Soldering Iron overtemperature
if (Input >= 432)
{
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("OVERHEATING !!!");
}
delay(1000);
}
EDIT: приведенный ниже код необходим для отключения питания
digitalWrite(relay_pin, LOW);
digitalWrite(11, LOW);
Возможно, эти строки лучше перенести в setup()
Контакт relay_pin — это реле, которое отключает питание нагревателя паяльника, а контакт 11 — это выходной контакт PWM, который управляет силовым полевым транзистором. Установка их на «низкий уровень» отключит силовой MOSFET, а реле отключит питание нагревателя утюга., @beard999
Я думал, что мне нужны 2 цикла while(true), чтобы остановить цикл(), пока я не выключу питание и не включу его снова., @beard999
@mike_mike, ты правильно думаешь, @jsotola
- Arduino читает термопару типа K с помощью ADS1115
- Как инициализировать сброс на цифровом термометре sht30?
- Почему мои высокие и низкие значения не обновляются корректно во время последовательных циклов
- DS18B20 работает ненадежно.
- Быстрое измерение 64 различных термопар
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
Что такое тип
Input
?инт
? "плавать"?без подписи
?, @hcheungТип ввода двойной, @beard999