Условие if срабатывает два раза

Тема в разделе "Arduino & Shields", создана пользователем Sem, 8 окт 2021.

Метки:
  1. Sem

    Sem Нуб

    при работе с ардуино к консоли не прикасаюсь вообще )))
     
  2. SergeiL

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

    А если при подключенной плате закрыть, потом открыть монитор порта, чтобы там ничего не было.
    Потом нажать кнопку ресет на плате.
    Перезагрузки думаю не будет, вывод из setup() будет один раз.

    Я тут сейчас вожусь с новым устройством на ESP8266, обратил внимание, что при подключении платы к компу (к USB) у меня количество стартов платы не один, а два. То есть, я обнуляю счетчики стартов контроллера, подключений по Wi-Fi, подключений по MQTT, ноли прописываются в энергонезависимую память, выводятся в OpenHAB (OH).

    Код (C++):
    void Read_EEPROM_Val(void)
    {
      Start_Numb = EEPROM.read(EEPROM_STRT_NUMB);
      RECON_WiFi_Numb = EEPROM.read(EEPROM_WIFI_RECONN_NUMB);
      RECON_MQTT_Numb = EEPROM.read(EEPROM_MQTT_RECONN_NUMB);
      WiFi_Conn_Index = EEPROM.read(EEPROM_WIFI_INDEX);

    #ifdef DEBUG_OUTPUT
      Serial.println("");
      Serial.println("---- Read EEPROM ----");
    #endif
    }


    void setup(void)
    {
      pinMode(PIN_OPEN, OUTPUT);      // Initialize pin as an output
      digitalWrite (PIN_OPEN, HIGH);
      pinMode(PIN_MY, OUTPUT);      // Initialize pin as an output
      digitalWrite (PIN_MY, HIGH);
      pinMode(PIN_CLOSE, OUTPUT);      // Initialize pin as an output
      digitalWrite (PIN_CLOSE, HIGH);

      My_Ticker.attach_ms(TICKER_PERIOD, Ticker_Func);

    #ifdef DEBUG_OUTPUT
      Serial.begin(115200);
      Serial.println();
    #endif

      EEPROM.begin(512);
      Read_EEPROM_Val();

      Start_Numb++;
      EEPROM.write(EEPROM_STRT_NUMB, Start_Numb);
      EEPROM.commit();


      setup_wifi();
      setup_PubSub();
     

    То есть на плате все счетчики по нолю.
    Отключаю плату от компа.
    Подключаю плату к компу (втыкаю USB разъем), естественно монитор порта отключен так как порта еще нет. Монитор порта не включаю, жду значений в OH.
    Подключается питание, ESP ищет лучшую доступную Wi-Fi сеть из знакомых, цепляется к ней, подключается по MQTT, пересылает текущие значения счетчиков в OH.
    В OH вижу, что количество стартов - два, подключений по Wi-Fi и MQTT - один:
    upload_2021-10-9_11-59-14.png

    При этом, при подключении к заряднику с микро USB, все значения по "1":

    upload_2021-10-9_12-4-17.png

    И такое поведение повторяется каждый раз, сколько не пробовать.
    Похоже, что при обнаружении устройства на USB, происходит инициализация устройства, и из за этого происходит два старта платы.
     
  3. Sem

    Sem Нуб

    Нажал на кнопку ресета получил один раз вывод
    Код (C++):

    extra_virgin
    flag_begin
    1
    flag_end
    0
     
     
  4. Sem

    Sem Нуб

    На новой плате тоже два раза перегружается?
    У меня перегрузки со вчерашнего дня пошли. До этого и знать не знал, что такое может быть. Вот сижу и анализирую, что вчера умудрился сделать. Может статикой испортил платы?
     
  5. SergeiL

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

    Я заметил двойной старт только при подключении платы к компу (подключение USB разъема к компу, или к USB хабу, или подачи питания на USB хаб ). То есть когда обнаруживается устройство (порт) в Windows.
    При заливке прошивки из Ардуино ИДЕ или при подключении платы к источнику питания такого нет. Один старт
     
  6. Sem

    Sem Нуб

    Вчера устал, сразу не сообразил. Ведь код то один раз по идее сработать должен и остановиться. Когда закрываю Arduino IDE и открываю консоль и вижу что раз в минуту или две появляется данные (эти логические переменные с extra_vigin). Буфер Serial.println должен очиститься при закрытии IDE. Откуда эти сообщения берутся?
     
  7. KindMan

    KindMan Гуру

    У вас каша в голове, IDE никак не влияет на программу загруженную в контроллер.
    Платы в порядке. На Windows есть компьютер? Проверьте там, на 100% уверен, всё будет нормально.
     
  8. Sem

    Sem Нуб

    Естественно не влияет, про другое спрашивал.
    Если платы в порядке почему стали перегружаться?
     
  9. KindMan

    KindMan Гуру

    Подключите
    вашу ардуину для вывода в консоль, и увидите, что плата не перегружается.
     
  10. b707

    b707 Гуру

    они всегда перегружались. это их дефолтное поведение
     
  11. Airbus

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

    Сделай так
    Кот
    Код (Text):
    bool flag = true;

    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    pinMode(13, OUTPUT);

    }

    void loop() {
      // put your main code here, to run repeatedly:
    if(flag == true) {
      Serial.println("flag_begin");
      Serial.println(flag);
       flag = false;
      digitalWrite(13, HIGH);
       Serial.println("flag_end");
      Serial.println(flag);
      }
    }
    LED должен зажечься. Но не мОргать
     
  12. ANTISPAM

    ANTISPAM Нуб

    Код (Text):
    bool flag =true;

    void setup(){
    // put your setup code here, to run once:
    Serial.begin(9600);

    }

    void loop(){
    // put your main code here, to run repeatedly:
    if(flag ==true){
      Serial.println("flag_begin");
      Serial.println(flag);
    }else{
       flag =false;
       Serial.println("flag_end");
      Serial.println(flag);
    }
    }
    А почему не сделать так?
     
    Последнее редактирование модератором: 15 окт 2021
  13. fogary

    fogary Гик

    Код в else{} будет выполняться постоянно, до выключения питания. Автор хотел только один раз.
     
  14. ANTISPAM

    ANTISPAM Нуб

    Тогда зачем в loop() его забрасывать?)
     
  15. akl

    akl Гуру

    это тестовая программа, при помощи которой он изучал аномальное поведение ардуины.
     
  16. Airbus

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

    ANTISPAM Учитесь вставлять код правильно.

    Чел осваивает работу с флагами. Я бы написал вместо if(flag ==true) так if(flag) Ибо-краткость.

     
  17. fogary

    fogary Гик

    Прошу прощения, в предыдущем ответе я затупил.
    Все наоборот, if() будет выполняться все время, а else() не выполнится никогда. Т. к. flag всегда будет true.
    Ну, это же Ваш код.
     
  18. mednagolov

    mednagolov Гик

    Здравствуйте, помогите пожалуйста!
    Нужен таймер на ардуину,
    4сек.включен - 7сек. выключен.
    пробовал писать скетч -
    Таймеры с тактом 1 сек.


    inttaim; //переменная таймера паузы

    inttaim1; //переменная таймера подачи

    ints=0; // секунда от милис

    intP=1; //для digitalWrite(pin_on ,P ) включить/отключить

    intPo=3; // время подачи по умолчанию в секундах

    intPa=7; // время паузы по умолчанию в секундах


    const int pin_on = A2; // pin реле


    uint32_tmyTimer1; //пнременная таймера милис



    void setup() {

    Serial.begin (9600);


    pinMode(pin_on, OUTPUT); // пин реле подачи пелет




    }

    ////////////////////////////////////////////////////////////////////////////////

    void loop() {


    digitalWrite(pin_on ,P ); // управление реле подачи


    /////////////таймер на милис даёт s=1 секунде //////////////////////////////////

    if (millis() - myTimer1 >= 1000 )

    { myTimer1 = millis(); s++; } // таймер на millis()

    /////////////////////////////////////////////////////////////////////////////////


    /////////// таймеры подачи и паузы в подаче ///////////////////////////

    if(P=1){

    if (s - taim >= Po ) // таймер паузы

    { taim1=s; P=0;}}


    if(P=0){

    if (s - taim1 >= Pa ) //таймер подачи

    { taim=s; P=1;}}

    ///////////////////////////////////////////////////////////////////

    //****************************************************************************************************

    Serial.print(" T=");Serial.println( taim );

    //************************************************

    delay(100);

    }// END

    но не работает, подскажите что не так?
     
  19. Airbus

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

    Что не так? Код вставлен не правильно—для начала
    [​IMG]
     
  20. Airbus

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

    Второе—Зачем Вы используете millis если не умеете с ним работать? Почему именно millis? У Вас Ардуино делает что то еще? Вы же используете delay(100)? Для чего?
     
    Последнее редактирование: 16 окт 2021