Помогите написать трудный код

next-999
Offline
Зарегистрирован: 30.09.2013
Если значение на аналог 1 меньше 300 тогда горят светодиоды 2,3,4.
Если значение на аналог 1 больше 300 тогда работает следующий алгоритм
 
Если значение меньше чем 700 на аналог 2 => тогда включить светодиоды: 6,7,8,9
ЕСЛИ значение от 700 до 750 тогда выключить все светодиоды и влключить светодиоды 4,5,6
если значение от 750 до 800 тогда  выключить все светодиоды и  включить светодиоды 3,4,10
Если значение от 800 до 850 тогда  выключить все светодиоды и  включить светодиоды 2,5,6
но если вдруг значение на аналог 1 стало меньше 300 - тогда оставить гореть прошлое значение
 
НАПРИМЕР - ардуино подключается в питанию - горят светодиоды 2,3,4
вдруг стало знаение 350 на аналог 1, и на аналог 2 значение было от 770 - тогда погасли 2,3,4 и загорелись 3,4,10
со временем значение на аналог 2 стало 840 - погасли 3,4,10 - загорелись 2,5,6
вдруг значение на аналог 1 стало <300 - тогда все еще горят светодиоды 2,5,6 (значение как бы заморозилось) 
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

next-999 пишет:

Если значение на аналог 1 меньше 300 тогда горят светодиоды 2,3,4.
...
но если вдруг значение на аналог 1 стало меньше 300 - тогда оставить гореть прошлое значение 
Первое условие выполняется единожды? Иначе получается противоречие, вместе эти два условия работать не будут как задумано, т.е. непонятно, что делать - включить 2,3,4, или ничего не делать (оставить прошлые значения).
Если единожды, то вот решение "в лоб", без оптимизации:
#define ANALOG1 A1
#define ANALOG2 A2
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5
#define LED6 6
#define LED7 7
#define LED8 8
#define LED9 9
#define LED10 10
const int sleepTime = 1000;  // Задержка между проверками (1 сек)

void setup() 
{
  pinMode(ANALOG1, INPUT);
  pinMode(ANALOG2, INPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  pinMode(LED8, OUTPUT);
  pinMode(LED9, OUTPUT);
  pinMode(LED10, OUTPUT);

  // первичная проверка
  // Если значение на аналог 1 меньше 300 тогда горят светодиоды 2,3,4.
  if (analogRead(ANALOG1) < 300)
  {
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);
  }
}

void ledOff()      // Функция гашения всех светодиодов
{  
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);
  digitalWrite(LED8, LOW);
  digitalWrite(LED9, LOW);
  digitalWrite(LED10, LOW);
}

void loop()     // Основной цикл
{
  // Если значение на аналог 1 меньше 300 тогда...
  if (analogRead(ANALOG1) < 300)        
  {
    // ничего не делаем, сразу переходим к delay(sleepTime);
  }
  else  // Если значение на аналог 1 больше [или равно] 300 тогда работает следующий алгоритм
  {
    // Если значение меньше чем 700 на аналог 2 => тогда включить светодиоды: 6,7,8,9
    if (analogRead(ANALOG2) <= 700)     
    {
      digitalWrite(LED6, HIGH);
      digitalWrite(LED7, HIGH);
      digitalWrite(LED8, HIGH);
      digitalWrite(LED9, HIGH);
    }

    // ЕСЛИ значение от 700 до 750 тогда выключить все и влключить светодиоды 4,5,6
    if ((analogRead(ANALOG2) > 700) && (analogRead(ANALOG2) <= 750)) 
    // Возможно, и такая конструкция корректная: 
    // if (800 > analogRead(ANALOG2) <= 850)
    {
      ledOff();
      digitalWrite(LED4, HIGH);
      digitalWrite(LED5, HIGH);
      digitalWrite(LED6, HIGH);
    }

    // если значение от 750 до 800 тогда  выключить все и  включить светодиоды 3,4,10
    if ((analogRead(ANALOG2) > 750) && (analogRead(ANALOG2) <= 800)) 
    {
      ledOff();
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, HIGH);
      digitalWrite(LED10, HIGH);
    }
    
    // Если значение от 800 до 850 тогда  выключить все и  включить светодиоды 2,5,6
    if ((800 >analogRead(ANALOG2) > 800) && (analogRead(ANALOG2) <= 850)) 
    {
      ledOff();
      digitalWrite(LED2, HIGH);
      digitalWrite(LED5, HIGH);
      digitalWrite(LED6, HIGH);
    }
  } // конец else

  delay(sleepTime);          // Спим 1 сек
}
Looka
Offline
Зарегистрирован: 24.04.2012

to Tomasina:

снимаю шляпу. 
Но вспоминаю притчу про удочку и рыбу. 

next-999
Offline
Зарегистрирован: 30.09.2013

Да, первое значение выполняется только 1 раз при включении)Спасибо, сейчас попробую)

next-999
Offline
Зарегистрирован: 30.09.2013
А можно как нибудь сделать чтобы значение 1-ое повторялось

например чтобы светодиоды моргали

 
 digitalWrite(LED2, HIGH);

dalay (500);

   digitalWrite(LED2, LOW);

а то оно так моргает один раз и все)