Зависает ардуино

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Pavel111111, 11 фев 2018.

  1. Pavel111111

    Pavel111111 Нуб

    Здравствуйте. Недавно начал заниматься ардуино.
    Столкнулся с такой проблемой ... ардуино зависает. Программа работает так если кнопку удерживают 2 секунды то программа выполняется либо завершается. В самой программе происходит следующее :
    1.Задержка на три секунды(которая выполняется только один раз при включении программы).
    2. Цикл светодиод горит две секунды и гаснет на две секунды.
    (Над выбором переменных я особо не задумывался)
    Периодичности зависаний ардуины нету. Может зависнуть а может и нет. Но всё равно зависает очень часто.(светодиод загорается и горит без остановки либо просто гаснет и не включается)
    unsigned long currentmig ;
    unsigned long lastmig = 0;
    unsigned long lastpress = 0;
    int knopka = 4;
    int knokaflag = 0;
    int lampa = 13;
    int lampaflag = 0;
    int led = 3;
    int migflag = 0;
    int potent = 20;
    int flag = 0;
    void setup() {
    pinMode(knopka,INPUT_PULLUP);
    pinMode (6,OUTPUT);
    pinMode(led,OUTPUT);
    pinMode(lampa,OUTPUT);

    }

    void loop(){
    knopka =!digitalRead(4);
    if(knopka == 1 && knokaflag == 0 && millis() - lastpress >= 1400){
    lastpress = millis();
    lampaflag = !lampaflag;
    knokaflag = 1;
    }
    else if(knopka == 0 && knokaflag == 0 && millis() - lastpress < 1400){
    lastpress = millis();
    }
    if(knopka == 0 && knokaflag == 1 && millis()- lastpress > 50){
    lastpress = millis();
    knokaflag = 0;
    }
    if(lampaflag == 1){
    digitalWrite(led,HIGH);
    }
    else if(lampaflag == 0){
    digitalWrite(led,LOW);
    }
    currentmig = millis();
    if(lampaflag == 1 && migflag == 0 && currentmig - lastmig == 3000){
    lastmig = currentmig;
    migflag = 1;
    }
    else if (lampaflag == 0 && migflag == 0 && currentmig - lastmig < 3000){
    lastmig = currentmig;
    digitalWrite(lampa,LOW);
    migflag = 0;
    }
    if(lampaflag == 1 && migflag == 1 && currentmig - lastmig == 100 ){
    lastmig = currentmig;
    digitalWrite(lampa,HIGH);
    migflag = 2;
    }
    else if(lampaflag == 0 && migflag == 1 && currentmig - lastmig < 100){
    lastmig = currentmig;
    digitalWrite(lampa,LOW);
    migflag = 0;

    }
    if(lampaflag == 1 && migflag == 2 && currentmig - lastmig == 2000){
    lastmig = currentmig;
    digitalWrite(lampa,LOW);
    migflag = 3;
    }
    else if(lampaflag == 0 && migflag == 2 && currentmig - lastmig < 2000){
    lastmig = currentmig;
    digitalWrite(lampa,LOW);
    migflag = 0;

    }
    if(lampaflag == 1 && migflag == 3 && currentmig - lastmig == 2000){
    lastmig = currentmig;
    digitalWrite(lampa,LOW);
    migflag = 1;
    }
    else if(lampaflag == 0 && migflag == 3 && currentmig - lastmig < 2000){
    lastmig = currentmig;
    digitalWrite(lampa,LOW);
    migflag = 0;

    }
    }
     
    Последнее редактирование: 11 фев 2018
  2. ИгорьК

    ИгорьК Давно здесь

  3. danya plotnik

    danya plotnik Гик

    В некоторых случаях лучше не надо употреблять int (надо #define или count int), например:
    int led = 3; // Также лучше писать led большими буквами
    Возможно, из-за этого у тебя зависает
     
  4. DIYMan

    DIYMan Гуру

    Для того, чтобы убедиться, что она действительно зависает - в setup инициализируйте Serial, и в самом конце loop вставьте:
    Код (C++):
    Serial.println("work");
    Откройте монитор порта и смотрите - зависает или просто код не работает так, как нужно вам. Если зависает - причина не в этом коде, возможно, помехи по питанию идут - например, если коммутируете нагрузку через реле.