помогите новечку

raicor
Offline
Зарегистрирован: 31.07.2013
Всем доброе время суток.
прошу о помощи для создания такой функции:
нажимаю на S1 не отпуская, через одну секунду загорается LED1 через две секунды загорается LED2 на одну секунду а потом выключается через пол секунды загорается LED3 
отпуская S1 выключается LED3 LED1 остается включенным,
нажимаю S2 и отпускаю через 5 секунд выключается LED1.
как можно сделать без delay?
Всем огромное спасибо спасибо за ранее.
 
JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012
raicor
Offline
Зарегистрирован: 31.07.2013

Помогите пожалуйста, пробую но ничего не получается

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Мы Ваше "пробую" не видим, скетч хотя бы выложите. Было бы неплохо еще знать какая Ардуина используется, хотя бы для статистики.

Слово новИчок пишется через И, а не через Е

vvadim
Offline
Зарегистрирован: 23.05.2012

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

здесь показано как правильно подключать кнопку.

raicor
Offline
Зарегистрирован: 31.07.2013

const int s1 = 12; 
const int s2 = 10;
const int led1 =  1;     
const int led2 =  2; 
const int led3 =  3; 
long previousMillis = 0; 
long previousMillis1 = 0;
int val=0; 
int val1=0;
void setup() {
  
pinMode(led1, OUTPUT); 
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(s1, INPUT); 
pinMode(s2, INPUT);   
}

void loop(){
  
 if(digitalRead(s1)==HIGH){ 
         
 if (millis() -previousMillis >300){ 
 previousMillis = millis();     
 val++; 
 } 
 } 
 else { 
 val=0; 
 } 
 if(val>=5) { 
 digitalWrite (led1,HIGH); 
 val=0; 
 delay (500);
 digitalWrite (led2,HIGH);
 delay (1000);
 digitalWrite (led2,LOW);
 delay (300);
 digitalWrite (led3,HIGH);
 }
 if(digitalRead(s1)==LOW){ 
 digitalWrite (led3,LOW);
 }
 if(digitalRead(s2)==HIGH){ 
         
 if (millis() -previousMillis1 >300){ 
 previousMillis1 = millis();     
 val1++; 
 } 
 } 
 else { 
 val1=0; 
 } 
        
 if(val1>=5) { 
 digitalWrite(led1,LOW);
 val1=0; 
 } 
 }
 

Извиняюсь за ошибку, просто писал с телефона. 

у меня Arduino UNO R3, на данный момент проблема состоит в том что при удержание S1, LED2 бесконечно мигает

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Давайте посмотрим как работает скетч, если нажата только S1:

1.  21-30. Постоянно увеличивается счетчик.

2. 31-40. Через 1,5с включится LED1. Затем, через 0.5с включится  LED2, а через 1с LED2 погаснет. Еще через 300 мс включится LED3 и больше никогда не погаснет.

3. Поскольку S1 == HIGH, а S2 == LOW, строки 41-59 можно игнорировать.

Всё работает именно так, как запрограммировано, т.е. при нажатой S1 LED1 & LED3 постоянно горят, а LED2 мигает.

Просьба прежде чем вставлять код, хотя бы его отформатировать (Ctrl-T в ArduinoIDE), это очень поможет сделать исходник более читабельным.

По поводу "без delay", нужно нарисовать диаграмму работы, накоторой отметить время нажатия кнопки и зажигания каждого светодиода. После этого рассчитать паузы между событиями (зажиганием и гашением светодиодов). Зная точку старта (у Вас уже есть начало, Вы сохранили в это время millis(). Дальше просто. При нажатии кнопки, сохраняем время нажатия и устанавливаем флажок того, что кнопка нажата, далее в цикле, если флажок установлен (т.е. кнопка нажата), отмеряя разницу между моментом нажатия и текущим millis() зажагем или гасим нужный светодиод. Попробуйте - это может реально помочь. Потому что это визуально позволяет понять, когда и что происходит.

ПС Я скетч грузил в свой Леонардо и пробовал, потому не голословно говорю.

Кстати, пин 1 лучше не использовать (точнее 0 и 1), переключитесь на другой, например, на 4. Во всяком случае пока не используйте.

 

toc
Offline
Зарегистрирован: 09.02.2013

...

недавно слышал байку: Девушка-отличница защищает диплом. На доске висит принципиальная схема. Всё успешно и ей поставят отл. Один из экзаменаторов задаёт последний вопрос: "Что это такое? (показавает на индуктивноть)". - "Пружинка" - таков был ответ.

...

sp34
Offline
Зарегистрирован: 05.03.2013

 Ребята ! посмотрите правильно ли написано ? - спрашиваю по тому , что "Temp" - это температура , которая может быть и со знаком -

и так как от "0"C и ниже программе надо выполнить одно и тоже действие то условия if(XXXXXX < 0) не последовало и я написал вот так в сторке 2

     unsigned int Temp_Auto_Switch = Temp;
     Temp_Auto_Switch = constrain(Temp_Auto_Switch, 0, 20); // - проверочная функция , где "Temp_Auto_Switch" есле меньше 0 то будет равна 0 , а если больше 20 то будет равна 20 !
     Temp_Auto_Switch = map(Temp_Auto_Switch, 0, 20, 35000, 0); // - Temp_Auto_Switch от 0 до 20 выводим как 35000  до  0
     Temp_Auto_Switch = constrain(Temp_Auto_Switch, 0, 35000); // - проверочная функция , где "Temp_Auto_Switch" есле больше 35 000 то будет равна 35 000 , а если меньше 0 то будет равна 0 !

но не имея опыта немного сомневаюсь правельно ли я указал все в коде ?

Еще переживал за то , когда температура будет -20 при пропорции заданной в стр 3 какое бы число вернулось ( 70 000  ? ) и переменная unsigned int была бы не достаточна по объему , и целесообразнее было бы использовать unsigned long ?