Помогите разобраться с проблемой!

Alexandra
Offline
Зарегистрирован: 03.12.2014

Здравствуйте! Помогите, пожалуйста, бедной девушке. Уже просто  в отчаянии. У меня к аналоговому входу подключен потенциометр. Необходимо следующее: пока значение потенциометра находится в каком-то диапазоне значений, необходимо, чтобы выполнялась та или иная работа arduino (загорались те или иные светодиоды, подключенные к arduino). Я написала программу, но она не работает, вообще. Т.е. как ни крути этот потенциометр, диоды не горят. Прошу, помогите найти ошибку, пожалуйста!

Вот сама программа:

void setup ()
{
  pinMode(4,OUTPUT); // инициализация портов 4,7,8,12,13 на выход
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
}
void loop (){
int val=analogRead(A0); // считывание значения с потенциометра
while (0<=val<=93) {  // предел изменения значения потенциометра
    digitalWrite (4,LOW); // все светодиоды выключены
    digitalWrite (7,LOW);
    digitalWrite (8,LOW);
    digitalWrite (12,LOW);
    digitalWrite (13,LOW);
while (94<=val<=187){
    digitalWrite (4,HIGH); // горит только с 4 выхода
    delay (5000);
    digitalWrite (4,LOW);
    delay (50000);
  }
 
while (188<=val<=281)
{
    digitalWrite (7,HIGH); // горит только с 7 выхода
    delay (5000);
    digitalWrite (7,LOW);
    delay (50000);
  }
while (282<=val<=375){
    digitalWrite (8,HIGH); // горит только с 8 выхода
    delay (5000);
    digitalWrite (8,LOW);
    delay (50000);
  }
 
while (376<=val<=469){
    digitalWrite (12,HIGH); // горит только с 12 выхода
    delay (5000);
    digitalWrite (12,LOW);
    delay (50000);
  }
 
while (470<=val<=563){
    digitalWrite (13,HIGH);  // горит только с 13 выхода
    delay (5000); 
    digitalWrite (13,LOW);
    delay (50000);
  }
 
while (564<=val<=657){
    digitalWrite (4,HIGH); // горят все светодиоды
    digitalWrite (7,HIGH);
    digitalWrite (8,HIGH);
    digitalWrite (12,HIGH);
    digitalWrite (13,HIGH);  
    delay (5000);
    digitalWrite (4,LOW);
    digitalWrite (7,LOW);
    digitalWrite (8,LOW);
    digitalWrite (12,LOW);
    digitalWrite (13,LOW);
    delay (50000);
  }
 
while (658<=val<=751){
    digitalWrite (4,HIGH); // горит только с 4 и 7 выходов
    digitalWrite (7,HIGH);
    delay (5000);
    digitalWrite (4,LOW);
    digitalWrite (7,LOW);
    delay (5000);
}
 
while (752<=val<=845){
    digitalWrite (8,HIGH); // горит только с 8 и 12 выходов
    digitalWrite (12,HIGH);
    delay (5000);
    digitalWrite (8,LOW);
    digitalWrite (12,LOW);
    delay (5000);
}
while (846<=val<=939){
    digitalWrite (4,HIGH); // поочередное зажигание всех светодиодов
    delay (5000);
    digitalWrite (4,LOW);
    digitalWrite (7,HIGH);
    delay (5000);
    digitalWrite (7,LOW);
    digitalWrite (8,HIGH);
    delay (5000);
    digitalWrite (8,LOW);
    digitalWrite (12,HIGH);
    delay (5000);
    digitalWrite (12,LOW);
    delay (5000);
}
while (940<=val<=1023){
    digitalWrite (4,HIGH); // поочередное зажигание по 2 светодиода
    digitalWrite (7,HIGH);
    delay (5000);
    digitalWrite (4,LOW);
    digitalWrite (7,LOW);
    delay (5000);
    digitalWrite (8,HIGH);
    digitalWrite (12,HIGH);
    delay (5000);
    digitalWrite (8,LOW);
    digitalWrite (12,LOW);
    delay (5000);
}

}

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

0<=val<=93)

заменить 

val >= 0 && val <=93

и так далее

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и еще. проще использовать массив для границ. и использовать данные из него

Alexandra
Offline
Зарегистрирован: 03.12.2014

Большое спасибо. Исправлю. 

Alexandra
Offline
Зарегистрирован: 03.12.2014

Я с arduino работаю первый раз. К сожалению, в этой области я полный ноль) Поэтому вряд ли я смогу тут поработать с матрицами и так далее... Но все рвно, благодарю Вас за совет. 

Snubist
Offline
Зарегистрирован: 18.02.2013

Для первого раза не плохо. А так если знакомы с С# то все просто.

Alexandra
Offline
Зарегистрирован: 03.12.2014

Спасибо. Знакома, практиковала, но это было так давно, что сначала немного растерялась. 

Datak
Offline
Зарегистрирован: 09.10.2014

...А в конце каждого while, перед закрывающей скобкой, добавьте val=analogRead(A0);

А то ведь так и не замигает ничего. :)

Alexandra
Offline
Зарегистрирован: 03.12.2014

:) Учту, спасибо!

Alexandra
Offline
Зарегистрирован: 03.12.2014

И снова здравствуйте! Переделала программу с учетом замечаний, но получила новую проблему. Arduino считывает значение потенциометра только один раз в самом начале программы и выполняет ту программу, в пределы которой попадает измеренное значение потенциометра. И как бы я не крутила ручку этого потенциометра, значение val не меняется и режимы не переключаются.

Код программы с исправлениями

void setup ()
{
  pinMode(4,OUTPUT); // инициализация портов 4,7,8,12,13 на выход
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
}
void loop (){
int val=analogRead(A0); // считывание значения с потенциометра
while (val>=0 && val<=93) {  // предел изменения значения потенциометра
    digitalWrite (4,LOW); // все диоды выключены
    digitalWrite (7,LOW);
    digitalWrite (8,LOW);
    digitalWrite (12,LOW);
    digitalWrite (13,LOW);
    val=analogRead(A0);
while ( val>=94 && val<=187){
    digitalWrite (4,HIGH); // горит только с 4 выхода
    delay (5000);
    digitalWrite (4,LOW);
    delay (50000);
    val=analogRead(A0);
  }
 
while (val>=188 && val<=281)
{
    digitalWrite (7,HIGH); // горит только с 7 выхода
    delay (5000);
    digitalWrite (7,LOW);
    delay (50000);
    val=analogRead(A0);
  }
while (val>=282 && val<=375){
    digitalWrite (8,HIGH); // горит только с 8 выхода
    delay (5000);
    digitalWrite (8,LOW);
    delay (50000);
    val=analogRead(A0);
  }
 
while (val>=376 && val<=469){
    digitalWrite (12,HIGH); // горит только с 12 выхода
    delay (5000);
    digitalWrite (12,LOW);
    delay (50000);
    val=analogRead(A0);
  }
 
while (val>=470 && val<=563) {
    digitalWrite (13,HIGH);  // горит только с 13 выхода
    delay (5000); 
    digitalWrite (13,LOW);
    delay (50000);
    val=analogRead(A0);
  }
 
while (val>=564 && val<=657){
    digitalWrite (4,HIGH); // горят все диоды
    digitalWrite (7,HIGH);
    digitalWrite (8,HIGH);
    digitalWrite (12,HIGH);
    digitalWrite (13,HIGH);  
    delay (5000);
    digitalWrite (4,LOW);
    digitalWrite (7,LOW);
    digitalWrite (8,LOW);
    digitalWrite (12,LOW);
    digitalWrite (13,LOW);
    delay (50000);
    val=analogRead(A0);
  }
 
while (val>=658 && val<=751){
    digitalWrite (4,HIGH); // горит только с 4 и 7 выходов
    digitalWrite (7,HIGH);
    delay (5000);
    digitalWrite (4,LOW);
    digitalWrite (7,LOW);
    delay (5000);
    val=analogRead(A0);
}
 
while (val>=752 && val<=845){
    digitalWrite (8,HIGH); // горит только с 8 и 12 выходов
    digitalWrite (12,HIGH);
    delay (5000);
    digitalWrite (8,LOW);
    digitalWrite (12,LOW);
    delay (5000);
    val=analogRead(A0);
}
while (val>=846 && val<=939){
    digitalWrite (4,HIGH); // поочередное зажигание всех диодов
    delay (5000);
    digitalWrite (4,LOW);
    digitalWrite (7,HIGH);
    delay (5000);
    digitalWrite (7,LOW);
    digitalWrite (8,HIGH);
    delay (5000);
    digitalWrite (8,LOW);
    digitalWrite (12,HIGH);
    delay (5000);
    digitalWrite (12,LOW);
    delay (5000);
    val=analogRead(A0);
}
while (val>=940 && val<=1023){
    digitalWrite (4,HIGH); // поочередное зажигание по 2 диода
    digitalWrite (7,HIGH);
    delay (5000);
    digitalWrite (4,LOW);
    digitalWrite (7,LOW);
    delay (5000);
    digitalWrite (8,HIGH);
    digitalWrite (12,HIGH);
    delay (5000);
    digitalWrite (8,LOW);
    digitalWrite (12,LOW);
    delay (5000);
    val=analogRead(A0);
}
}
 
vvadim
Offline
Зарегистрирован: 23.05.2012

Замените все while на if.

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

Почитайте http://arduino.ru/Reference/While

И вставляйте код под банер  http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Alexandra
Offline
Зарегистрирован: 03.12.2014

Большое все спасибо, кто не остался равнодушным к моей проблеме и помог! Всё работает! ) 

art-mistik
Offline
Зарегистрирован: 05.12.2014

Мужики, не знаю в какую ветку написать ((((

Помогите - плз)))
Задача такая:

после подключения питание на тини - 15 мин ждем, потом 2 часа сигнал на 2 порте, пять секунд отдыхаем и снова на два часа сигнал и закольцевать - два часа сигнал, пять секунд отдых, два часа работа и пять сек отдых и т.д. Только при включ, одноразово отсчитать 15минут, а затем цикл два часа - пять секунд и спо новой

спасибо, может кто поможет, я сам не бум бум ))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я не. ты даже не хочешь попробовать сам сделать. зачем на тебя время тратить

art-mistik
Offline
Зарегистрирован: 05.12.2014

Я пробовал - ничего не получается. Хотя думается что сложности нет, хотя для кого как - кто в этом мало разбирается то нужно много времени что изучить и понять алгоритм работы. Ну а кто уже с этим работает, думаю просчше или тогда мы тут зачем - так порисовать кто лучше кому нос утрет ???!!! )))))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да ну. почитай про delay для начала. может ясность появится

и что она делает

http://arduino.ru/Reference/Delay

std
Offline
Зарегистрирован: 05.01.2012

А мне ведь вчера этот вопрос в другой ветке попался? Постить в кучу тем нехорошо.

Предлагаю помочь мне в разработке суммой в 3k. Сделаем с RTC, и будет ровно, 2 часа и 5 секунд.

Sergivan
Offline
Зарегистрирован: 11.09.2014

Вместо delay обработку через

            PM=millis();
            CM=millis();
            while (CM-PM<500) {        
            CM=millis();

...

}