Где может быть ошибка кода?

Тема в разделе "Arduino & Shields", создана пользователем sanik, 8 окт 2013.

  1. sanik

    sanik Гик

    Все равно едет :confused: Причем опят перестал реагировать на импульсы!!!
     
    Последнее редактирование: 10 окт 2013
  2. sanik

    sanik Гик

    Вот я дурак!:) Почему то не с первого раза доходит....
     
  3. sanik

    sanik Гик

    Можно еще вопросик? Как правильно записать выражение значений от 540 до 550 ?
    Код (Text):
    if (rewerSd >= 540 && rewerSd <=550)// если rewerSd от 540 до 550 то,
    {
      PinLOWx = HIGH; // запускаем мотор X в одном направлении
      PinHIGHx = LOW;
     
  4. sanik

    sanik Гик

    Или так?
    Код (Text):
    if (rewerSd = constrain(rewerSd, 540,550))// если rewerSd от 540 до 550 то,
    {
      PinLOWx = HIGH; // запускаем мотор X в одном направлении
      PinHIGHx = LOW;
     
  5. Megakoteyka

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

    Первое всяко лучше, нет лишнего вызова функции = нет лишних расходов драгоценных тактов контроллера :)
     
    sanik нравится это.
  6. sanik

    sanik Гик

    Оно соответствует этим пределам? Дело в том что у меня четыре группы показаний типа таких 540-550: 620-640: 810-830: 900-920 управление моторами с одного датчика.
     
  7. Megakoteyka

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

    Вы же сами написали:
    ЕСЛИ( (rewerSd больше_либо_равно 540) И (rewerSd меньше_либо_равно 550)) то ...
    Значит условие будет истинно только в том случае, если выполняются оба неравенства, т.е. rewerSd лежит в пределах [540; 550]. Все как в алгебре :)
     
  8. sanik

    sanik Гик

    Ага спасибо! С этим закончено! Осталось только поломать голову над лишним импульсом как его отсечь если не получиться обращусь за помощью, когда читаю ничего не понять все везде кратко описано. А с вашей помощью я много в чем разобрался!!!
     
  9. NR55RU

    NR55RU Гик

    Можно еще написать так:
    540 <= rewerSd && rewerSd <= 550
    Суть не изменится но визуально читаться будет легче, переменная как бы находится между двумя границами.
     
  10. Megakoteyka

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

    Некоторые языки (тот же Haskel, ЕМНИП), имеют "синтаксический сахар", позволяющий писать
    1 < x < 2
     
  11. Megakoteyka

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

    Попробуйте все же подавить дребезг - он запросто может быть источником лишнего импульса.
    Попробуйте для лучшего понимания сперва переписать свой алгоритм в псевдокоде самыми крупными кусками, соблюдая только логическую структуру - условия, циклы. Затем начинайте расписывать более детально, вдумываясь в то, как должна работать каждая строка и конструкция. И только потом превращайте это в код. 90% проблем в программировании вытекают всегда из неправильного алгоритма. Превратить хороший алгоритм в код не сложно.
    Unixon дело говорит, советую прислушаться к его словам. Он вообще плохих советов не дает :)
    Если не хотите разбираться с ДРАКОНом - нарисуйте обычную блок-схему на листочке, это поможет увидеть слабые места и ошибки алгоритма.
     
  12. sanik

    sanik Гик

    На досуге займусь разбиранием Дракона Сейчас как раз изучаю уроки о дребезге, У меня возник такой вопрос в голову ничего не приходит от не полного знания, Что можно сделать в такой ситуации?
    С аналогово входа читаются лишние нули бывает 2 нуля , 3 нуля а бывает и 4 нуля, мне для запуска нужен только один, остальные только мешают из за них выполняются лишние действия, каким способом можно отсечь лишние нули?
     

    Вложения:

  13. Unixon

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

    Очевидно, запоминать что первый "0" уже пришел и на следующих уже ничего не делать, пока не придет не "о".
     
  14. Megakoteyka

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

    А можно на текущую версию кода взглянуть?
     
  15. sanik

    sanik Гик

    Да скелет очень простой в принцепе рабочий только мешает второе срабатывание релешек я думал сделать так Первый раз условие int sunhr = analogRead(timePin); Запускаем работу реле второй раз условие int sunhr = analogRead(timePin); игнорируем

    Код (Text):
    int camPin =12;
    int focusPin =13;
    int Upr = 11;
    int timePin = A0;
    void setup()
    {
    analogReference(DEFAULT);
      pinMode(camPin, OUTPUT);
      pinMode(focusPin, OUTPUT);
      pinMode(Upr, OUTPUT);

    }
    void loop()
    {  //получение значения сенсора и сохранение в переменую sunhr
    int sunhr = analogRead(timePin);
    if(sunhr < 150)
    {
    digitalWrite(focusPin, HIGH );
    delay(50);
    digitalWrite(camPin, HIGH);
    delay(100);
    digitalWrite(focusPin, LOW);
    digitalWrite(camPin, LOW);
    delay(100);
    digitalWrite(Upr, HIGH);
    delay(50);
      digitalWrite(Upr, LOW);
    }
    }
     
  16. sanik

    sanik Гик

    А как это делается?
     
  17. sanik

    sanik Гик

    Я вот тут прочитал про нового зверя цикл do....while
    do ... while
    Цикл do работает так же, как и цикл while, за исключением того, что условие проверяется в конце цикла, таким образом, цикл do будет всегда выполняться хотя бы раз. Как его применить в моем случае? (Как всегда все кратко никаких подробностей:mad:)
    Код (Text):
    do
    {
      delay(50);          // подождать, пока датчики стабилизируются
      x = readSensors(); // проверить датчики
    } while (x < 100);
     
  18. Unixon

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

    Вы объясните по нормальному, что хотите получить. Опишите, как устроена ваша установка. Соберите всю информацию в одном посте. Не нужно сразу вдаваться в детали программирования. Напишите алгоритм работы установки. Если не можете его формализовать принятыми методами, ОК, хотя бы в свободной форме.
     
  19. sanik

    sanik Гик

    Я тут поразбирался с библиотекой
    Код (Text):
    #include <Bounce.h> подключаем библиотеку
    #define PIN_BTN_SELECT 3
    Bounce BTN_SELECT = Bounce( PIN_BTN_SELECT, 3); вместо const byte PIN_BTN_SELECT = 3;

     
    А что делать в этой части?
    Код (Text):
      case MODE_MANUAL:
        {
          processAnalog();
          if (digitalRead(PIN_BTN_SELECT))// считывание кнопки select
          {
            mode = MODE_SELECT_X;
            while (digitalRead(PIN_BTN_SELECT)) delay(1);
            posX==0;
            posY==0;
          }
          break;
    Что ставить вместо digitalRead()  ?
    И вместо while (digitalRead(PIN_BTN_SELECT)) delay(1);?
     
  20. Megakoteyka

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

    if(bouncer.update() && bouncer.read() == HIGH)
    { ... }