Виснет ардуино

Тема в разделе "Arduino & Shields", создана пользователем SunMaster, 29 июл 2022.

  1. SunMaster

    SunMaster Нерд

    Ребята, прошу о помощи, подскажите что не так.
    Я сделал термостат из уно, датчика температуры, лсд экрана, и подогрева.
    История следующая, я заглядывал пару дней и на лсд было одно и тоже значение, я сразу на это не обратил внимания, а как оказалось он не отключал обогрев все это время, как итог перегрев, а при перезагрузке все решилось, он вновь стал нормально работать.
    Прошу, кто знает, объясните мне в чем причина этого явления и как мне написать код так что бы эта ситуация была исключена.
     
  2. parovoZZ

    parovoZZ Гуру

    Ардуино - это Детский конструктор и требовать от него большего как-то глупо.
     
  3. SunMaster

    SunMaster Нерд

    Так тебе есть чем мне помочь, я уверен решение есть
     
    Михаил123 нравится это.
  4. SunMaster

    SunMaster Нерд

    Причем здесь детский конструктор, это вполне работоспособная и продвинутая вещь
     
    Михаил123 нравится это.
  5. Рокки1945

    Рокки1945 Гуру

    а покажите
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Ну ЕМНИП обычно делается так-в цикле вначале ищем датчик. Если нашли измеряем температуру и включаем ТЭН( или выключаем?) Если датчик не найден то однозначно отключаем все! Ибо можно спалить нах! Или в аквариуме уха получиться.И по возможности сигнализируем. Писком ,мигалкой, СМС или пушем. Часто бомбить датчик ненадо можно раз в минуту. А в чем затык? Код есть в примерах ds18b20 В чем присина именно у Вас? Хз. В радиотехнике три вида неисправностей. Видимо отвалился датчик в процессе нагрева а Дуня это не увидела и продолжала греть до усеру. Обычно так бывает. Дружите с Паяльником!
     
    issaom и arkadyf нравится это.
  7. parovoZZ

    parovoZZ Гуру

    Конечно, есть. В МК для промышленности есть контроллеры работы осцилляторов, вачдоги, контроль памяти. Все это позволяет строить отказоустойчивые приборы. Например, банальный бытовой электросчётчик выполнен, как правило, на МК от TI (MSP430). В МК, на котором построена дурина, есть только вачдог.
    Я в таких приборах делаю принудительную инициализацию (перезагрузку) каждые, например, 5 секунд.
     
  8. parovoZZ

    parovoZZ Гуру

    Мы как-то делали подогрев радиомодуля для его стабильной работы на улице в зимнее время. Поставили обычный промышленный термостат за 500 рублей типа такого
    https://m.vseinstrumenti.ru/rashodn...egulyatory/iek/nc-ot-0-do-60-c-yce-tnc-00-60/
    Примерно такой же будет стоять в любом промышленном шкафу, в котором требуется обогрев или охлаждение.
    К чему там экраны и прочая требуха - не понятно.
    Ещё раз: ардуино - это Детский конструктор для творчества и обучения программированию. Этот проект не преследовал цель своей работоспособности дальше учебного стола.
     
  9. Рокки1945

    Рокки1945 Гуру

    а как ему ватчдог поможет? тэн каждые 5 секунд будет щелкать
     
  10. Airbus

    Airbus Радиохулиган Модератор

    Каждые 5 секунд—перезагруз
     
  11. Airbus

    Airbus Радиохулиган Модератор

    Вот проект от нашего форумчанина Пушного Звера—код в описании. Качай и смотри. Учись Студент!Там есть страховка от отвалившегося датчика

     
    SunMaster нравится это.
  12. Рокки1945

    Рокки1945 Гуру

    да это очень полезный механизм в хозяйстве - отщелкивать леща каждые 5 сек
     
  13. Airbus

    Airbus Радиохулиган Модератор

    Код
    Код (Text):
    // Термостат, до пяти датчиков DS18B20.
    // Автоматическое определение количества датчиков на
    // шине, установка температуры и хранение в энергонезависимой
    // памяти на каждый выход.
    // подробнее

    //  v 0.2 beta

    #include <EEPROM.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <LiquidCrystal.h>
    const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов
    byte pos;
    byte tempOUTon[5];  // массив с температурой включения выхода
    float tempSensor[5]; // массив куда читается температура
    byte qty; // количество градусников на шине
    OneWire  oneWire(15); // A1 вход датчиков 18b20
    DallasTemperature ds(&oneWire);
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    byte gradus[8] = {
      0b00110,
      0b01001,
      0b01001,
      0b00110,
      0b00000,
      0b00000,
      0b00000,
      0b00000
    };
    byte on[8] = {
      0b00110,
      0b01111,
      0b11111,
      0b11111,
      0b11111,
      0b11111,
      0b11110,
      0b01100
    };

    void readSet(){
      for (byte i = 0; i < qty; i++) tempOUTon[i] = EEPROM.read(i);
    }
    void outOff(){ // выключает выходы
      for (byte i = 0; i < qty; i++) digitalWrite(OUT[i], LOW);
    }

    void erorr(){ // останавливает работу программы и сигнализирует ошибку
      outOff(); // выключаем выходы  
       while(1){ // крутим бесконечный цикл
          analogWrite(10, 100);
          delay(500);
          analogWrite(10, 255);
          delay(500);
      }
    }
    ////

    byte key(){ //// для кнопок ЛСДшилда
      int val = analogRead(0);
        if (val < 50) return 5;
        else if (val < 150) return 3;
        else if (val < 350) return 4;
        else if (val < 500) return 2;
        else if (val < 800) return 1;
        else return 0;
    }
    ////

    void setMenu(byte pos){ // установка температуры  
    outOff();
    lcd.clear();
     
      while(1){ // крутим бесконечный цикл    
        byte KEY = key(); // читаем состояние кнопок
       
        lcd.setCursor(2, 0); // выводим на экран
        lcd.print("Out:");
        lcd.print(pos+1);
        lcd.setCursor(9, 0);
        lcd.print("Pin:");
        lcd.print(OUT[pos]);
        lcd.print("    ");
       
        lcd.setCursor(0, 1);  
        lcd.print(" PinON: ");
        lcd.print(tempOUTon[pos]);
        lcd.write(1);
        lcd.print("C <>");
       
        if (KEY == 2) { // если нажата кнопка
          tempOUTon[pos]--;   // изменяем значение
            if (tempOUTon[pos] > 125) tempOUTon[pos] = 0;
          EEPROM.write(pos, tempOUTon[pos]); // сохраняем в еепром
         }
         else if (KEY == 5){
           tempOUTon[pos]++;
             if (tempOUTon[pos] > 125) tempOUTon[pos] = 0;
           EEPROM.write(pos, tempOUTon[pos]);  
         }
       delay(200);
      }/////  
    }//

    void getTemp(){ // читаем температуру и заполняем массив
       ds.requestTemperatures();  
       for (int i = 0; i < qty; i++) tempSensor[i] = ds.getTempCByIndex(i);      
    }

    void setup() {
       Serial.begin(9600);
      ds.begin();
     
      qty = ds.getDeviceCount(); // количество датчиков на шине

      if (qty > 5) qty = 5;
    //  if (qty < 5) erorr(); //  проверка количества датчиков

      for (int i = 0; i < qty; i++) pinMode(OUT[i], OUTPUT);
      for (int i = 0; i < qty; i++) digitalWrite(OUT[i], LOW);
     
      lcd.createChar(1, gradus);
      lcd.createChar(2, on);
      lcd.begin(16, 2);
      lcd.clear();
     
      readSet();  // читаем настройки из еепром  
    }

    void loop() {  
       ///// обработка кнопок
     
      if (key() == 1) setMenu(pos); // если нажата селект, уходим в настройки
     
      else if (key() == 4 && pos < qty-1) pos++; // крутим позицию
      else if (key() == 3 && pos != 0) pos--;
     
      getTemp(); // читаем температуру с датчиков
      //// сверяем температуру и управляем выходами
      for (int i = 0; i < qty; i++) {
        if (tempSensor[i] < tempOUTon[i]) digitalWrite(OUT[i], HIGH);
        else digitalWrite(OUT[i], LOW);
      }
     
      /////// вывод инфы на экран
      lcd.setCursor(0, 0);
      lcd.print(pos+1);
      lcd.print(". ");
      lcd.print(tempSensor[pos], 1);  // показываем температуру с датчика
      lcd.write(1);
      lcd.print("C  ");
      lcd.setCursor(2, 1);
      lcd.print(tempOUTon[pos]); // показываем установленную температуру
      lcd.write(1);
      lcd.print("C  ");  
     
      lcd.setCursor(11, 0);  // рисуем статус выхода
        for (int i = 0; i < qty; i++){
          if (digitalRead(OUT[i])) lcd.write(2);
          else lcd.print(" ");
        }
      lcd.setCursor(11, 1); // рисуем номера выходов  
        for (int i = 0; i < qty; i++) lcd.print(i+1);

    }
     
    SunMaster нравится это.
  14. parovoZZ

    parovoZZ Гуру

    и почему же он будет щёлкать?

    если не умеешь пользоваться инструментом, то инструмент никогда не поможет.
     
  15. parovoZZ

    parovoZZ Гуру

    как твой код отслеживает сбой программного счётчика от импульса, который порождён коммутацией высоковольтной цепи?
     
  16. Airbus

    Airbus Радиохулиган Модератор

    Код не мой он Пушного Звера из видео.
    Все нюансы в жизни не просчитаешь. Он конечно никак не защищен от падения самолетов на голову или ЭМИ вследствии ядерного взрыва но насколько велика вероятность таких событий?
    Видимо перезагружать снова и снова? Для чего ж он тогда нужен?
     
  17. parovoZZ

    parovoZZ Гуру

    Ну перезагружаем МК. Почему реле должно щёлкнуть? У тебя МК сколько грузится? В нормальных МК, например, в TI, выходные драйверы можно защёлкнуть и тогда их выходное значение вообще никогда не изменится, пока подано питание. В авр такой роскоши нет, но тем не менее.
     
  18. SergeiL

    SergeiL Оракул Модератор

    Ардуино не виснет, проверено на практике.
    Ставил аппаратный вотчдог для Leonardo ETH с Ethernet на чипе Wiznet W5500, которая работает на даче, так он не разу не сработал за примерно 5 лет.
    С большой вероятностью, все проблемы в коде.

    У @parovoZZ похоже психологическая травма связанная с Ардуино,
    Поэтому он в каждом посте об этом пытается говорить.

     
    Михаил123, KindMan, issaom и 2 другим нравится это.
  19. SunMaster

    SunMaster Нерд


    Воо, спасибо большое, я подумал она зависла, хотя я тоже подумал что там как минимум виснуть нечему, да и не должно такого быть. Просто как я заметил пару дней подряд лсд показывал на датчике температура была одна и та же и не менялась, а при перезагрузке он стал ее нормально обновлять, а была она ниже порога срабатывания и как ты и сказал выше у меня получилась уха...
    Я вот не знаю на что тут думать, может датчик так отвалился, я думаю дописать код который меня перестрахует от этой ситуации не сложно, но блин думаю для начала надобно понять в чем собственно была проблема. у меня стоит в коде isnan() поэтому грешить на отсутствие показаний не приходится, как это можно понять не подскажите?
     
  20. Рокки1945

    Рокки1945 Гуру

    Прошил контроллер с настроенным ватчдогом, взвел его на 5 секунд, что должно произойти чтобы его сбросить, и что должно произойти чтобы микроконтроллер перезагрузился? Как ватчдог применим в данном конкретном случае? Каковы условия? Ты же про это ничего не сказал - поэтому пришлось самому додумывать как же это должно работать.
    П.С А ну если только прерывание по фронту и там уже сбрасывать ватчдог...
     
    Последнее редактирование: 30 июл 2022