Почему не работает?!

Тема в разделе "Arduino & Shields", создана пользователем Рома-Ярик, 12 янв 2017.

  1. И тут не работает -_- . (браузер виснет при попытке вставить код)
    Написал, скомпилировал. Но работают только два первых значения. Уже и пробовал делать их от 1 до 10, от 1 до 255 - не помогает. В чём дело?

    Мой код:

    #define FLEDPIN 4
    #define LLEDPIN 13
    int rotation, number;
    int brightness = 0;
    int fadeAmount = 5;
    void setup() {
    for (int pin = FLEDPIN; pin <= LLEDPIN; ++pin)
    pinMode (pin, OUTPUT);
    pinMode (3, OUTPUT);
    pinMode (A0,INPUT);
    }
    void loop() {
    rotation = analogRead(A0);
    if (rotation < 25) {
    number = 10;
    digitalWrite (13, HIGH);
    digitalWrite (12, LOW);
    digitalWrite (11, LOW);
    digitalWrite (10, LOW);
    digitalWrite (9, LOW);
    digitalWrite (8, LOW);
    digitalWrite (7, LOW);
    digitalWrite (6, LOW);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    } else if (25<rotation<50) {
    number = 20;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, LOW);
    digitalWrite (10, LOW);
    digitalWrite (9, LOW);
    digitalWrite (8, LOW);
    digitalWrite (7, LOW);
    digitalWrite (6, LOW);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    } else if (50<rotation<75) {
    number = 30;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (10, LOW);
    digitalWrite (9, LOW);
    digitalWrite (8, LOW);
    digitalWrite (7, LOW);
    digitalWrite (6, LOW);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    } else if (75<rotation<100) {
    number = 40;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (9, LOW);
    digitalWrite (8, LOW);
    digitalWrite (7, LOW);
    digitalWrite (6, LOW);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    } else if (100<rotation<125) {
    number = 50;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (8, LOW);
    digitalWrite (7, LOW);
    digitalWrite (6, LOW);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    } else if (125<rotation<150) {
    number = 60;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (7, LOW);
    digitalWrite (6, LOW);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    } else if (150<rotation<175) {
    number = 70;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (7, HIGH);
    digitalWrite (6, LOW);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    } else if (175<rotation<200) {
    number = 80;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (7, HIGH);
    digitalWrite (6, HIGH);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    } else if (200<rotation<225) {
    number = 90;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (7, HIGH);
    digitalWrite (6, HIGH);
    digitalWrite (5, HIGH);
    digitalWrite (4, LOW);
    } else if (225<rotation) {
    number = 100;
    digitalWrite (13, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (7, HIGH);
    digitalWrite (6, HIGH);
    digitalWrite (5, HIGH);
    digitalWrite (4, HIGH);
    }
    analogWrite(3, brightness);
    brightness = brightness + fadeAmount;
    if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
    }
    delay(number);
    }

    ---------
    Да что такое! Уже и jpg-овские фотки не понимает! Окей, и тут выкрутимся.
    Я сделал такую схему, что используются три вещи: переменный резистор, светодиодная шкала и отдельный светодиод.
    Светодиод сделан он по самой обычной схеме - 3 пин, сам светодиод, резистор на 220 Ом и земля.
    Светодиодная лента - тоже самое, только с 13 по 4 пины. Да, и резистор в последней цепи (от 4 пина) используется так же светодиодом.Не хватило мне резисторов.
    А переменный резистр подключён к А0, 5 вольтам и земле.
    Надеюсь что сумел описать схему.
    А теперь проблемма: как бы я ни крутил ручку переменного резистора, он, похоже, выдаёт не более 200, хотя должен от 0 до 1023. и в итоге у меня загораются только два деления на шкале, и светодиод мерцает только с первой и второй скоростью.
    Прошу помо
     
  2. rkit

    rkit Гуру

    А почему вы решили, что ваш резистор может выдавать 0?
     
  3. PS: по поводу оптимизации не ругайтесь, это моя вторая прога для ардуинки. Певая была почти такой-же, но без шкалы. И тоже работала только на первые два значения.
     
  4. Так написано в книге, которая прилагалась к набору
     
  5. Цитирую книгу: "считываем в rotation напряжение с потенциометра:микроконтроллер выдаст число от 0 до 1023 пропорциональное углу поворота ручки"
     
  6. rkit

    rkit Гуру

    Тогда проверяйте качество контактов
     
  7. Отлично, первая версия готова. Ещё какие будут?
     
  8. Переставил в другое место переменный резистр - то же самое. Сопротивление проводов по 0.5. А сам п. резистор должен прозваниваться?
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    Та хрень, что у вас в коде, работать вообще не должна. Какая то дикая смесь Си и Паскаля.
     
  10. VladislavSum

    VladislavSum Нуб

    Код конечно страшненький, но вполне рабочий. В каком месте там Паскаль?

    Тс, попробуй сделать вывод значений с потенциометра в serial и посмотри реальные значения.
     
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    if (25<rotation<50)
    А0 подключен к среднему контакту переменного резистора?
     
  12. Unixon

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

    Это "if (25<rotation<50)" в Паскале тоже некорректно.
     
  13. VladislavSum

    VladislavSum Нуб

    Действительно странно выглядит, однако это компилируются. Проверить на ардуинке сейчас возможности нет
     
  14. Tomasina

    Tomasina Сушитель лампочек Модератор

    Компилируется потому что содержимое скобок не противоречит синтаксису. Но результат обработки такого выражения окажется совсем не тот, что задуман ТС.

    Там вообще весь loop() можно сократить до 12 строк.
     
  15. VladislavSum

    VladislavSum Нуб

    Вот тут мне стало интересно, завтра почитаю-поэксперементирую что будет если написать такое выражение.

    UPD. Догадался, значение первого < вернет 0 или 1 и будет сравнено с последним операндом.
     
    Последнее редактирование: 12 янв 2017
  16. Tomasina

    Tomasina Сушитель лампочек Модератор

    Элементарно. Результатом скобок всегда будет true, т.е. будет выполняться только второе if.

    И вот почему:
    (25<rotation<50) - разбор идет слева направо, т.е. у выражения (25<rotation) будет на выходе true или false, а это 1 или 0 соответственно.
    Далее сравнивается вторая половина: (1<50) или (0<50). На выходе в любом варианте получим true, т.к. выражения истинны.
    Поэтому почти всегда выполняется блок кода, где number = 20; (изредка там где number = 10;), а до остальных блоков просто не доходит очередь.
     
  17. Airbus

    Airbus Радиохулиган Модератор

    Э!Тут switch-case (rotation) нужен.Это что будет?Типа цифровая шкала?Что делает number?
     
  18. Tomasina

    Tomasina Сушитель лампочек Модератор

    number не нужен, можно и case использовать, если локально привести к диапазону 1-10.
     
  19. MDV

    MDV Гик

    Стоит попробовать так
    if(rotation > 25 && rotation < 50)
     
  20. Tomasina

    Tomasina Сушитель лампочек Модератор

    это лишнее, достаточно одной проверки, т.к. последующее if перекрывает нужный диапазон.

    Да и вообще - ни if, ни case тут не нужны, достаточно map.
    Вот полная замена loop(), с той же функциональностью:
    Код (C++):
    void loop()
    {
      rotation = analogRead(A0);
      number = map(rotation, 0, 1023, FLEDPIN, LLEDPIN + 1);  // ужимаем диапазон до 10 разрядов, минимальная величина - 2 светодиода
      for (byte pin = FLEDPIN; pin <= LLEDPIN; pin++)
        digitalWrite(pin, number >= pin ? HIGH : LOW);        //***
      analogWrite(3, brightness);
     
      brightness = brightness + fadeAmount;
      if (brightness <= 0 || brightness >= 255) fadeAmount = -fadeAmount;
      delay(number * 10);
    }

    //*** это краткая запись такого выражения:
    // if (number >= pin) digitalWrite(pin, HIGH);
    // else digitalWrite(pin, LOW);
     
    Последнее редактирование: 12 янв 2017