Вывод температуры с DS18B20 на ТМ1637

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

  1. Niklog78

    Niklog78 Нуб

    Прошу помощи, как вывести температуру с DS18B20 на 4 разрядный 7 сегментный модуль на ТМ1637 вот такой: http://www.aliexpress.com/item/4-Digit-LED-Display-Tube-7-segments/32591091564.html
    Как работать с датчиком температуры понятно, как подключить модуль дисплея тоже понятно, как выводить цифры на дисплей ясно. Но как вывести температуру я не могу понять, потому, что температуру нужно разбить на отдельные цифры, я не пойму как это сделать. К примеру показания датчика 25.67 , как его разбить на отдельные числа и вывести на дисплей и как точку зажечь?
     
  2. Tomasina

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

    Код (C++):
    #include "TM1637.h"                // https://github.com/avishorp/TM1637 // возможно, у тебя другая библиотека
    #define DISP_CLK            12     // выход на семисегментный LED дисплей
    #define DISP_DIO            13     // выход на семисегментный LED дисплей
    TM1637 TM1637(DISP_CLK, DIS_DIO);  // инициализация дисплея

    void loop()
    {
    float temperature = 25.67;   // температура с датчика - заменить на свой код
    unsigned int RAWtemp = temperature * 100;    // переводим в целое число
    int8_t Digits[] = {0x00,0x00,0x00,0x00};  // буфер для цифр LED-индикатора
    Digits[0] = (byte)(RAWtemp / 1000) % 10; // раскидываем 4-значное число на цифры
    Digits[1] = (byte)(RAWtemp / 100) % 10;
    Digits[2] = (byte)(RAWtemp / 10) % 10;
    Digits[3] = (byte)(RAWtemp) % 10;
    ТМ1637.display(Digits);    // команда вывода буфера на дисплей (из библиотеки)
    }
     
     
    Niklog78 нравится это.
  3. Niklog78

    Niklog78 Нуб

    Tomasina СПАСИБО! за ответ, но по вашему примеру не корректно отображается температура на 3 сегменте Digits[2]. Вероятно по тому, что остаток от деления не одна цифра, а две ( 2567 / 10 = 256.7 % 10 = 67) и на сегмент выводятся странные числа.
    Немого повозился с вычислениями, вот что получилось:

    #include "TM1637.h"
    #define CLKKL 20
    #define DIOKL 21
    TM1637 tm1637KL(CLKKL, DIOKL);
    float tempSensorKOL = 165.67; // температура с датчика - заменить на свой код
    //float temperature = 25.67; // температура с датчика - заменить на свой код

    void KLLCD() {
    int8_t Digits[] = {0x00, 0x00, 0x00, 0x00};
    int KL1 = tempSensorKOL;
    int KL2 = (tempSensorKOL - KL1) * 100;
    if (KL1 > 99)(KL1 = tempSensorKOL - 100);
    tm1637KL.point(POINT_ON);
    Digits[0] = (KL1 / 10); // раскидываем 4-значное число на цифры
    Digits[1] = (KL1 % 10);
    Digits[2] = (KL2 / 10);
    Digits[3] = (KL2 % 10);
    tm1637KL.display(Digits);
    }
    void setup() {
    // put your setup code here, to run once:
    tm1637KL.init();
    tm1637KL.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
    }

    void loop() {

    KLLCD();
    }
    Объеденил в функцию, будет использоваться этот кусок кода в другой программе.
    Вроде работает, правильно ли я все сделал?
    И вопрос про точку, выражение :
    tm1637KL.point(POINT_ON);
    включает двоеточие на модуле, а у меня на модуле на каждом сегменте есть еще точка, хотел бы сделать вывод температуры в ракурсе 25.56 а не 25:67, но не знаю как включить точку на каждом сегменте, подскажите кто знает, спасибо за ранее :)
     
  4. Tomasina

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

  5. rus2016

    rus2016 Нуб

    Скажите пожалуйста, что надо заменить на свой код?
    float temperature = 25.67; // температура с датчика - заменить на свой код
     
  6. Machineman

    Machineman Нуб

    Вместо "25.67" подставить переменную, в которую пишется значение с датчика.
     
  7. yden

    yden Гик

    С разрешения ТС можно вопрос по теме.
    Для работы с 1637 использую библиотеку TD1637.h
    Задался вопросом на 1637 вывести символы: -, +. Т.е чтобы дисплей выводил положительную и отрицательную температуру.. Не могу понять как это можно сделать. Подскажите плиз.

    благодарю
     
  8. Machineman

    Machineman Нуб

    Библиотека ТМ1637 позволяет выводить либо число через функцию disp.Display() , либо поразрядно цифры через ту же функцию , но в скобках указать сначала разряд, а потом значение через запятую disp.Display(0, 3) - в первом слева (нулевом) разряде пропишется цифра 3. Можно влезть в библиотеку и в массиве static int8_t TubeTab[] посмотреть где какой знак находится, я добавлял туда знак Цельсия, чтоб на термометр выводить. Его значение 0x63 и находится он в массиве под индексом 18.
    соответственно, чтоб вывести число со знаком у меня получилось
    Код (C++):
    //функция вывода температуры на 1637

      disp.display(temp); //вывод значения температуры
      disp.display(3, {18}); //вывод знака Цельсия в 4й разряд
     
    отсчет разрядов дисплея идет слева направо и начинается с нуля.
    Стоп, а разве нельзя в функции написать например -25.6 ??

    Только что проверил на макете- замечательно выводит знак минус без всяких поразрядных танцев с бубном. Переменная , которая значение принимает (temp) должна быть float.
     
    Последнее редактирование: 29 июл 2017
  9. yden

    yden Гик

    Благодарю.
    Я не только хочу чтобы на 1637 выводилась температура, но и давление с пометкой возрастает оно, падает, либо постоянное.
    На обычный трехстрочный экран я вывожу следующую информацию: 740+ - давление возрастает, 740- - понижается, 740* - постоянное. Очень удобно, сразу видно "куда катится погода".
     
  10. Machineman

    Machineman Нуб

    Столкнулся с проблемкой- вывожу на 1637 показания с двух датчиков через 2 функции попеременно. Функции сменяются через millis(). Один из датчиков 18b20 у которого в библиотеке delay и это негативно влияет на отображение- при показе какого-либо значения в течение времени происходит промаргивание пустых разрядов, вроде бы ничего страшного, но неприятно. Грешу на библу 18в20, потому что без нее все нормально. Возможно ли как то отправлять данные на этот дисплей коротким импульсом , чтоб запись в переменную и соответственно ее вывод шла не постоянно, а кратко, а потом ожидание следующего получения?
     
  11. Limoney

    Limoney Гик

    ТМ1637 отличный драйвер, когда нужно, посылаете ему данные. Никак delay драйверу не может помешать.
     
  12. Machineman

    Machineman Нуб

    Я не могу понять как выводить десятичную точку в нужный разряд. Если писать в функцию число int , то точка появляется как надо, но тогда не корректно отображается знак градуса в 4м разряда ( моргает), а если разбивать число по разрядам, то не высвечивается точка. С библиотекой разобраться не могу в силу малого опыта программирования. Где точка в библе и как она управляется?
    Вот так нет точки, но знак градуса не дрожит
    Код (C++):
    void loop()
    {
      int16_t temp = 26.7*10;
      disp.display(0, (temp /100) % 10);
      disp.display(1, (temp /10) % 10);
      disp.display(2, (temp % 10));
      disp.display(3 , {18}); // индекс знака градуса в массиве библиотеки
    }
    А вот так градус с ума сходит
    Код (C++):
    void loop()
    {

    disp.display(26.7);
    disp.display(3 , {18});
    }

    Код (C++):
    temp[0] = (Decimal /1000 % 10);
         //Decimal %= 1000;
        temp[1] = (Decimal / 100 % 10);
         // Decimal %= 100;
        temp[2] = Decimal / 10 % 10;
        temp[3] = {17}; // индекс пустышки в массиве
     
     
     
    Последнее редактирование: 2 авг 2017