написание скетча

murash20
Offline
Зарегистрирован: 21.03.2016

Приветствую всех. прошу не кидать камнями, так как новичок. пытаюсь сделать бегущий огонь, включающийся по сигналу от реле поворотов. то есть пока реле подает сигнал прерывистый, огоньки бегают. написал скетч, но почему то не работает. помогите.


#define IN_PIN 2
#define FIRST_LED 4
#define TOTAL_LEDS 10
#define LIGHT_TRESHOLD 1

int sign = digitalRead(IN_PIN);
int ledPin = FIRST_LED;

void setup() 
{
pinMode(IN_PIN, INPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}

void loop() 
{
int lightLevel = sign;
bool play = lightLevel >= LIGHT_TRESHOLD;

if (play)
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
ledPin = (ledPin - FIRST_LED + 1) % TOTAL_LEDS + FIRST_LED;
delay(3000);
} else { 
digitalWrite(ledPin, LOW);
}
}

 

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

А с чего бы её работать, если Вы нигде в loop не читаете ничего с IN_PIN?

Вы уж читайте каждый раз, а то там мож давно че-нить поменялось, а Вы как прочитали один раз в самом начале, так по тому старому значению всю жизнь и живёте.

И, кстати,

murash20 пишет:
Приветствую всех. прошу не кидать камнями, так как новичок. 

был какой-то фильм с депардье и Рено. Там подростки угнали БМВ у конкретных пацанов. Те их догнали, остановили. Подростки с наглым видом выходят из машины и заявляют: "мы несовершеннолетние, и нам плевать на полицию". На что конкретные пацаны резонно ответили: "а мы не из полиции, и нам плевать, что вы несовершеннолетние".

Так и здесь. Или Вы житель этого форума, или нет. А новичёк там или ветеран - лично мне до лампочки.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1. читать IN_PIN нужно тоже в loop, первой строкой (например).

Sindbad
Offline
Зарегистрирован: 08.12.2015

murash20 пишет:
написал скетч, но почему то не работает.

Прежде чем программа заработает, её необходимо скомпилировать. А вы этого еще не сделали. Разбирайтесь с ошибками компиляции, компилятор сообщает тип ошибки и номер строки в которой она обнаружена.

Упрощайте скетч, удаляя все лишнее. Когда от счетча останется только скелет, который все-таки не сможете скомпилировать, если сами не разберетесь, спрашивайте.

fogary
Offline
Зарегистрирован: 05.03.2016

1. Сам код, отвечающий за бегущий огонь (строки 31-35), рабочий?

2. Код из строки 6 лучше перенести и вставить после 21 строки. Иначе выходит, Вы сначало опрашиваете порт, а потом определяете его на вход.

3. В таком виде как сейчас, Вы проверяете состояние реле только один раз, т. е. состояние переменной sign - не меняется.

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

Sindbad пишет:

Прежде чем программа заработает, её необходимо скомпилировать. А вы этого еще не сделали. Разбирайтесь с ошибками компиляции, компилятор сообщает тип ошибки и номер строки в которой она обнаружена.

А в чём проблема? Нормально всё компилируется. 

Sindbad
Offline
Зарегистрирован: 08.12.2015

ЕвгенийП пишет:

А в чём проблема? Нормально всё компилируется. 

Странно,

У меня не компилируются вызовы

int sign = digitalRead(IN_PIN);

вне тела функций

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

Действительно, странно. 

Вы именно этот скетч компилировали или другой и просто помните? Если другой, то наверняка там была другая причина. Такой вызов вполне законен и у меня этот скетч компилируется нормально.

murash20
Offline
Зарегистрирован: 21.03.2016

попробовал изменить


#define IN_PIN 2
#define FIRST_LED 4
#define TOTAL_LEDS 10
#define LIGHT_TRESHOLD 1

int sign = digitalRead(IN_PIN);
int ledPin = FIRST_LED;

void setup() 
{
pinMode(IN_PIN, INPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}

void loop() 
{  
int lightLevel = digitalRead(IN_PIN);
bool play = lightLevel >= LIGHT_TRESHOLD;

if (play)
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
ledPin = (ledPin - FIRST_LED + 1) % TOTAL_LEDS + FIRST_LED;
delay(3000);
} else { 
digitalWrite(ledPin, LOW);
}
}

 

murash20
Offline
Зарегистрирован: 21.03.2016

скомпилировался нормально. записался в контроллер тоже нормально. но не работает. 

Araris
Offline
Зарегистрирован: 09.11.2012

1. Удалите строки 4,6,26,27. Строку 29 измените на if digitalRead(IN_PIN) Так "красивше", впрочем, это всё не так важно.

2. Теперь о важном: что и откуда подаётся на IN_PIN ?

murash20
Offline
Зарегистрирован: 21.03.2016

На макете вывел два провода 5 вольт и второй контакт. Замыкаю их каждую секунду имитируя работу реле поворотов. Пока замыкаю, происходит переключение диодов по очередности. Но задержка переключения с одного на другой три секунды. Видимо не там вставил delay

murash20
Offline
Зарегистрирован: 21.03.2016

всем спасибо. получилось. изменил delay, и перенес строчку int. 


#define IN_PIN 2
#define FIRST_LED 4
#define TOTAL_LEDS 10
#define LIGHT_TRESHOLD 1

int sign = digitalRead(IN_PIN);
int ledPin = FIRST_LED;

void setup() 
{
pinMode(IN_PIN, INPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}

void loop() 
{  
int lightLevel = digitalRead(IN_PIN);
bool play = lightLevel >= LIGHT_TRESHOLD;

if (play)
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
ledPin = (ledPin - FIRST_LED + 1) % TOTAL_LEDS + FIRST_LED;
delay(100);
} else { 
digitalWrite(ledPin, LOW);
}
}

 

murash20
Offline
Зарегистрирован: 21.03.2016

еще вопрос. почему срабатывает от наводки на второй контакт? или это беда китайских плат? достаточно пальцем коснуться, как программа срабатывает.

 

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

murash20 пишет:

еще вопрос. почему срабатывает от наводки на второй контакт? или это беда китайских плат? достаточно пальцем коснуться, как программа срабатывает.

Это Вы открыли для себя новое физическое явление и очень близки к изобретению антенны.

Притяните контакт к земле резистором в 1-5кОм - не будет срабатывать.

И ещё. Вот в этом месте написан какой-то бред:

int lightLevel = digitalRead(IN_PIN);
bool play = lightLevel >= LIGHT_TRESHOLD;

digitalRead не может вернуть ничего, кроме HIGH или LOW. Эта строчка у Вас работает только потому, что LIGHT_TRESHOLD равна 1. Но выглядит это ужасно и непонятно. Гораздо логичнее написать.

bool play = (digitalRead(IN_PIN) == HIGH);