Помогите с 7-сегментным дисплеям драйвер 74HC595

Тема в разделе "Флудилка", создана пользователем Max_P, 20 фев 2017.

  1. Max_P

    Max_P Нуб

    Добрый день, всем хорошим людям!!
    Я новичок в программировании Arduino, и сразу прошу прощения за непонятные написания моих мыслей. Нужен пинок в правильном векторе работы с 7-сегментным дисплеем. Нужна помощи вот в таком деле. Я хочу потенциометром выставлять заданную температуру для сработки реле и после того как я выставил температуру через 1- секунду выводятся показания реальной температуры с датчика MAX6675 K-тип с термопары. Я вывожу на него показания с потенциометра все работает но вот как мне выводить данные с термометра на тоже дисплей понять не могу. И еще одна проблема при чтении данных с MAX6675 дисплей сразу начинает моргать, как отключаю чтение все нормально.

    Всем откликнувшимся большое спасибо!!!
     
  2. Tomasina

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

    Код (C++):
    #define POT_PIN          A0   // пин для подключения потенциометра
    #define DISPLAY_TIMEOUT  1    // интервал переключения дисплея в основной режим, сек
    enum {SET_TEMP, SHOW_TEMP};   // варианты отображения данных на дисплее
    byte currentDisplayMode;      // переменная для хранения текущего режима дисплея
    unsigned int POTvalue;        // переменная для хранения текущего состояния потенциометра
    unsigned long timestampDSP;   // переменная для хранения времени переключения режимов дисплея

    void setup()
    {
      currentDisplayMode = SHOW_TEMP; // при первом включении задаем "основной" режим отображения данных
    }

    void readPOT()   // функция работы с потенциометром
    {
      static unsigned int oldPOTvalue;  // переменная для хранения предыдущего значения потенциометра
      POTvalue = analogRead(POT_PIN);   // считываем значение с потенциометра
      if (POTvalue != oldPOTvalue)      // если значение потенциометра изменилось
      {
        currentDisplayMode = SHOW_TEMP; // задаем режим отображения: показания потенциометра
        timestampDSP = millis();        // запоминаем время этого переключения
      }
    } // end of readPOT

    void readTemp()   // функция работы с MAX6675
    {
      // тут код для работы с MAX6675
    } // end of readTemp


    void displayData() // функция вывода данных на дисплей
    {
      switch (currentDisplayMode)
      {
        case SET_TEMP:
          {
            // тут код вывода задаваемой потенциометром температуры
          }
        case SHOW_TEMP:
          {
            // тут код вывода текущей измеренной температуры
          }
      } // end of switch
    } // end of displayData

    void relayOperate()   // функция работы с реле
    {
      // тут код для работы с реле
    } // end of relayOperate

    void loop()  // выполняем задачи
    {
      readPOT();                         // снимаем показания потенциометра
      readTemp();                        // снимаем показания датчика температуры
      if (currentDisplayMode == SET_TEMP && millis() - timestampDSP > DISPLAY_TIMEOUT) // если отображаем показания потенциометра И прошло больше 1 сек
      {
        currentDisplayMode = SHOW_TEMP; // то задаем режим отображения: показания текущей температуры
      }
      displayData();                    // выводим данные на дисплей
      relayOperate();                   // управляем реле
      // тут что-то еще может быть
    } // end of loop
    Общая архитектура понятна?
     
    Max_P и arkadyf нравится это.
  3. Max_P

    Max_P Нуб

    Tomasina Спасибо. Кажется я немного понял, пинок в правильный вектор. А вот мигание дисплея непонятно почему? как только я читаю данные с микросхемы MAX6675
    int temp;
    temp = thermocouple.readCelsius();
     
  4. Tomasina

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

    мое предположение - 74HC595 требует постоянного ногодрыганья для динамической индикации, а в моменты работы с MAX6675 этот процесс прерывается на этапе "погасить все сегменты", поэтому индикатор в такие периоды кажет пустоту.
    Либо надо переработать код отображения, либо используй для индикации TM1637, стоит копейки и умеет самостоятельно поддерживать индикацию при отсутствии внешний воздействий, т.е. не тратит ресурсы основного процессора.
     
    Max_P и arkadyf нравится это.
  5. Max_P

    Max_P Нуб

    Спасибо огромное, так я и думал что при обращении на микросхему MAX6675 процесс отрубается и из-за этого мигание. Спасибо еще раз буду ковырять с отображением и наверно попробую читать данные с термопары с помощью LM358N. Просто с переработкой скетча отображения ваще бида будет, у меня не столь обширные познания языка программирования.
     
    Последнее редактирование: 20 фев 2017