Помогите со скетчем для Arduino Nano, пожалуйста!

nevikat
Offline
Зарегистрирован: 08.02.2018

Здравствуйте! Делаю светофор для ребёнка. И у меня вопрос: как сделать для него скетч, в котором вместо delay() используется millis(). Вот скетч, сделанный на delay():

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {
  digitalWrite(2, HIGH);
  delay(27000);
  digitalWrite(3, HIGH);
  delay(3000);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  delay(30000);
  digitalWrite(4, LOW);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Для чего вам миллис в такой простой программе?

nevikat
Offline
Зарегистрирован: 08.02.2018

Хочу сделать настройку задержки через потенциометр. Звучит глупо, но так надо.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
sadman41
Offline
Зарегистрирован: 19.10.2016

Нет, ну миллис - это модно и современно, но тогда вам придется нагородить кучу флагов или конечный автомат написать. Справитесь?

Moжет просто в delay натыкать переменных, значение которых рассчитывать по map() в зависимости от положения потенциометра - значения на A-входе?

nevikat
Offline
Зарегистрирован: 08.02.2018

ага, но считываться значения когда будут? Раз в 1 минуту???

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Подкрутили - кнопка ресет. Быстро надежно и голова не болит.https://www.youtube.com/watch?v=Z0NwqOPDQNE

nevikat
Offline
Зарегистрирован: 08.02.2018

И мне каждую секунду перезагружать ардуинку? Или как?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

зато общение будет с ребенком. А потом ребенка можно научить крутить и кнопку нажимать. Вводить ребенка в серьезные дела.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вот, конечный автомат, разбирайтесь:

typedef enum
{
	msStep0,
	msStep1,
	msStep2,
	msStep3
	
} MachineState;

MachineState machineState = msStep0;
unsigned long timer = 0;

void setup() 
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() 
{
	
	switch(machineState)
	{
		case msStep0:
		{
			digitalWrite(2, HIGH);
			timer = millis();
			machineState = msStep1;
		}
		break;
		
		case msStep1:
		{
			if(millis() - timer > 27000)
			{
				 digitalWrite(3, HIGH);
				 timer = millis();
				 machineState = msStep2;
			}
		}
		break;
		
		case msStep2:
		{
			if(millis() - timer > 3000)
			{
				digitalWrite(2, LOW);
				digitalWrite(3, LOW);
				digitalWrite(4, HIGH);
				timer = millis();
				machineState = msStep3;
				
			}
		}
		break;
		
		case msStep3:
		{
			if(millis() - timer > 30000)
			{
				digitalWrite(4, LOW);
				timer = millis();
				machineState = msStep0;
			}
		}
		break;
		
	} // switch
    
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

То раз в минуту, то раз в секунду...  Поищите на форуме тему про конечные автоматы, ЕвгенийП подробно все расписывал, чуть ли не в картинках.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот прямо на Вашу тему - http://arduino.ru/forum/programmirovanie/sketch-svetofora-bez-delay

И вообще, просто вбейте в правом верхнем углу в окне поиска слово сфетофор. Его до Вас уже столько народу делало.

Ведь, не искали, правда же?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nevikat пишет:

И мне каждую секунду перезагружать ардуинку? Или как?

Поставьте регулировщика и пусть светофор вручную включает. А то вдруг "чатланин" поедет, а Ваша глупая автоматика "ку" не сделает - нехорошо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nevikat пишет:

ага, но считываться значения когда будут? Раз в 1 минуту???

А какой смысл менять частоту чаще, чем 1 раз за период?