Очень нужна помощь

Тема в разделе "Arduino & Shields", создана пользователем nerealnostkvest, 28 май 2015.

  1. DrProg

    DrProg Вечный нерд

    Вторая переменная не занята вот и не работает, точнее выводит мусор. Или регистр соединен не правильно.
     
    Последнее редактирование: 29 май 2015
  2. nerealnostkvest

    nerealnostkvest Нерд

    Ну вот так то она вроде занята:
    Код (Text):
    #define pinData  11
    #define pinLatch 10
    #define pinClock 12
    #define pinA0 A0

    unsigned migTime;



    //int clean=0;
    void setup() {
      pinMode(pinData, OUTPUT);
      pinMode(pinLatch, OUTPUT);
      pinMode(pinClock, OUTPUT);
      pinMode(pinA0, INPUT);
     
    }

    void loop() {
      byte ledMask;
      byte ledMask2;

      ledMask =  0b10000000;
      ledMask2 = 0b10000000; // для пущей наглядности ряд битов в двоичном виде 0 - не горит, 1 - горит
      ledON(ledMask, ledMask2);
      // тут нужен кусок кода ждущий пока А0 не созреет для перехода на следующий уровень, например:
      while (analogRead(pinA0)>500&&analogRead(pinA0)<600){
     
      // зажигаем led 2 (синий) и мигаем им 5 сек
      for (int i = 0; i <= 3; i++) {
        ledMask = 0b00010000;
        ledON(ledMask, ledMask2);
        migTime = millis();
        while ((millis() - migTime) < 1000);
        ledOFF();
        migTime = millis();
        while ((millis() - migTime) < 1000);
      }
     
      ledMask = 0b00000100;
      ledON(ledMask, ledMask2);
    //  clean=1;
      }
      // зажигаем led 3 (зеленый)
     

      // тут я вешаю контроллер т.к. не знаю что делать дальше
    //  while (true);
    }

    void ledON (byte ledMask, byte ledMask2) { //выбранный единицей светодиод загорается
      digitalWrite(pinLatch, LOW);
      shiftOut(pinData, pinClock, MSBFIRST, ledMask2);
      shiftOut(pinData, pinClock, LSBFIRST, ledMask); // если загораетя не с того конца, поменять на MSBFIRST
      // если нужен второй регистр и так далее
     
     
      digitalWrite(pinLatch, HIGH);
    }

    void ledOFF () { //светодиод гаснет - вместо этого можно использовать ledON(0);
      digitalWrite(pinLatch, LOW);
      shiftOut(pinData, pinClock, LSBFIRST, 0);
      // если нужен второй регистр и так далее
      //shiftOut(pinData, pinClock, LSBFIRST, 0);
      digitalWrite(pinLatch, HIGH);
    }
    Но второй все равно не выводит. Думал регистр не работает, подключил на место первого, все норм. Но если подключить провод от ардуины на ds второго, то не работает. Странно все.
     
  3. DrProg

    DrProg Вечный нерд

    Не от Ардуины провод на второй, а от первого регистра с ножки Q7штрих. Это ножка 9. Я делал каскад из 2х и 3х регистров, все работает отлично.
     
  4. nerealnostkvest

    nerealnostkvest Нерд

    Да это я проверял его, пробуя подключить то туда, то сюда. В итоге разобрал все, пересобрал регистры на новом месте в макетке, и все заработало. Спасибо большое, очень помогли с регистрами:)Оказывается с ними очень просто работать через стандартные функции.

    Теперь буду стараться победить таймер с индикатором.
     
  5. DrProg

    DrProg Вечный нерд

    С регистрами все просто когда разберешься. Таймер побеждать не надо, надо понять как работает этот индикатор, почему тухнет. Вообще можно сделать свой индикатор через те же регистры, тогда все будет понятно хотя бы. Вот тут хороший пример есть, доработать несложно.
     
  6. nerealnostkvest

    nerealnostkvest Нерд

    У меня тройка модуль амперки, там 4 индикатора, которые как раз выводятся через 595ые регистры, и все это подключается к ардуино через 3 провода. Питание, земля, сигнал. Я таймер сделал вот так, коряво конечно и криво, но по другому не смог. Может, что увидите почему он так работает:

    Код (Text):
    #include <QuadDisplay.h>
    #define DISPLAY_PIN 2

    int timerOff = 0;
    unsigned long previousMillis = 0;      
    const long interval = 1000;        

    void setup() {
     
    }
    void timer(){
      float time2;
      int finish=0;
      if (finish==0){
      float currentTime = (float)millis() / 1000;
      float time1=60-currentTime;
      if (time1>0)
    {
      displayInt(DISPLAY_PIN, time1);
      displayDigits(DISPLAY_PIN, QD_1, QD_NONE, QD_NONE, QD_NONE);
      displayClear(DISPLAY_PIN);
    }
    else
    {
      for(int i=1;i<60;i++)
      {
      float currentTime2 = (float)millis() / 1000;
      time2=120-currentTime2;
      if (time2>0){
     
      displayInt(DISPLAY_PIN, time2);
      displayClear(DISPLAY_PIN);
    }
    else{
      displayDigits(DISPLAY_PIN, QD_O, QD_F, QD_F, QD_NONE);
      finish++;
      timerOff=1;
    }
      }
    }
    }
    }

     
     
    void loop()
    {
      timer();
    }
     
     
  7. geher

    geher Гуру

    Логику программы не осилил вообще. Потому укажу на сразу бросающееся в глаза.

    Код (Text):

      int finish=0;
      if (finish==0){
     
    Получается, что всегда будет выбираться первая ветка для данного if, поскольку finish всегда явно устанавливается в 0
    finish++; в дальнейшем не имеет никакого значения, поскольку при следующем вызове функции timer оно опять установится в 0.
    Логично предположить, что переменную надо либо вынести из функции в глобальные, либо объявить как static. Иначе надо выкинуть это бесполезное ветвление и вторую ветку (которая else).

    Код (Text):

      displayInt(DISPLAY_PIN, time1);
      displayDigits(DISPLAY_PIN, QD_1, QD_NONE, QD_NONE, QD_NONE);
      displayClear(DISPLAY_PIN);
     
    Это эквивалентно просто displayClear(DISPLAY_PIN);
    Полагаю, что индикатор даже мигнуть не успеет выведенными на него значениями, как сразу очистится.
    Код (Text):

      displayInt(DISPLAY_PIN, time2);
      displayClear(DISPLAY_PIN);
     
    Тут то же самое.
     
  8. DrProg

    DrProg Вечный нерд

    И зачем считывать таймер в большой и медленный float? Тем более даже не в мкс, а в мс.
     
  9. DrProg

    DrProg Вечный нерд

    На этом не очень понятном примере заинтересовался задачей псевдопараллельной обработки событий. Что если понадобится в будущем? Оказалось все достаточно несложно, вот простой пример: три светодиода, один вкл-выкл каждые полсекунды, второй десять раз в секунду, третий вкл при нажатии на кнопку и выкл про отжатии. Все три события происходят одновременно и без использования delay. Применять для зажигания светодиодов сдвиговый регистр ненамного сложнее, при этом можно одновременно продолжать выводить данные на индикатор и считывать показания потенциометра.

    Код (Text):
    #define LP1 9
    #define LP2 8
    #define LP3 10
    #define BUTTON 12
    // независимые таймеры событий
    unsigned long timer1;
    unsigned long timer2;
    // состояние светодиодов
    boolean lpSet1 = 0;
    boolean lpSet2 = 0;


    void setup() {
    pinMode(LP1, OUTPUT);
    pinMode(LP2, OUTPUT);
    pinMode(LP3, OUTPUT);
    pinMode(BUTTON, INPUT_PULLUP);
    // начало отсчета
    timer1 = millis();
    timer2 = timer1;
    }

    void loop() {

    // каждые 500мс срабатывает эта часть кода
    if ((millis() - timer1) >= 500) {
      lpSet1 = !lpSet1;
      digitalWrite(LP1, lpSet1);
      timer1 = millis();
    }

    // каждые 100мс эта часть
    if ((millis() - timer2) >= 100) {
      lpSet2 = !lpSet2;
      digitalWrite(LP2, lpSet2);
      timer2 = millis();
    }

    // нажатие кнопки обрабатывает эта часть
    if (!digitalRead(BUTTON)){
      digitalWrite(LP3, HIGH);
    } else {
      digitalWrite(LP3, LOW);
    }
    }

     
  10. nerealnostkvest

    nerealnostkvest Нерд

    Сейчас подключу к регистру и таймер поставлю, проверю как будет работать
     
  11. nerealnostkvest

    nerealnostkvest Нерд

    Попробовал сделать мигание диодов, но на регистре, но что то вылезла куча ошибок. Вот код. Кнопку отключил.
    Код (Text):
    #define  dataPin          11      // pin 14 on the 74HC595
    #define  latchPin          10      // pin 12 on the 74HC595
    #define  clockPin          12

    unsigned long timer1;
    unsigned long timer2;
    byte ledMask1;
    byte ledMask2;
    void setup() {
      pinMode(dataPin, OUTPUT);
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin , OUTPUT);

      timer1 = millis();
      timer2 = timer1;
    }

    void loop() {
     
    // каждые 500мс срабатывает эта часть кода
    if ((millis() - timer1) >= 500) {
      lpSet1 = !lpSet1;
      if(lpSet1){
            ledMask1 = 0b10000000;
            ledMask2 = 0b00000000;
            ledON(ledMask1, ledMask2);
      timer1 = millis();}
      if(!lpSet1){
      ledMask1 = 0b00000000;
            ledMask2 = 0b00000000;
            ledON(ledMask1, ledMask2);
      }
    }

    // каждые 100мс эта часть
    if ((millis() - timer2) >= 100) {
      lpSet2 = !lpSet2;
      if(lpSet2){
            ledMask1 = 0b00100000;
            ledMask2 = 0b00000000;
            ledON(ledMask1, ledMask2);
      timer1 = millis();}
      if(!lpSet2){
      ledMask1 = 0b00000000;
            ledMask2 = 0b00000000;
            ledON(ledMask1, ledMask2);
      }
    }

    }
    void ledON (byte ledMask1, byte ledMask2) { //выбранный единицей светодиод загорается
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, LSBFIRST, ledMask2);
      shiftOut(dataPin, clockPin, LSBFIRST, ledMask1); // если загораетя не с того конца, поменять на MSBFIRST
      // если нужен второй регистр и так далее
     
      digitalWrite(latchPin, HIGH);}
    Вот ошибки:
    sketch_may30a.ino:4:28: error: expected ',' or '...' before numeric constant
    C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:138:23: note: in expansion of macro 'dataPin'
    void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
    ^
    sketch_may30a.ino:4:28: error: expected ',' or '...' before numeric constant
    C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:139:25: note: in expansion of macro 'dataPin'
    uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
    ^
    sketch_may30a.ino: In function 'void ledON(byte, byte)':
    sketch_may30a.ino:120:49: error: too many arguments to function 'void shiftOut(uint8_t)'
    In file included from sketch_may30a.ino:19:0:
    C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:138:6: note: declared here
    void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
    ^
    sketch_may30a.ino:121:49: error: too many arguments to function 'void shiftOut(uint8_t)'
    In file included from sketch_may30a.ino:19:0:
    C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:138:6: note: declared here
    void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
    ^
    Ошибка компиляции.
     
  12. nerealnostkvest

    nerealnostkvest Нерд

    видимо я какой то баран, не получается переделать ваш код, под регистр.
    Как сделать, что бы при достижении потенциометром определенного значения, включился ваш код через регистр, и один диод промигал 5 секунд и выключился? Целый день вожусь, и ни фига не получается, видимо недостаток опыта берет своё(((
     
  13. DrProg

    DrProg Вечный нерд

    Чтобы помочь надо знать задачу. То что вы описываете делает программа которую я написал в самом начале, но потом выяснилось что от нее требуется что то еще. Секундомер какой то да еще через библиотеку. Нужен он? Именно такой?
     
  14. nerealnostkvest

    nerealnostkvest Нерд

    Задача решилась по другому, подключил библиотеку leOS2.h, с ее помощью можно запускать задачи параллельно. Теперь все работает:) Спасибо большое за помощь с регистрами, очень помогли.