Уменьшить код и увиличить скорость / Отдельные процедуры

TovBender
Offline
Зарегистрирован: 12.04.2015

Чтобы немного сократить размер скетча, решил повторяющиеся процедуры сократить. И записать 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 включён геркон и резистор.

TovBender
Offline
Зарегистрирован: 12.04.2015

с радио пульта зажигаются лампы, а если сработает геркон, соответствующая лампа должна погаснуть. на (  а0 ) подключил сборку резисторов, и герконы. аналоговый вход а0 , их мереет, и при соответсвенном должна сработать на выкл.

в строках 12, 13, 14.    DT=500 и тд.  должен был передать в строку 27 параметры, при достежении которых должно было  срабатывать, и выключать, лампу.

Но происходит полная остановка, и аналоговый вход не делает измерений, и соответственно не гасит лампу.   Есть повторяющиеся строки, чтоб их убрать.  Решил сделать отдельную процедуру, и обращатся туда, когда надо. void Gerkon() / там в отдельной процедуре должен считываться, с аналог входа а0, данные с герконов, через ( резисторы ), и при достежении заданных параметров, гасить соответствующую лампу.

 

Подскажите что не так я делаю.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Функцию надо вызвать так -  Gerkon()

Цитата:

в строках 12, 13, 14.    DT=500 и тд.  должен был передать в строку 27 параметры

Не должен. Почитайте, как надо передавать параметры в функцию, у Вас нет передачи параметров. Ещё можно объявить переменную DT глобальной, тогда с её значением можно работать и внутри if() и внутри функции Gerkon() без передачи параметров.

TovBender
Offline
Зарегистрирован: 12.04.2015

if ( Rkod == 58379 ) { digitalWrite(ted, HIGH); DT=500; T=ted ; Gerkon();}   тут ?   12, 13 , 14 строки поменял.  Ни чего не происходит не выключает, аналоговый не делает измерений, и цикл void loop .  остановился.

DT уже объявлена int DT=0;

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

TovBender пишет:

if ( Rkod == 58379 ) { digitalWrite(ted, HIGH); DT=500; T=ted ; Gerkon();}   тут ?  

Да, тут.

TovBender пишет:

12, 13 , 14 строки поменял.  Ни чего не происходит не выключает, аналоговый не делает измерений, и цикл void loop .  остановился.

Ну так а передачу параметров кто делать будет? Где и как объявлены переменные DT и T тоже не видно.

TovBender
Offline
Зарегистрирован: 12.04.2015

ошибка прилетает если декламировать в скобках. в 25 строке.

Arduino: 1.6.8 (Windows XP), Плата:"Arduino/Genuino Uno"

exit status 1
too few arguments to function 'void Gerkon(int, int)'

TovBender
Offline
Зарегистрирован: 12.04.2015

Переменные объявлены глобально ещё до void setup()    int D, DT;

TovBender
Offline
Зарегистрирован: 12.04.2015

если есть переход   на строчке 12 Gerkon()     if ( Rkod == 58379 ) { digitalWrite(ted, HIGH); DT=500; T=ted ; Gerkon();}   

и активна 25 строка ( void Gerkon() { )  процес чтения из аналогова входа а0  - останавливается. всё что в Gerkon не работает.    Всё остальное работает.

Кто нибудь подскажет , Что делать,  как заставить работать void Gerkon() { ************* }

TovBender
Offline
Зарегистрирован: 12.04.2015

чтение данных с аналогова входа останавливается. и дальше не идет.

int DT;
int T;
int ger;

void setup()
pinMode(led , OUTPUT); // вверх 
  pinMode(ted , OUTPUT); // вниз 
  pinMode(sed , OUTPUT); // ******
pinMode(a0, INPUT); // Геркон

void loop() {
....
....
ger=analogRead (0);

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  ( ger ) >= DT )   { digitalWrite(T, LOW);  }

} 

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Можно весь скетч? В строке 29 нет ошибки?

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

 

может так

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);  }

 

TovBender
Offline
Зарегистрирован: 12.04.2015

нет чтения данных с аналогова входа.

в 30 строку ввел Serial.println(ger);  

при нажатии кнопки работает строка 16.  включается лампа. и сериал порту 1 раз появляется показания, с аналогова входа, данные 453 (это сопротивление),  и номер кода кнопки 58379, что я нажал. и всё стоит.  лампа не гаснет потому что нет постоянного опроса аналогова входа а0. а сработает если будет 500. на а0

a5021
Offline
Зарегистрирован: 07.07.2013

Очень интересны две закрывающие скобки в стр. 25. Соответствующих им открывающих, не видно. У вас там loop() не попал ли внутрь setup() часом?

UPD. Ну и чего вы исправили молчком? Реальный то исходный код какой? И где у setup() открывающая фигурная? Ерунду какую-то сюда вываливаете и хотите, чтобы вам помогли. Будете фигней маятся, фигня и получится.

TovBender
Offline
Зарегистрирован: 12.04.2015

нет . там всё норм. это для краткости.  Идея была сократить прогу.  Есть повторяющиеся строки, чтоб их убрать. Решил сделать отдельную процедуру, и обращатся туда, когда надо.   void Gerkon()   /  там в отдельной процедуре, должен считываться с аналог входа а0,  данные с герконов, через ( резисторы ), и при достежении заданных параметров, гасить соответствующую лампу.

Но в одельной процедуре, не считываются, показания постоянно, а только раз 1 раз. и ничего соответственно не выключается.

почемуто ничего не передаётся с 14 строки где идёт опрос Аналогова пина. В 29 строку где есть код сравнения, данных отработки каторые мне надо.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

??

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

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)....

TovBender
Offline
Зарегистрирован: 12.04.2015

                                     #8 там поточнее.     #10

из 16 строки должны передоваться данные DT - это геркон сопротивление 500, из 17 строки DT - 300. и  Т - это название пина для гашения его.  в 29 строчку для обработки.

если по другому, то будут 4 лишние строчки в 26 строке, придётся добавить      

if ( analogRead (0)>=500) { digitalWrite(ted, LOW); } и еще 3 такихже для других ламп.  А задумка была сократить код, и убрать похожие строки.

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

   

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

Если вместо вызова функции Gerkon(), вставить прямо строку

if ( analogRead (0)>=DT ) { digitalWrite(T, LOW);  }

работает правильно? Или то же не работает?

TovBender
Offline
Зарегистрирован: 12.04.2015

работает.

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Так ты свою задачу, использовать функцию так и не выполнил.

Тебе Jeka_M писал о передачи параметров в фунцию в #4.

Почитай тут http://arduino.ru/Reference/FunctionDeclaration

 

TovBender
Offline
Зарегистрирован: 12.04.2015

Navigator  

Спасибо за подсказки.     Я с функцией разобрался. если идёт передача в функцию, то там не работает сравнение по If .  Только 1 раз срабатывает, во время нажатия кнопки включить лампу, 1 раз проверяется. если удерживать кнопку вкл лампы, то идёт постоянная отправка данных, с геркона.    позже попробовал разбить пополам     

......

.....

if ( analogRead (0)>=DT ) {  Gerkon() ;}         

void Gerkon ()

digitalWrite(T, LOW)  ;                                    Так всё заработало.

или запустить там цикл for ( i > ну и тд. )   тоже всё заработало .  Но увиличился размер кода.

Сейчас всё работает ВСЕМ БОЛЬШОЕ СПАСИБО.