начнем с простого. есть у нас моторчик. нам необходимо чтобы он работал реверсно, по схеме. включался через определённый период, а выключался от датчика наклона MMA7361. образец скетча передрал из другого (по-этому там немного может быть лишнего). первая загвоздка в том, что при таймере в 5 сек все отлично, но нам необходимо 24 часа (плюс минус...) и скетч просто не работает! Код (Text): int dx=398; //задаем положение датчика наклона unsigned long startTime1 = 0; int timeOut1 = 5000; //таймаут boolean timerState1 = false; //флаг таймера unsigned long time; //это для часов в окне монитора void setup() { Serial.begin(9600); pinMode(4, OUTPUT); // задаем выход на мотор digitalWrite(4, LOW); } void loop() { int x; // переменные для хранения значений по осям x = analogRead(A0)-dx; // читаем положение по оси Х Serial.println(); Serial.print("X:"); Serial.print(x); Serial.println(" "); delay(1000); if(x < 90 && (millis() - startTime1) > timeOut1){ //задаем условия на включение моторчика digitalWrite(4, HIGH); timerState1 = true; startTime1 = millis(); } else if(x > 90){ //задаем условие на отключение моторчика timerState1 = false; digitalWrite(4, LOW); } Serial.print("T:"); Serial.print(startTime1); Serial.println(" "); {Serial.print("Time: "); time = millis(); //выводит количество миллисекунд с момента начала выполнения программы Serial.println(time); } }
скетч поправил. работает, но только на малых промежутках времени (до 10 сек). что это может быть???? Код (Text): int dx=398; //задаем положение датчика наклона unsigned long startTime1 = 0; unsigned long startTime2 = 0; int timeOut1 = 5000; //таймаут int timeOut2 = 10000; unsigned long time1; //это для часов в окне монитора unsigned long time2; void setup() { Serial.begin(9600); pinMode(4, OUTPUT); // задаем выход на мотор digitalWrite(4, LOW); pinMode(3, OUTPUT); // задаем выход на реверс мотора digitalWrite(3, LOW); } void loop() { int x; // переменные для хранения значений по осям x = analogRead(A0)-dx; // читаем положение по оси Х Serial.println(); Serial.print("X:"); Serial.print(x); Serial.println(" "); Serial.print("T:"); Serial.print(startTime1); Serial.println(" "); {Serial.print("Time: "); time1 = millis(); time2 = millis(); //выводит количество миллисекунд с момента начала выполнения программы Serial.println(time1); delay(1000); if(x < -60 && (time1 - startTime1) > timeOut1 ){ //задаем условия на включение моторчика digitalWrite(4, HIGH); } if(x > 90){ //задаем условие на отключение моторчика startTime1 = time1; digitalWrite(4, LOW); } if(x > 90 && (millis() - startTime2) > timeOut1 ){ digitalWrite(3, HIGH); // включаем реверсное вращение моторчика } else if(x < -50){ //задаем условие на отключение моторчика startTime2 = millis(); digitalWrite(3, LOW); } } }
итак. получается какая-то странная вещь. вот в таков виде как сейчас есть скетч отказывается с большими значениями Код (Text): int timeOut1 = 5000; более 15 секунд (15000 милисекунд). взял в строке Код (Text): time1 = millis(); добавил "/1000" а в строке таймаут1 изменил на 15 Код (Text): int timeOut1 = 15; и все работает. как так получается не знаю... сейчас тестю на значениях "3600" и "7200" (1 и 2 часа)....
вопрос следующий. возможно ли с помощью кнопки переключаться между режимами. т.е. у меня есть Код (Text): if(x < -60 && (time1 - startTime1) > timeOut1 ){ //задаем условия на включение моторчика digitalWrite(4, HIGH); } if(x > 90){ //задаем условие на отключение моторчика startTime1 = time1; digitalWrite(4, LOW); } if(x > 90 && (millis() - startTime2) > timeOut1 ){ digitalWrite(3, HIGH); // включаем реверсное вращение моторчика } else if(x < -50){ //задаем условие на отключение моторчика startTime2 = millis(); digitalWrite(3, LOW); } а я нажатием кнопки хочу запустить Код (Text): if(x < -60 && (time3 - startTime3) > timeOut3 ){ //задаем условия на включение моторчика digitalWrite(4, HIGH); } if(x > 90){ //задаем условие на отключение моторчика startTime3 = time3; digitalWrite(4, LOW); } if(x > 90 && (millis() - startTime4) > timeOut3 ){ digitalWrite(3, HIGH); // включаем реверсное вращение моторчика } else if(x < -50){ //задаем условие на отключение моторчика startTime4 = millis(); digitalWrite(3, LOW); } такое возможно????