Проблема с подключением IR Remote

Тема в разделе "Arduino & Shields", создана пользователем Guri, 20 май 2016.

  1. Guri

    Guri Нерд

    Добрый день!

    Пытаюсь собрать часы на ардуино нано, и возникла проблема- при подключении инфракрасного приемника к определенному входу некоторые другие выходы начинают переодически выдавать какой-то шум.

    Была подобная проблема при подключении модуля часов к A4 A5 с выходами D0 D1 и я исправил ее просто тем что перестал использовать эти выходы. Сейчас же, похоже что глючат D2 или D3, но я не уверен- из-за того что все это на плате тяжело проверить перебором.

    Можете подсказать, как это исправить, и есть ли какая-то закономерность- т.е. какие выходы могут глючить при подключении определенных модулей.

    Спасибо!
     
  2. Guri

    Guri Нерд

    P.S.
    Без этого модуля все работает исправно- глюки только после подключения инфракрасного датчика.
    Ну и сам датчик работает нормально.
    Просто раз в несколько секунд цифры на часах как-то странно меняются.
     
  3. Limoney

    Limoney Гик

    Наверное, что-то с программой. Никакого шума быть не должно.
     
  4. Guri

    Guri Нерд

    Ну код как код- все работало нормально, я добавил к нему строки из примера irecv_demo и начались глюки.
     
  5. Limoney

    Limoney Гик

    Какой-то участок кода выполняется дольше, чем время обновления цифр.
    Или ваша программа одновременно использует тот же таймер что и библиотека IR Remote.
    Поэтому видна засветка цифр.
     
  6. Guri

    Guri Нерд

    А как тогда это можно исправить?
    Я использую delay() и millis().
     
  7. Limoney

    Limoney Гик

    Хороший тон - применять millis.
     
  8. Guri

    Guri Нерд

    Я переписал с использованием millis() вместо delay() и это не помогло.
     
  9. Limoney

    Limoney Гик

    Наверное, что-то с программой.
     
  10. ZAZ-965

    ZAZ-965 Гуру

    А чего гадать? Guri, приведите ваш код.
     
  11. Guri

    Guri Нерд

    Код моей программы длинный и непонятный- я его обрезал и добавил пару коментариев.
    Делаю я часы на газоразрядных индикаторах.
    https://geektimes.ru/post/257806/


    Код (C++):
    #include <Wire.h>
    #include "RTClib.h"
    #include <IRremote.h>

    int key[]= {12,8,7,6,5,4}; //транзисторные ключи
    int out[]={3,15,16,2}; //входы дешифратора, 15=А2, 16=А3
    int RECV_PIN = 17;
    //часы подключены к А4 А5


    RTC_DS3231 rtc;
    IRrecv irrecv(RECV_PIN);
    decode_results results;


    #define FREQ 1
    #define DEL1 200
    #define DEL2 500


    int T[]={500,500,100,100,100};
    int N=5;
    unsigned long startTime=0;
    int flag=0;


    /////////////////////////////////////////////////////
    void setup() {
     
    #ifndef ESP8266
      while (!Serial);
    #endif

      Serial.begin(9600);
      irrecv.enableIRIn();
     
      for (int i=0; i<4; i++) {
        pinMode(out[i],OUTPUT);
        }
      for (int i=0; i<6; i++) {
        pinMode(key[i],OUTPUT);
        }
     
      if (! rtc.begin())
      {
        Serial.println("Couldn't find RTC");
        while (1);
      }
      //rtc.adjust(DateTime(2016, 5, 20, 14, 02, 00));
      if (rtc.lostPower()) {
        Serial.println("RTC lost power, lets set the time!");
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        rtc.adjust(DateTime(2016, 5, 16, 22, 30, 0));
      }
      startTime = millis();

    }
    ////-----------------------------------------------------------------------


    void loop () {

      if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        irrecv.resume(); // Receive the next value
      }

      unsigned long currentTime = millis();
      int a[5]; //цифры на часах
     
        for (int i=0; i<N; i++){ //
          if (currentTime>=(startTime+500)){
              startTime = currentTime;
              flag=1;
            }
          }
     
      if (flag) {
          DateTime now = rtc.now();
          int h=now.hour();
          int m=now.minute();
          int s=now.second();
          a[0] = h/10;
          a[1] = h%10;
          a[2] = m/10;
          a[3] = m%10;
          a[4] = s/10;
          a[5] = s%10;
        }
     
      show(a);


       flag=0;
    }
    ////-----------------------------------------------------------------------


    void show(int c[])//динамическая индикация- каждую цифру по 1мс
    {
      int x= 6;
      for (int i=0; i<x; i++){
        setNumber(c[i]);
        digitalWrite(key[i],HIGH);
        delay(FREQ);
        digitalWrite(key[i],LOW);
      }
    }


    void setNumber(int num) //сигнал дешифратору- из десятичного в бинарный
    {
      for (int i=0; i<4; i++){
        int h=num%2;
        num/=2;
        if(h){
          digitalWrite (out[i],HIGH);
          }
        else{
          digitalWrite (out[i],LOW);
          }
        }
    }
     
    часы в работе
    [​IMG]
    https://www.dropbox.com/s/a1z3i0pzu3r0sqj/DSC_0013.JPG?dl=0

    схема
    [​IMG]
    https://www.dropbox.com/s/a1z3i0pzu3r0sqj/DSC_0013.JPG?dl=0
     
  12. Guri

    Guri Нерд

    А может есть какие-то другие способы подключения ДУ или аналоги ДУ? А то хотелось бы обойтись без кнопок.
     
  13. ZAZ-965

    ZAZ-965 Гуру

    Guri, поправьте ссылку на схему. Можно настроить свободный таймер на ~300Гц (6 символов * 50Гц) и show() вызывать в прерывании.
     
  14. Guri

    Guri Нерд

    Я хотел сказать плата, а не схема.[​IMG]

    А схема такая:
    [​IMG]
    Где а1..а6== key[]={12,8,7,6,5,4};//транзисторные ключи
    А0..А4==int out[]={3,15,16,2};

    Проблема с динамической индикацией в том, что если частота меньше 500 герц (2мс на каждую цифру), то видно как прыгают цифры.

    А как это можно сделать?