Здравствуйте. Недавно начал заниматься ардуино. Столкнулся с такой проблемой ... ардуино зависает. Программа работает так если кнопку удерживают 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; } }
В некоторых случаях лучше не надо употреблять int (надо #define или count int), например: int led = 3; // Также лучше писать led большими буквами Возможно, из-за этого у тебя зависает
Для того, чтобы убедиться, что она действительно зависает - в setup инициализируйте Serial, и в самом конце loop вставьте: Код (C++): Serial.println("work"); Откройте монитор порта и смотрите - зависает или просто код не работает так, как нужно вам. Если зависает - причина не в этом коде, возможно, помехи по питанию идут - например, если коммутируете нагрузку через реле.