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

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

  1. b707

    b707 Гуру

    да х... фиг бы с ним...
    А то вы паровоза не знаете
     
  2. Airbus

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

    Зачем? ТС ясно же написал
    Вот так вот
    [​IMG]
     
  3. parovoZZ

    parovoZZ Гуру

    здесь ардуина ВИСИТ. А у него
     
  4. SunMaster

    SunMaster Нерд


    Слушай дружище а что это у него за дисплей с кнопками, его где то купить можно или его следует самому сделать, поделись информацией.
     
  5. SunMaster

    SunMaster Нерд



    Код (C++):
    #include <DHT.h>;

    //Constants
    #define DHTPIN 2            //what pin we're connected to
    #define DHTTYPE DHT21       //DHT 21  (AM2301)
    DHT dht(DHTPIN, DHTTYPE);   //Initialize DHT sensor for normal 16mhz Arduino

    #include <Wire.h> // библиотека для управления устройствами по I2C
    #include <LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 1602
    LiquidCrystal_I2C LCD(0x3F,16,2); // присваиваем имя LCD для дисплея



    //Variables
    float hum;  //Stores humidity value
    float temp; //Stores temperature value



    void setup()
    {

    LCD.init(); // инициализация LCD дисплея



      Serial.begin(9600);
      dht.begin();

      pinMode(LED_BUILTIN, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(3, OUTPUT);
      digitalWrite (4, HIGH);
      digitalWrite (3, LOW);

      LCD.backlight(); // включение подсветки дисплея

    }

    void loop()
    {
     



      //Read data and store it to variables hum and temp
      hum = dht.readHumidity();
      temp= dht.readTemperature();
     
      //Print temp and humidity values to serial monitor

     

    if (isnan(temp)) {
       digitalWrite(5, HIGH);
       LCD.clear();
       Serial.println("Failed to read");
       LCD.print("Failed to read");  // печатаем сообщение на второй строке



     
       digitalWrite(LED_BUILTIN, HIGH);
       delay(1000);
       digitalWrite(LED_BUILTIN, LOW);
       delay(1000);
       digitalWrite(LED_BUILTIN, HIGH);
       delay(1000);
       digitalWrite(LED_BUILTIN, LOW);
       delay(1000);  
       digitalWrite(LED_BUILTIN, HIGH);
       delay(1000);
       digitalWrite(LED_BUILTIN, LOW);
       delay(1000);
    } else {


      digitalWrite (4, HIGH);
      digitalWrite (3, LOW);

      Serial.print("Humidity: ");
      Serial.print(hum);
      Serial.print("%,  Temperature: ");
      Serial.print(temp);
      Serial.println(" Celsius");
     
     
       LCD.clear();
       LCD.setCursor(1, 0);     // ставим курсор на 1 символ первой строки
       LCD.print("Temp= ");     // печатаем сообщение на первой строке
       LCD.print(temp);
       LCD.setCursor(1, 1);        // ставим курсор на 1 символ второй строки
       LCD.print("Humidity= ");  // печатаем сообщение на второй строке
       LCD.print(hum);

     
     



     
    if (temp>29) {  //при такой программе если датчик отлетает и показатель равен нон то реле офф
      digitalWrite(5, HIGH);
      digitalWrite(LED_BUILTIN, HIGH);
      }
       
           if (temp<27)
           {
           digitalWrite(5, LOW);
           digitalWrite(LED_BUILTIN, LOW);
           }

    delay(4000);
    LCD.clear();
    }

    }
     
  6. ИгорьК

    ИгорьК Гуру

    В этот loop закинь такую фишку - на дисплее мигает любая точка. Когда тебе кажется, что Ардуино "висит", посмотри, мигает ли при этом точка.

    А вообще, следует писать код так, чтобы в нем никогда не было функции delay().
    delay() - это зло.
     
  7. parovoZZ

    parovoZZ Гуру

    А вот если накатить операционку, то делэй самое оно.
     
  8. SergeiL

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

    Если накатить, то тут вообще много сюрпризов всплывает.
    Как мне кажется - самая главная проблема - с постоянной памятью, что то типа проблемы с RAID.
    Очень похоже на проблему с батарейкой. :(
    Вроде в кэш все пишется, а на утро выясняется, что кэш сбросился и на SSD не записался :(
     
  9. Airbus

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

    Это LCD шилд. Хорошая штука между прочим! Нахлобучивается на УНО можно еще для УНЫ пластиковый кейс за 100 рублей и вот готовая конструкция. И корпуса ненадо. Продается на Али я раньше покупал а потом сам паял. У Zelectro на сайте есть чертеж платы в PDF для принтера. Если дружишь с ЛУТ и паяльником то можешь и сам сделать.
     
  10. чем это зло ?
     
  11. ИгорьК

    ИгорьК Гуру

    А как тогда точка будет равномерно мигать? :)
     
  12. глвное, что бы мигала
     
  13. parovoZZ

    parovoZZ Гуру

    Блокирующая выполнение потока инструкция. А т.к. поток один, то блокируется выполнение и всего остального.
    Делается очень просто: создаётся таймер. Этот таймер следит за глобальным флагом. Через определенные промежутки времени он его инвертирует. В коде этот флаг достаточно связать по И, чтобы что-то выполнить.
     
    ИгорьК нравится это.
  14. ИгорьК

    ИгорьК Гуру

    Вот правильный ответ:

    Вот мой неправильный ответ:

    Если вы делаете одно устройство и идете вышивать крестиком на все остальное время, то "и так сойдет".
    Если же вы решите сделать нечто, что имеет больше одного "потока действий", то вы вынуждены не останавливать процессор, а переключать его по времени между задачами, о чем и сказано выше.

    В общем случае, лучше сразу "упереться" и отказаться от delay(...), научиться писать код без "тормозов".
     
    SunMaster нравится это.
  15. Рокки1945

    Рокки1945 Гуру

    А разве делай не по таймеру работает
     
  16. Airbus

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

    Нет. Он тупо занимается пересчетом того числа которое delay (число) ему пихнули. И больше ничем. Это в двух словах.
     
    Рокки1945 нравится это.
  17. ИгорьК

    ИгорьК Гуру

    По таймеру останавливает выполнение всего кода. В некоторых случаях это не влияет ни на что, но в большинстве ситуаций - это "ломает" все.
     
    Рокки1945 нравится это.
  18. Рокки1945

    Рокки1945 Гуру

    я где-то читал он noop считает - такты пустые, там еще рассчёт в зависимости от частоты тактирования
    Просто если поразмышлять зачем нужна задержка в программе опытному любителю-разработчику?
     
  19. ИгорьК

    ИгорьК Гуру

    Задержка интервалы нужны практически в любой разработке и опытному и неопытному .
     
  20. SergeiL

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

    Помня, что delay() вызывает yield() залез глянул исходник delay()
    Вот он:
    Код (C++):
    void delay(unsigned long ms)
    {
        uint32_t start = micros();

        while (ms > 0) {
            yield();
            while ( ms > 0 && (micros() - start) >= 1000) {
                ms--;
                start += 1000;
            }
        }
    }
     
    То есть управление постоянно отдается yield()
    Если yield() в коде отсутствует, то ничего не выполняется.
    Ради прикола поправил блинк без delay() до такого варианта:
    Код (C++):
    const int ledPin =  LED_BUILTIN;// the number of the LED pin

    // Variables will change:
    int ledState = LOW;             // ledState used to set the LED

    // Generally, you should use "unsigned long" for variables that hold time
    // The value will quickly become too large for an int to store

    // constants won't change:
    const long interval = 1000;           // interval at which to blink (milliseconds)

    void setup() {
      // set the digital pin as output:
      pinMode(ledPin, OUTPUT);
    }

    void loop()
    {
      delay (10000);
    }

    void yield()
    {
        static unsigned long previousMillis = 0;
        unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= interval) {
        previousMillis = currentMillis;

        // if the LED is off turn it on and vice-versa:
        if (ledState == LOW) {
          ledState = HIGH;
        } else {
          ledState = LOW;
        }
        digitalWrite(ledPin, ledState);
      }
    }
    Залил в нано. Мигает встроенный светодиод каждую секунду. :)

    UPD: Понятно, что delay() зло, и в коде его не должно быть.
    Вот думаю зачем прикрутили вызов yield(), наверное если только для библиотек.
    Ведь если кто-то использует delay(), то он явно не знает про yield()
     
    DetSimen и ИгорьК нравится это.