освещение

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


  1. тут я запутался, я понимаю так что analogWrite() эта функция нужна для того чтобы считать значения с аналогова порта. а с помощью нее можно еще и с генерировать PWM на выход? просто в ссылках которые вы мне кинули а именно во второй и в примере она используется для считывания значении.
     
  2. NR55RU

    NR55RU Гик

    Для считывания используется другая функция.
    Код (Text):

    void loop()
    {
    val = analogRead(analogPin);  // read the input pin
    analogWrite(ledPin, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
    }
     
    analorWrite() : от слова Write - писать
    analogRead() : от слова Read - читать
     
    Unixon нравится это.
  3.  
  4. программа работает как мне надо там ведь не было недочетов?
     
  5. NR55RU

    NR55RU Гик

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

    Что нам нужно, нам важно знать какое действие было последним, а точнее в данном случае просто знать горит диод или нет.
    Для этого была введена переменная state.
    И наличие проверки state в логике является гарантией того что действие будет выполнено лишь один раз при изменении условия.
    Но подвох был в строчке:
    val >= UPPER_THRESHOLD
    Строчка не соответствовала условию и включала граничное значение.
    Таким образом она бы выполнялась как при значениях больше 150 так и при граничном значении в 150, а условие было явным только если больше 150.

    Это конечно не столь существенно когда управляем светодиодом, но если бы мы писали программу управления ядерным ректором, то жители в радиусе нескольких десятков километров от этого реактора, могли бы за нас обидеться за такую ошибку :D
     
  6. Unixon

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

    Неа, это тоже фигня. Вы на самом деле только что мимо граблей прошли и даже одним глазом на них посмотрели.
     
  7. NR55RU

    NR55RU Гик

    Я пока вижу только одну потенциальную проблема, она опять же в строке
    (val >= UPPER_THRESHOLD) && state
    Но на этот раз проблема в том что:
    showSequenceB() не будет выполнен до тех пор пока хотя бы 1 раз не будет выполнена функция showSequenceA() которая переведет state в true.
     
  8. Megakoteyka

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

    Одно словечко лишнее в код затесалось :)
     
  9. NR55RU

    NR55RU Гик

    showSequenceB() будет выполнятся всегда только после выполнения showSequenceA() так как после того как В выполнится она поставит флаг в false и все пока не запустится А оно больше никогда не выполнится.
    То есть показания перешагнут за 150 но логика не отреагирует до тех пор пока показания хотя бы раз не упадут под 100.
    И все по новой.
     
  10. 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

    #define STATE_UNDEFINED 0
    #define STATE_UP 1
    #define STATE_DOWN 2

    byte state = STATE_UNDEFINED;

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

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

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

    void loop()
    {
     int val = analogRead(PIN_SENSE);
     if ((val < LOWER_THRESHOLD) && (STATE_UP==state || STATE_UNDEFINED==state))
     {
      showSequenceA();
     }
     else if ((val >= UPPER_THRESHOLD) && (STATE_DOWN==state || STATE_UNDEFINED==state))
     {
      showSequenceB();
      }
     delay(SENSOR_DELAY);
    }
     
     
  11. NR55RU

    NR55RU Гик

    В ТЗ отсутствовало требование найти грабли и убрать их с дороги, только показать на них.
    Ну все где тут ближайший ядерный реактор, я готов :D
    [​IMG]
     
  12. блин я о таком и не думал. я записал программу на дуньку и подцепил нагрузку и она работала как мне нужно. спасибо большое что помогли и объяснили что и как!
     
  13. atompost

    atompost Гик

    Уважаемый Unixon ждем еще интересных "задачек с подвохом" ;) !!!
     
  14. Unixon

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

    Вот и зря.