Отображение 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), потому что мне нужно, чтобы программа оставалась в цикле и отображала сообщение об ошибке, пока я не выключу питание и снова не включу паяльную станцию.

, 👍1

Обсуждение

Что такое тип Input? инт? "плавать"? без подписи?, @hcheung

Тип ввода двойной, @beard999


4 ответа


1

Думаю, перед тем, как будет обнаружено отключение, он перегреется (может быть, всего на несколько миллисекунд).

Однако, поскольку в части перегрева есть цикл while (true), никогда не будет отображаться ошибка NO TC CONN.

Если вы считаете, что ошибка NO TC CONN выше, чем ошибка OVERHEATING, тогда проверьте в цикле while OVERHEATING также для ошибки NO TC CONN и отображения NO TC CONN при ее обнаружении.

,

1

Я бы зарезервировал строку №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);
    }
  }
,

1

Согласно таблице данных 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);
    }
  }
}
,

1

Вы должны избавиться от циклов 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