На этом этапе, мы будем выводить на дисплей температуру. В своём скетче мы используем обработчик замеренного значения температуры, и будем иметь возможность вывода как положительных, так и отрицательных значений температуры.

        Ведь измерения датчика BMP180 лежат в пределах от -40 до + 80 градусов по шкале Цельсия. И нашей задачей, является так сказать обработка по полной программе этих пределов измерения. Если вы уже ознакомились с начальными шагами, описывающими функционал и подключение датчика BMP180, модуля часов DS1302 и дисплея на базе драйвера MAX7219, то значит у вас уже всё подключено так, как было описано в предыдущих шагах. Будь то макет, или сборка, важна правильная пошаговая последовательность подключений компонентов к плате Arduino. Если же нет - то добро пожаловать в прочтение соответствующих шагов, перед тем как начать работу с нижеследующим скетчем. Итак, подразумевается что у вас уже всё подключено, и далее можно просто скопировать листинг скетча в редактор Arduino IDE. Кстати, в скетче уже расписаны пины подключения(в объявлениях констант #define), на случай если надо разобраться с этими самыми пинами. 

 

#include "SFE_BMP180.h"
#include "LedControl.h"

/*Константы для пинов подключения дисплея*/
#define DATA_IN 13
#define CLK 12
#define LOAD_CS 11
#define NUM_DEV 1
#define DISP_ADDR 0

/*Создаём объект BMP180_Sensor класса SFE_BMP180*/
SFE_BMP180 BMP180_Sensor;

/*
  Подключение дисплея MAX7219 производим в
  соответсвии с нижеследующей таблицей
  Arduino [Pin 13] -> Max7219 [DataIn]
  Arduino [Pin 12] -> Max7219 [CLK]
  Arduino [Pin 11] -> Max7219 [LOAD]

  Далее, ниже создаём объект Display класса LedControl
  с указанием пинов подключения, константа NUM_DEV говорит
  о том сколько устройств будет подключено каскадом по шине SPI
  в данном случае - всего одно, это дисплей MAX7219
*/
LedControl Display = LedControl(DATA_IN, CLK, LOAD_CS, NUM_DEV);

/*Символ Цельсия - С*/
byte Celsius = B01001110;
/*Символ градуса - */
byte degree = B01100011;
/*Символ минуса - отрицательная температура*/
byte sign = B00000001;

/*Выводимая строка - температура, дата, время*/
byte DispString[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

/*Массив с закодированными цифрами от 0 до 9*/
byte Digits[10] = {0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B};

void setup()
{
  /*Инициализация датчика BMP180*/
  BMP180_Sensor.begin();
  /*Выводим дисплей из спящего режима*/
  Display.shutdown(DISP_ADDR, false);
  /*Устанавливаем яркость свечения сегментов*/
  /*Доступные значения от 0 до 15*/
  Display.setIntensity(DISP_ADDR,8);
  /*Очищаем дисплей*/
  Display.clearDisplay(DISP_ADDR);
}

void loop()
{
  delay(300);
  /*Функция обновления показаний температуры на дисплее*/
  DispUpdate();
}

void DispUpdate()
{
  int T = GetTemperature();
  int TempValue = abs(T);
  DispString[0] = Celsius;
  DispString[1] = degree;

  if(TempValue == 0)
  {
    DispString[2] = Digits[TempValue];
    for(int i = 3; i < 8; i ++)
      DispString[i] = 0x00;
  }
  else
  {
    for(int j = 2; j < 8; j ++)
    {
      if(TempValue == 0)
      {
        if(T < 0)
        {
          DispString[j] = sign;
          for(int i = j; i < 8; i ++)
            DispString[i + 1] = 0x00;
          break;
        }
        else
          if(T > 0)
            DispString[j] = 0x00;
      }
      else
        DispString[j] = Digits[TempValue % 10];
      TempValue = TempValue / 10;
    }
  }
  /*Размещаем на дисплее массив символов *сообщение*/
  for(int i = 0; i < 8; i ++)
    Display.setRow(DISP_ADDR, i, DispString[i]);
}

int GetTemperature()
{
  /*Переменная для хранения замеренного значения температуры*/
  double T;
  char status;
  //Работаем с датчиком BMP180
  status = BMP180_Sensor.startTemperature();
  if (status != 0)
  {
    /*Выжидаем период для корректного замера*/
    delay(status);
    /*Записываем в T значение замеренной температуры*/
    status = BMP180_Sensor.getTemperature(T);
    if (status != 0)
      return int(T);
  }
}

 

        После загрузки скетча, можно видеть на дисплее показания замеренной температуры(как положительные, так и отрицательные):

 

 

        Вообще, данную сборку можно использовать и как отдельный термометр, это на тот случай, если не нужно дальнейшее построение часов, и есть желание обойтись простым электронным термометром. Немного позже, мы добавим дополнительный функционал к выводу значений на дисплей, это будет два вида анимации - прокрутка и развёртывание. А пока что просто обойдемся отрисовкой на дисплее статического значения. Ну и следующим шагом, нас ждет форматирование и вывод на дисплей текущей даты.