Уменьшить код и увиличить скорость / Отдельные процедуры
- Войдите на сайт для отправки комментариев
Сб, 17/09/2016 - 16:25
Чтобы немного сократить размер скетча, решил повторяющиеся процедуры сократить. И записать 1 с меняющимеся параметрами.
void setup() pinMode(led , OUTPUT); // вверх pinMode(ted , OUTPUT); // вниз pinMode(sed , OUTPUT); // ****** void loop() . . . . if ( Rkod == 58379 ) { digitalWrite(ted, HIGH); DT=500; T=sed ; Gerkon ;} if ( Rkod == 76835 ) { digitalWrite(led, HIGH); DT=300; T=led ; Gerkon ;} if ( Rkod == 76898 ) { digitalWrite(ted, HIGH); DT=100; T=ted ; Gerkon ;} if ( Rkod == 58379 ) { digitalWrite(sed, HIGH); T=sed; MsTimer2::start(); } if ( Rkod == 58369 ) { digitalWrite(led, HIGH); T=led; MsTimer2::start(); } if ( Rkod == 58377 ) { digitalWrite(ted, HIGH); T=ted; MsTimer2::start(); } . . . }} void Gerkon() { if ( analogRead (0)>=DT ) { digitalWrite(T, LOW); } }
Помогите разобраться . Программа останавливается. Включает диод, и не проверяет геркон на а0.
на пин а0 включён геркон и резистор.
с радио пульта зажигаются лампы, а если сработает геркон, соответствующая лампа должна погаснуть. на ( а0 ) подключил сборку резисторов, и герконы. аналоговый вход а0 , их мереет, и при соответсвенном должна сработать на выкл.
в строках 12, 13, 14. DT=500 и тд. должен был передать в строку 27 параметры, при достежении которых должно было срабатывать, и выключать, лампу.
Но происходит полная остановка, и аналоговый вход не делает измерений, и соответственно не гасит лампу. Есть повторяющиеся строки, чтоб их убрать. Решил сделать отдельную процедуру, и обращатся туда, когда надо. void Gerkon() / там в отдельной процедуре должен считываться, с аналог входа а0, данные с герконов, через ( резисторы ), и при достежении заданных параметров, гасить соответствующую лампу.
Подскажите что не так я делаю.
Функцию надо вызвать так - Gerkon()
в строках 12, 13, 14. DT=500 и тд. должен был передать в строку 27 параметры
Не должен. Почитайте, как надо передавать параметры в функцию, у Вас нет передачи параметров. Ещё можно объявить переменную DT глобальной, тогда с её значением можно работать и внутри if() и внутри функции Gerkon() без передачи параметров.
if ( Rkod == 58379 ) { digitalWrite(ted, HIGH); DT=500; T=ted ; Gerkon();} тут ? 12, 13 , 14 строки поменял. Ни чего не происходит не выключает, аналоговый не делает измерений, и цикл void loop . остановился.
DT уже объявлена int DT=0;
if ( Rkod == 58379 ) { digitalWrite(ted, HIGH); DT=500; T=ted ; Gerkon();} тут ?
Да, тут.
12, 13 , 14 строки поменял. Ни чего не происходит не выключает, аналоговый не делает измерений, и цикл void loop . остановился.
Ну так а передачу параметров кто делать будет? Где и как объявлены переменные DT и T тоже не видно.
ошибка прилетает если декламировать в скобках. в 25 строке.
Arduino: 1.6.8 (Windows XP), Плата:"Arduino/Genuino Uno"
exit status 1
too few arguments to function 'void Gerkon(int, int)'
Переменные объявлены глобально ещё до void setup() int D, DT;
если есть переход на строчке 12 Gerkon() if ( Rkod == 58379 ) { digitalWrite(ted, HIGH); DT=500; T=ted ; Gerkon();}
и активна 25 строка ( void Gerkon() { ) процес чтения из аналогова входа а0 - останавливается. всё что в Gerkon не работает. Всё остальное работает.
Кто нибудь подскажет , Что делать, как заставить работать void Gerkon() { ************* }
чтение данных с аналогова входа останавливается. и дальше не идет.
Можно весь скетч? В строке 29 нет ошибки?
может так
if
( Rkod == 58379 ) { digitalWrite(ted, HIGH); T=sed ; Gerkon(500) ;}
if
( Rkod == 76835 ) { digitalWrite(led, HIGH); T=led ; Gerkon(300) ;}
if
( Rkod == 76898 ) { digitalWrite(ted, HIGH); T=ted ; Gerkon(100) ;}
......
........
void
Gerkon(unsigned int val) {
28
29
if
( ger >= val ) { digitalWrite(T, LOW); }
нет чтения данных с аналогова входа.
в 30 строку ввел Serial.println(ger);
при нажатии кнопки работает строка 16. включается лампа. и сериал порту 1 раз появляется показания, с аналогова входа, данные 453 (это сопротивление), и номер кода кнопки 58379, что я нажал. и всё стоит. лампа не гаснет потому что нет постоянного опроса аналогова входа а0. а сработает если будет 500. на а0
Очень интересны две закрывающие скобки в стр. 25. Соответствующих им открывающих, не видно. У вас там loop() не попал ли внутрь setup() часом?
UPD. Ну и чего вы исправили молчком? Реальный то исходный код какой? И где у setup() открывающая фигурная? Ерунду какую-то сюда вываливаете и хотите, чтобы вам помогли. Будете фигней маятся, фигня и получится.
нет . там всё норм. это для краткости. Идея была сократить прогу. Есть повторяющиеся строки, чтоб их убрать. Решил сделать отдельную процедуру, и обращатся туда, когда надо. void Gerkon() / там в отдельной процедуре, должен считываться с аналог входа а0, данные с герконов, через ( резисторы ), и при достежении заданных параметров, гасить соответствующую лампу.
Но в одельной процедуре, не считываются, показания постоянно, а только раз 1 раз. и ничего соответственно не выключается.
почемуто ничего не передаётся с 14 строки где идёт опрос Аналогова пина. В 29 строку где есть код сравнения, данных отработки каторые мне надо.
??
TovBender, можно посмотреть весь скетч? Просто ты насокращал и выложил с опечатками.
01
void
setup
()
02
pinMode(led , OUTPUT);
// вверх
03
pinMode(ted , OUTPUT);
// вниз
04
pinMode(sed , OUTPUT);
// ******
05
06
void
loop
()
07
.
08
.
09
.
10
.
11
12
if
( Rkod == 58379 ) { digitalWrite(ted, HIGH); DT=500; T=sed ; Gerkon ;}
13
if
( Rkod == 76835 ) { digitalWrite(led, HIGH); DT=300; T=led ; Gerkon ;}
14
if
( Rkod == 76898 ) { digitalWrite(ted, HIGH); DT=100; T=ted ; Gerkon ;}
15
16
if
( Rkod == 58379 ) { digitalWrite(sed, HIGH); T=sed; MsTimer2::start(); }
17
if
( Rkod == 58369 ) { digitalWrite(led, HIGH); T=led; MsTimer2::start(); }
18
if
( Rkod == 58377 ) { digitalWrite(ted, HIGH); T=ted; MsTimer2::start(); }
19
20
.
21
.
22
.
23
}}
24
25
void
Gerkon() {
26
27
if
( analogRead (0)>=DT ) { digitalWrite(T, LOW); }
28
29
}
В строке 12 наверно тоже опечатка? Так должно было быть? - if ( Rkod == 58379) { digitalWrite(sed, HIGH)....
#8 там поточнее. #10
из 16 строки должны передоваться данные DT - это геркон сопротивление 500, из 17 строки DT - 300. и Т - это название пина для гашения его. в 29 строчку для обработки.
если по другому, то будут 4 лишние строчки в 26 строке, придётся добавить
if ( analogRead (0)>=500) { digitalWrite(ted, LOW); } и еще 3 такихже для других ламп. А задумка была сократить код, и убрать похожие строки.
Если вместо вызова функции Gerkon(), вставить прямо строку
работает правильно? Или то же не работает?
работает.
Так ты свою задачу, использовать функцию так и не выполнил.
Тебе Jeka_M писал о передачи параметров в фунцию в #4.
Почитай тут http://arduino.ru/Reference/FunctionDeclaration
Navigator
Спасибо за подсказки. Я с функцией разобрался. если идёт передача в функцию, то там не работает сравнение по If . Только 1 раз срабатывает, во время нажатия кнопки включить лампу, 1 раз проверяется. если удерживать кнопку вкл лампы, то идёт постоянная отправка данных, с геркона. позже попробовал разбить пополам
......
.....
if ( analogRead (0)>=DT ) { Gerkon() ;}
void Gerkon ()
digitalWrite(T, LOW) ; Так всё заработало.
или запустить там цикл for ( i > ну и тд. ) тоже всё заработало . Но увиличился размер кода.
Сейчас всё работает ВСЕМ БОЛЬШОЕ СПАСИБО.