Блок с датойБлок с временемБлок с возрастом сайта
Mr.ALB

    Анатолий Беляев (aka Mr.ALB). Персональный сайт

    Да пребудут с вами Силы СВЕТА!

     

    Ардуино (Arduino). #5

    Барометр на BMP280

    Продолжаю модернизацию скетча, размещённого на предыдущей странице #4 Тестируем BMP280. Подключаем графический экран Nokia 5110, на который будем выводить информацию о давлении, температуре и высоте.

    В процессе разработки и тестирования базовой программы, добавил пришедший из Китая датчик влажности DHT22. А из-за выявленной капризности дисплея Nokia5110, далее переделал программу для вывода информации на малюсенький дисплейчик типа OLED SSD1306 с разрешением 128*32 точки, хотя заказывал с разрешением 128*64, но китаец, вместо заказанного, прислал с разрешением в два раза хуже... и мой выход из создавшейся ситуации – как всё равно вывести полную информацию и ещё и на русском языке улыбка.

    В конце страницы переделка программы для вывода информации на дисплей типа TFT ST7735 1.8 дюйма с разрешением 128*160 точкек.


    Варианты

     


    Использование дисплея Nokia 5110

    Для вывода большего количества информации удобно использовать графический дисплей.

    Графический экран Nokia 5110 имеет размеры 84 х 84 пикселя (точки). Размер самой платы экрана 43 х 45 мм. Подключение осуществляется через 8 контактов внизу экрана.

    Дисплей Nokia5110
    Pic 1. Дисплей Nokia5110

    Напряжение питания Nokia 5110 составляет 3.3В, как и у модуля BMP280.

    Для вывода информации на экран, используются библиотеки <Adafruit_GFX.h> и <Adafruit_PCD8544.h>.

    Все соединения модуля и экрана с Arduino указаны на схеме. Контакты Arduino можно использовать не обязательно такие как у меня, а любые свободные, при условии соответствующего изменения в скетче, однако, указанные контакты используют аппаратное подключение по SPI, что работает быстрее, чем программное подключение на других контактах.

    Схема для скетча #5
    Pic 2. Схема для скетча #5

    На монтажную панельку добавляем ещё одну кнопку SB2, с помощью которой будем управлять яркостью подсветки экрана.

    Реализация скетча #5
    Pic 3. Реализация скетча #5

    Вывод информации на экране осуществляется в три строки...

    Работа дисплея Nokia5110
    Pic 4. Работа дисплея Nokia5110

    Четвёртая строка внизу используется для вывода шага подсветки. Шаг подсветки равен 10%. После 100% яркости подсветки, нажатие кнопки SB2 переводит в отключение подсветки, т.е. яркость равна 0%. Изменение градации подсветки циклическое.

    Работа подсветки дисплея Nokia5110
    Pic 5. Работа подсветки дисплея Nokia5110

    После всех подключений модулей к плате Arduino, переходим к скетчу (программе).

    Скетч барометра на модуле BMP280 и
    экране Nokia 5110

    Особо трудных моментов при подключении дисплея нет. Используя библиотеки, делаем соответствующую настройку.

    Ниже скетч барометра, который можно скопировать и вставить в свой Arduino IDE, надеюсь все запятые на месте улыбка:

    /**********************************************************************
     * 2018-05-24 Mr.ALB Тренировка в программировании Ардуино
     * 
     * Arduino  - BMP280 
     *  A5      - SCL
     *  A4      - SDA
     *  3.3V    - VCC
     *  GND     - GND
     *
      * Аппаратное подключение LCD
     * ARDUINO  - Nokia 5110 LCD 
     * PIN 10   - RST  Pin 1 
     * PIN 9    - CE   Pin 2  
     * PIN 8    - DC   Pin 3 
     * PIN 11   - DIN  Pin 4
     * PIN 13   - CLK  Pin 5
     * PIN 3.3V - VCC  Pin 6 
     * PIN 3    - BL   Pin 7
     * PIN GND  - GND  Pin 8
     *
     * 2018-05-26 v1.0 Вывод информации на Монитор порта
     * 2018-06-03 v1.1 Вывод информации на дисплей Nokia 5110
     * 2018-08-11 v1.2 Модернизация коррекции температуры
     * 2018-10-07 v1.3 Обновление по времени
     * 
    **********************************************************************/
    
    /* Подключение библиотек */
    #include <Wire.h>            // для I2C
    #include <Adafruit_BMP280.h> // для BMP280
    #include <Adafruit_GFX.h>    // для графики
    #include <Adafruit_PCD8544.h>// для Nokia 5110
    #include <Button.h>          // для кнопок
    
    // Создаём объект барометра
    Adafruit_BMP280 bme;
    
    // Создаём объект дисплея
    // Adafruit_PCD8544(int8_t CLK, int8_t DIN, int8_t DC, int8_t RST);
    Adafruit_PCD8544 lcdDisplay = Adafruit_PCD8544(13, 11, 8, 9, 10);
    
    #define BUTTON_SET_LEVEL 5 // Кнопка обнуления текущего давления
    #define BUTTON_LIGHT 4     // Кнопка подсветки дисплея
    #define LIGHT_PIN 3        // Вывод PWM для подсветки дисплея
    
    // Создание объектов для кнопкок
    Button buttonSetLevel(BUTTON_SET_LEVEL,18);
    Button buttonLight(BUTTON_LIGHT,18);
    
    /**********************************************************************
     * мБар       - мм рт. ст.
     * 1013.2472  - 760 k=1.33322
     * 1005.24788 - 754
     * 
    **********************************************************************/
    
    // Нулевой уровень для давления 1005.24788 мБар => 754 мм рт.ст.
    double null_level = 1005.24788;
    
    // Коэффициент для перевода Па в мм рт.ст.
    double kp = 133.322;
    double press_now, press_last, press_tmp, altit;// Переменные давления
    double temp, temp_last;     // Переменные температуры
    double temp_correct = -2.94;// Коррекция температуры
    byte  xinf = 36;            // Позиция вывода значений
    
    int   level_light = 0;      // Уровень подсветки
    byte  count_level_light = 0;// Счётчик шагов подсветки
    
    unsigned long time_now, time_check, time_delta = 27000;// Для обновления по времени
    boolean flagcheck = false;// Флаг для обновления по времени
    
    char vers[] = "v1.3";           // Версия программы
    char vers_date[] = "2018-10-07";// Дата создания
    
    /**********************************************************************
     * Настроечная функция, выполняется один раз вначале
    **********************************************************************/
    void setup()
    {
     pinMode(LIGHT_PIN, OUTPUT);
    
    /* Установки дисплея */
     lcdDisplay.begin();        // Старт дисплея
    // Установить контраст фона экрана
    // Очень важный параметр!
     lcdDisplay.setContrast(45);// Установить от 40 до 60
     lcdDisplay.clearDisplay(); // Очистить экран
    
    /* Заставка на экране */
     lcdDisplay.setTextSize(2);// Крупный шрифт
     lcdDisplay.setTextColor(BLACK);
     lcdDisplay.setCursor(8,0);// (0,0)=> лево-верх
     lcdDisplay.print("BMP280");
     lcdDisplay.setTextSize(1);// Обычный шрифт
     lcdDisplay.setCursor(24,20);
     lcdDisplay.println("Mr.ALB");
     lcdDisplay.setCursor(30,28);
     lcdDisplay.println(vers);
     lcdDisplay.setCursor(12,36);
     lcdDisplay.print(vers_date);
     lcdDisplay.display();     // Вывод на экран
     delay(2000);              // Задержка на 2 сек
     lcdDisplay.clearDisplay();// Очистка экрана
    
     Serial.begin(9600);
     if(!bme.begin())
     {
       Serial.println("Не найден датчик BMP280, проверьте соединение!");
       lcdDisplay.setCursor(0,0);
       lcdDisplay.println("Not find...");
       lcdDisplay.println("BMP280 sensor!");
       lcdDisplay.println("Check contacts");
       lcdDisplay.println();
       lcdDisplay.println("Click Reset");
       lcdDisplay.display();
       while(1);// Остановка программы
     }
    }
    
    /**********************************************************************
     * Функция loop() выполняется постоянно
    **********************************************************************/
    void loop()
    {
      time_now = millis();
      if(time_now - time_check > time_delta)// Проверка интервала времени
      {
        time_check = time_now;
        flagcheck = true;// Флаг на обновление
      }
    
      buttonSetLevel.scanState();// Считывание состояния кнопки SB1
      buttonLight.scanState();   // Считывание состояния кнопки SB2
    
     /* Было нажатие кнопки SB2 - подсветка экрана */
     if(buttonLight.flagClick == true)
     {
       buttonLight.flagClick = false;// Сброс признака клика
       count_level_light++;// Шаг яркости
       if(count_level_light > 10)
        {
          // Выключаем подсветку
          count_level_light=0;
          level_light=0;
          lcdDisplay.fillRect(0, 40, 83, 5,WHITE);
        }
       else
        {
          level_light = count_level_light*25;
          if(level_light == 250) level_light = 255;// Максимальная яркость
        }
    
       analogWrite(LIGHT_PIN, level_light); // Установка яркости
    
       /* 2018-10-07 Прогресс бар яркости подсветки */
       byte bar_step = 0;
       for(byte ip = 0; ip < count_level_light; ip++)
       {
          lcdDisplay.fillRect(bar_step+1, 40, 7, 5, BLACK);
          bar_step += 8;
       }
       lcdDisplay.display();// Выводим на дисплей
     }
    
     press_now = bme.readPressure()/kp;   // Считывание давления
     temp = bme.readTemperature();        // Считывание температуры
     if(temp_correct!=0) temp+=temp_correct;// Коррекция t° 2018-08-11
    
    /**********************************************************************
     * Если давление изменилось больше чем на 0,2 мм рт.ст.
     * или нажата кнопка обнуления высоты...
     * или температура изменилась больше чем на 0,1°С
    **********************************************************************/
     if((press_now<(press_last-.2))||
         (press_now>(press_last+.2))||
         (temp<(temp_last-.1))||(temp>(temp_last+.1))||
          buttonSetLevel.flagClick == true||
          flagcheck == true
        )
     {
       flagcheck=false;// Сброс флага проверки по времени
    
       if(buttonSetLevel.flagClick == true)// Было нажатие кнопки SB1
       {
         buttonSetLevel.flagClick = false;// Сброс признака клика
        // Обнуляем значение высоты при текущем давлении
         null_level=press_now*kp/100;// В мБарах
       }
    
       altit = bme.readAltitude(null_level);// Считывание высоты
    
       /* Вывод значений в порт */
       Serial.print("Температура = ");
       Serial.print(temp);// Вывод скорректированной температуры
       Serial.println("°C");
    
       Serial.print("Давление = ");
       Serial.print(press_now);// В мм рт.ст.
       Serial.print(" мм рт.ст., ");
       Serial.print(press_now*kp/100);// Перевод Па в мБар
       Serial.println(" мБар");
    
       Serial.print("Приблизительная высота = ");
       Serial.print(altit);
       Serial.println(" м");
       Serial.println();
    
       /* Вывод на LCD */
       lcdDisplay.clearDisplay();// Очистить экран
    
       // Устанавливаем на дисплей температуру
       lcdDisplay.setCursor(0,0);
       lcdDisplay.print("Temp:");
       lcdDisplay.setCursor(xinf,0);
       if(temp > 0) lcdDisplay.print("+");
       lcdDisplay.print(temp);
       lcdDisplay.print("oC");
    
       // Устанавливаем на дисплей давление в мм рт.ст.
       lcdDisplay.setCursor(0,14);
       lcdDisplay.print("Press:");
       lcdDisplay.setCursor(xinf,14);
       lcdDisplay.print(press_now);
       lcdDisplay.print("mm");
    
       // Устанавливаем на дисплей высоту в м
       lcdDisplay.setCursor(0,26);
       lcdDisplay.print("Alt:");
       lcdDisplay.setCursor(xinf,26);
       lcdDisplay.print(altit);
       lcdDisplay.print(" m");
    
       // Вывод на дисплей новой информации
       lcdDisplay.display();
    
       /* Перезаписываем бывшие значения */
       press_last = press_now;
       temp_last = temp;
       delay(50);
     }
    
    }// Конец loop()
    
    
    

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

    Если необходимо уменьшить код, то вывод информации в последовательный порт можно удалить и оставить лишь вывод на дисплей.

    Для модернизации этого скетча можно предложить создать барограф, то есть на графический экран выводить кроме цифрового значения ещё и график изменения давления, к примеру, через час. По резкости изменения давления можно уже судить об изменении погоды. Ещё можно добавить свои пиктограммки: облако, солнышко, дождь, ветер и т.п.

    Возможно сделаю такую модернизацию программы и ниже на странице её размещу, если будет интерес продолжить это направление.

    Код закоментирован достаточно подробно и понятно.

    2018-06-10


    P.S. Попользовался таким дисплеем и обратил внимание, что он какой-то капризный. Всё время у него гуляет контакт на индикатор. Всё время плавает контрастность от совсем невидимого до чёрного даже фона. Может быть это мне такой попался экземпляр.

    P.P.S. Программу изменил и дополнил. Теперь у меня добавлен датчик влажности DHT22. На дисплей выводится температура и значение влажности и с него. А яркость подсветки дисплея выводится на чистый экран с дополнительным прогресс баром.

    Скетч можно скачать тут: sketch__5.zip

    Скетч обновлённой программы с датчиком влажности DHT22 тут: bmp280_nokia5110_dht22.zip

    Для проверки работоспособности вашего дисплея используйте этот скетч:

    Nokia_5110_test.zip

    Используемые библиотеки:

    Adafruit_BMP280_Library.zip
    Adafruit_PCD8544_Nokia_5110_LCD_library.zip
    Adafruit_GFX_Library_master.zip
    Button.zip

    2018-07-23
    2018-08-16

     


    Использование дисплея OLED SSD1306

    Из-за капризности дисплея Nokia5110, переделал программу для вывода информации на малюсенький графический дисплейчик типа OLED SSD1306 с разрешением 128*32 точки.

    Использование дисплея OLED SSD1306
    Pic 6. Использование дисплея OLED SSD1306

    При использовании библиотеки <iarduino_OLED_txt.h> можно установить шрифт SmallFontRus, который выводит на экран символы 6*8 пикселей, что позволяет вывести на экран 8 строк информации, вместо четырёх. Мелковато, конечно, лучше бы использовать дисплей с разрешением 128*64, что позволит вывести символы с разрешением 12*16 пикселей. При использовании OLED дисплея есть приятное преимущество – нет необходимости использования подсветки, в итоге используется лишь одна кнопка для обнуления высоты.

    Скетч обновлённой программы тут: OLED_128_32_bmp280.zip

    Используемая библиотека: iarduino_OLED_txt.zip

    2018-08-22

     


    Использование дисплея TFT ST7735 128*160 1.8 дюйма

    Это уже более качественный графический диспей. Позволяет выводить любые изображения в цвете.

    Получил посылку из Китая с новым цветным TFT ЖК-дисплеем. Контроллер обработки дисплея ST7735. Разрешение 128*160 точек размером 1.8 дюйма.

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

    Схема для скетча #5 v3.2
    Pic 7. Схема для скетча #5 v3.2

    Предыдущий дисплейчик слишком маленький, а этот в самый раз, причём оказалось, что довольно недорогой для его размера и качества. При использовании библиотеки <Adafruit_ST7735.h> можно устанавливать шрифты разных размеров и использовать любые из 65 тысяч цветов в формате RGB565 – красный и синий по 5 бит, а зелёный 6 бит. Недостаток этой библиотеки – отсутствие русского шрифта.

    В скетче использую разный цвет при выводе значения влажности. До 30% – красный, от 30% до 60% – жёлтый, от 60% до 75% – зелёный, свыше 75% – синий. Так визуально легко ориентироваться на диапазон влажности.


    Использование дисплея TFT ST7735 128*160
    Pic 8. Использование дисплея TFT ST7735 128*160
    Использование дисплея TFT ST7735 128*160
    Pic 9. Использование дисплея TFT ST7735 128*160

    При использовании этого дисплея вернул кнопку подсветки, как с дисплеем Nikia5110. Этой кнопкой можно регулировать подсветку ЖК-дисплея, подавая ШИМ на вывод BL. По умолчанию поставил на 10% – для экономии энергии. При нажатии на кнопку прибавляется 10% яркости, после 100% яркость выключается (0%) и т.д. по кругу.

    Режим регулировки подсветки экрана
    Pic 10. Режим регулировки подсветки экрана

    Скетч обновлённой программы тут: TFT_128_160_bmp280.zip

    2018-09-04

    Модернизировал скетч под мобильный вариант. Теперь можно собрать конструкцию и получится карманный барометр-погодная станция. Через порт А0 (контакт 14) происходит измерение напряжения питания Li-Ion 3.7В батареи и выводится значение на экран в виде цифрового значения и пиктограммки. Li-Ion батарея питает DC-DC преобразователь выдающий +5В, которым запитывается Arduino с дисплеем и модулями. Скетч обновлённой программы тут: TFT_128_160_bmp280_v3.1.zip

    2018-09-06

    Ещё одна модернизация. Заметил, что не совсем хорошо, когда обновляются все надписи на экране, поэтому в новой версии обновляются только изменяющиеся значения. Дополнительно основные блоки выделены в функции. Ещё, если Arduino подключено к компьютеру, то значение напряжения питания батареи и её пиктограмка не выводятся. Скетч обновлённой программы тут: TFT_128_160_bmp280_v3.2.zip

     

    Вариант на Arduino Pro Mini

    Схема этого варианта создана на базе Arduino Pro Mini, она включает в себя стабилизатор на 3.3В, подробнее про который можно посмотреть на странице Ардуино (Arduino). #7. В остальном схема подобна предыдущей.

    Схема для скетча #5 v3.3 на Arduino Pro Mini
    Pic 11. Схема для скетча #5 v3.3 на Arduino Pro Mini
    Вариант на Arduino Pro Mini
    Pic 12. Вариант на Arduino Pro Mini
    Вариант на Arduino Pro Mini
    Pic 13. Вариант на Arduino Pro Mini

    На фото видно использование самодельного модуля стабилизатора на 3.3В, для питания модуля барометра BMP280.


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

    2018-09-08

    Используемая библиотека: Adafruit_ST7735.zip


    . Mr.ALB
    Предыдущая страница Страница 6 Далее