освещение

Тема в разделе "Arduino & Shields", создана пользователем Алексей Схоменко, 12 окт 2013.

  1. народ помогите с программой для ардуино. мне нужно чтоб пока на аналоговом входе значение больше 150 выплнился алгоритм 1 раз и остановился на последнем действии до изменения условия если вход изменился и стал меньше 100 то надо чтоб другой алгоритм выполнился 1 раз и на последнем действии остановился пока условие опять не измениться

    //Program Alecsei


    //This will turn on an LED after a threshold
    int sensePin = 0;

    int ledPin1 = 11;

    void setup()
    {
    //Note: We don't need to specifiy sensePin as an
    //input, since it defaults to that when we read it

    //The LED pin needs to be set as an output
    pinMode(ledPin1, OUTPUT);

    //This is the default value, but we can set it anyways
    analogReference(DEFAULT); //5V Reference on UNO
    }

    void loop()
    {
    // read the sensor
    int val = analogRead(sensePin);
    if(val<100)
    {
    analogWrite(ledPin1,50);
    delay(350);
    analogWrite(ledPin1,100);
    delay(350);
    analogWrite(ledPin1,150);
    delay(350);
    analogWrite(ledPin1,200);
    delay(350);
    analogWrite(ledPin1,255);
    delay(350);
    digitalWrite(ledPin1,HIGH);

    if(val >= 150)
    {
    analogWrite(ledPin1,255);
    delay(350);
    analogWrite(ledPin1,200);
    delay(350);
    analogWrite(ledPin1,150);
    delay(350);
    analogWrite(ledPin1,100);
    delay(350);
    analogWrite(ledPin1,50);
    delay(350);
    digitalWrite(ledPin1,LOW);

    }


    }

    мой когд каждый алгоритм выполняется бесконечно пока не изменится условие и он не перейдет к другому алгоритму что тоже будет бесконечно выполняться что нужно дописать и где?????
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Используйте тэг CODE и правильную терминологию, относитесь к читателям с уважением.
    Код (Text):
    boolean state = false;

    void loop()
    {
      value = analogRead(...);
      if(value <= 100 && state == false)
      {
        state = true;
        // код включения лампы
      }
      if(value >= 150 && state == true)
      {
        state = false;
        // код выключения лампы
      }
    }
    Код включения/выключения лампы было бы неплохо переделать, используя цикл.
     


  3. а у меня ошибку выдает.
    int ledPin = 11; // LED connected to digital pin 9
    int sensePin = 0;

    void setup() {
    pinMode(ledPin, OUTPUT);
    analogReference(DEFAULT);
    boolean state = false;
    }


    void loop()
    {
    val = analogRead(sensePin);
    if(val <= 100 && state == false)
    {
    state = true;

    }
    if(val >= 150 && state == true)
    {
    state = false;

    }

    я правильно прописал? ошибка такая
    sketch_oct13a.ino: In function 'void loop()':
    sketch_oct13a:13: error: 'val' was not declared in this scope
    sketch_oct13a:14: error: 'state' was not declared in this scope
    sketch_oct13a:19: error: 'state' was not declared in this scope
     
  4. можно пожалуйста целиком программу, я просто новичок и только не давно начал заниматься программированием.
     
  5. NR55RU

    NR55RU Гик

    Вам компилятор просто говорит о том что переменная val у вас не объявлена.
    То есть вы сперва должны ее объявить, прежде чем использовать.
    Например эту строку:
    val = analogRead(sensePin);
    Заменить на такую:
    int val = analogRead(sensePin);

    Либо объявите ее в самом начале:
    Код (Text):
    int ledPin = 11; // LED connected to digital pin 9
    int sensePin = 0;
    int val;
    Помните, прежде чем вы используете переменную, ее надо сперва объявить с указанием ее типа.
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Про область видимости переменных и время их жизни почитайте.
    Если Вам каждый раз будут давать целиком программу, Вы никогда ничему не научитесь.
     
    NR55RU нравится это.
  7. можно программу чтоб знал как правильно
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Нет. Разберитесь хоть в чем-нибудь самостоятельно. Для разнообразия.
     
  9. спасибо, а сами сразу шарить начали
     
  10. NR55RU

    NR55RU Гик

    Алексей, я вам дал ответ почему ругается компилятор, Мегакотейка вам дал направление куда копать, именно оттуда выросли ноги у вашей ошибки.
    Этого достаточно поверьте, если есть желание конечно, книги, поисковики, безграничные возможности для тех то желает учится.

    Приведу вам пример, буквально сегодня я начал писать новый набор классов для управления шасси платформы на С++, на Си я уже пишу а вот С++ начал тока изучать и прочитав часть книги достаточную для начала использования классов в С++ я приступил (не люблю переписывать примеры из книг, лучший способ научится писать свое).
    На написание кода я потратил 30 минут, на ПК все работало идеально, но как только я партировал это на Ардуин, ВСЕ ... приехали :)
    На то что бы заставить на ардуине работать код из 4-х не больших классов у меня ушло 3 часа, мой стол был завален пачкой раскрыт книг по Си и С++, попарился прилично, а ведь мог просто кинуть кусок кода сюда и разумеется знающие люди вроде Мегакотейки мне бы ткнули пальцем где я облажался, но я убил 3 часа и съел собаку и еще маленькую кошечку на этой проблеме благодаря чему я не просто узнал почему у меня не работало это, я ПОНЯЛ это... теперь я никогда не наступлю на эти грабли потому что я именно понял в чем была причина.

    Посему Мегакотейка дал вам правильный совет, если вы хотите учится чему то, не просите готовых решений, попросите подсказку, и по подсказке найдите ответ сами, разберитесь .. и лишь когда вы перелистали все книги, перегуглили все что могли, пересмотрели код строку за строкой 100 раз и не смогли решить проблему, вот тогда попросите дать вам готовый кусок кода или же попросите детальных разъяснений.
     
    Unixon и Megakoteyka нравится это.
  11. atompost

    atompost Гик

    Уважаемый Алексей, а ведь форумчане на 100% правы, пока вы сами не вникните во все тонкости и баги своего кода, это будет бесполезной затеей, вам могут давать хоть 10 программ но смысла от этого не будет, вы просто скомпилируете скетч зальете в ардуину, все заработает, и вы забудете про этот скетч, так и не разобравшись как он работает ...
    И не стоит тут ни на кого обижаться !!!
     
    Последнее редактирование: 13 окт 2013
    Megakoteyka нравится это.
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Не сразу. Долго и упорно разбирался. Самостоятельно.
    Сколько книг по программированию Вы прочитали, например? От корки до корки, разбирая каждый пример, пробуя его модифицировать и изучая результат?
     
  13. Unixon

    Unixon Оракул Модератор

    Коллеги, предлагаю сменить тактику. :)

    Алексей, вот вам код:

    Код (Text):
    #define PIN_SENSE A0
    #define PIN_LED 11

    #define LOWER_THRESHOLD 100
    #define UPPER_THRESHOLD 150

    #define SEQUENCE_DELAY 350
    #define SENSOR_DELAY 100

    bool state = false;

    void showSequenceA()
    {
     for (int i = 50; i <= 255; i+=50)
     {
      analogWrite(PIN_LED, i);
      delay(SEQUENCE_DELAY);
     }
     analogWrite(PIN_LED, 255);
     state = true;
    }

    void showSequenceB()
    {
     for (int i = 205; i >= 0; i-=50)
     {
      analogWrite(PIN_LED, i);
      delay(SEQUENCE_DELAY);
     }
     analogWrite(PIN_LED, 0);
     state = false;
    }

    void setup()
    {
     analogReference(DEFAULT);
     pinMode(PIN_SENSE, INPUT);
     pinMode(PIN_LED, OUTPUT);
    }

    void loop()
    {
     int val = analogRead(PIN_SENSE);
     if ((val < LOWER_THRESHOLD) && !state)
     {
      showSequenceA();
     }
     else if ((val >= UPPER_THRESHOLD) && state)
     {
      showSequenceB();
     }
     delay(SENSOR_DELAY);
    }
    А теперь, пожалуйста, разберитесь и расскажите нам как он работает и почему именно так написан.
     
    atompost нравится это.
  14. Unixon

    Unixon Оракул Модератор

    Да, вот еще. Там в коде есть одна... не то что бы ошибка, но, скажем так, недочет. Найдите его.
     
  15. atompost

    atompost Гик

    блин, блин, блин, так хотелось написать, но низя :cool:
    там 2 недочета???
     
    Последнее редактирование: 13 окт 2013
  16. спасибо большое! за помощь теперь знаю как она хоть примерно должна выгладить. а недочет один это?
    for (int i = 205; i >= 0; i-=50) тут вместо 205 должно 255?
     
  17. NR55RU

    NR55RU Гик

    Вряд ли это недочет.
    Данная функция запускается когда светодиод горит, следовательно его значение установлено в 255 (функцией что его зажигает), в данной строке первым значением будет как раз значение на 50 меньше, то есть с первой же итерации цикла пойдет затухание, если бы стояло 255, то одна итерация прошла бы в пустую, в пин записалось бы значение 255 которое там и так уже есть.
     
    Unixon нравится это.
  18. Unixon

    Unixon Оракул Модератор

    Нет, что вы! Это было бы слишком просто. Тут все как раз правильно. Я оставил небольшие грабли в зарослях логики.
     

  19. void showSequenceA()
    {
    for (int i = 50; i <= 255; i+=50)
    {
    analogWrite(PIN_LED, i);
    delay(SEQUENCE_DELAY);
    }
    analogWrite(PIN_LED, 255);
    state = true;
    }


    этот цикл отвечает за разжигание светодиода только мне не понятны вот эти строчки (analogWrite(PIN_LED, i); и analogWrite(PIN_LED, 255); ) почему там прописано в начале analogWrite ели я правильно понимаю то это для работы с аналоговым входом. или я ошибаюсь?
     
  20. NR55RU

    NR55RU Гик

    digitalWrite()
    analogWrite()
    Согласно документации, digitalWrite может принимать только два значения LOW и HIGH то есть просто Вкл или Выкл.
    analogWrite в свою очередь может принимать значения от 0 до 255 для генерации PWM который и управляет в данном случае яркостью диода.

    Но оставленный недочет, не тут :)
     
    Unixon нравится это.