Arduino барометр - барограф

stojanov
stojanov аватар
Offline
Зарегистрирован: 14.06.2017

У меня есть одна проблема, и я не знаю, как ее исправить или что не так с программным обеспечением. Я использую Meteostation_v_2.0. Ледяной свет можно включать и выключать только на главном экране. Если я включаю его, я не могу пройти через меню, светодиод гаснет. Если я включаю светодиод на любом экране, он сразу переключается на домашний экран и остается гореть, но не может гореть, пока я не выключу светодиод. Кто-нибудь может мне помочь? Я так благодарен тебе !!!! Привет !!!!!

runaway
Offline
Зарегистрирован: 25.09.2012

Здравствуйте, уважаемые участники.

Нашёл способ "стабилизации" проблемных китайских модульных дисплеев Nokia 5110.

На жестяную прижимную рамку, по бокам экрана, вертикально, кладу два ровных бруска (паралеллепипеда) - любые подходящие предметы, чтобы их длинЫ хватало на всю высоту рамки экрана. Идея - прижать рамку в районе защёлок к плате модуля как можно туже, не надавливая при этом на стекло дисплея. Приспособил под это дело два пенальчика со сменными стержнями от автоматического карандаша (первое, что попало под руку на столе). И прижал их к экрану (т.е. к вертикальным участкам рамки - там, где защёлки) стальной пружинной канцелярской клипсой (с такими двумя блестящими болтающимися дужками). Клипса, надо сказать, весьма тугая: если на ноготь - я лично не выдерживаю.

Прижал - и закапал каждую защёлку жестянки каплей суперклея - понемногу, со всех сторон, так, чтобы вокруг защёлки образовался убедительный клеевой мениск, и заполнил собой всю полость щели между защёлкой и текстолитом. Клей лучше использовать "гелевый" - он гораздо менее текуч, и меьше вероятность, что затечёт куда-нибудь не туда. И оставляю экран в положении защёлками вниз на сутки, чтобы весь объём клея хорошенько затвердел.

Потом снимаю клипсу, ради эстетики смазываю белёсые пятна вокруг защёлок тонким слоем синт. масла, вытираю насухо... Восстановил таким образом уже ТРИ проблемных дисплея - сейчас они совершенно не реагируют на нажатия на жестяную рамку в любом ее месте - хоть над резинкой, хоть по углам - без разницы. Фон остаётся стабильно прозрачным, символы яркими, мусор пропал начисто.

Моментальную эпоксидку не советую - во всяком случае, сначала проверьте. У меня она отверждается в камень только через пару недель, и то летом. А так - резина резиной. Как уже не месил, по-разному. Фирмы "Момент". В печку, (на лампу накаливания) для быстрого отверждения, ЖКИ не положишь - не имеет особого смысла, а без печи ждать долго. А вот Супер - идеальный вариант.

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

Успешно повторил прибор S13 с шестой страницы (вариант только с давлением). Всем доволен, кроме одного: автомасштабирование убивает наглядность графика. Однозначно. А так всё СУПЕР. Собираюсь повторять вариант участника bodry_14, который без автомасштабирования графиков...

Спасибо за внимание! ))

runaway
Offline
Зарегистрирован: 25.09.2012

Дубль, удалён автором.

lavr
Offline
Зарегистрирован: 03.05.2017

Приветствую!

Еще один вариант барографа.

lavr
Offline
Зарегистрирован: 03.05.2017
stojanov
stojanov аватар
Offline
Зарегистрирован: 14.06.2017

Отличная работа !!!! Можете ли вы загрузить схему и внешний файл?

lavr
Offline
Зарегистрирован: 03.05.2017
#include <UTFT.h>                                       // подключаем библиотеку UTFT
#include <Wire.h>                                       // Подключаем библиотеку Wire
#include <SoftwareSerial.h>                             // Подключаем библиотеку SoftwareSerial
#include <Adafruit_Sensor.h>                            // Подключаем библиотеку Adafruit_Sensor
#include <Adafruit_BME280.h>                            // Подключаем библиотеку Adafruit_BME280
 
#define SEALEVELPRESSURE_HPA (1013.25)                  // Задаем высоту
 Adafruit_BME280 bme;

// Определяем выводы используемые для
// управления дисплеем 3.2" TFT 320x240 Pro mini:
#define dispMISO    8
#define dispSCK     7
#define dispCS      6
#define dispRST     5
#define dispDC      4
#define LED_PIN  3               // Определение директивы для PWM пина №6, на который заведен светодиод
#define LDR_PIN  A2              // Определение директивы для аналогового пина №0(A0), на котором находится фоторезистор
int MAX_BRIGHTNESS = 800;        // Значение при вашей максимальной освещенности
int MIN_BRIGHTNESS = 0;        // Значение при вашей минимальной освещенности.

// подключаем шрифты
extern uint8_t BaroGraf2020[];          //шрифт создан для написания спецсимволов
extern uint8_t Sinclair_S[];            //надо писать этим цифры шкалы
extern uint8_t Cifra1[];                //надо писать этим цифры значений

UTFT myGLCD(TFT01_24SP, dispMISO,dispSCK, dispCS,dispRST, dispDC);    // объявляем объект myGLCD класса библиотеки UTFT указывая тип дисплея


byte Ytemp[285];                             // массив координат давления
int Xtaim[285];                             // объявил массив для координат времени от 
int y=0;                                    // первоначальное значение счетчика количества давлений

SoftwareSerial mySerial(A1, A0); // RX, TX сенсора MH-Z19(14) 

byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; // волшебная комманда - смотри мануал
char response[9]; // здесь будет ответ

void setup(){
  
    Serial.begin(9600);                                  // Открытие последовательного порта на скорости 9600 
    mySerial.begin(9600);                                //а это датчик MH-Z19(14) 
    if (!bme.begin(0x76)) {                                // Инициализация датчика BME280
    //Serial.println("Could not find a valid BME280!");  // Печать сообщения об ошибки
    while (1);
    }
    pinMode(LED_PIN, OUTPUT);              // Инициализируем ШИМ пин №6 как выход
    
    myGLCD.InitLCD();                           // инициируем дисплей
    myGLCD.clrScr();                            // стираем всю информацию с дисплея
    myGLCD.setColor(200,200,200);               // устанавливаем белый цвет текста красный зеленый синий
    myGLCD.setFont(Sinclair_S);                 // шрифт названия данных    
    myGLCD.print("720", 5, 193);                // выводим 720 на дисплей
    myGLCD.print("730", 5, 164);                // выводим 730 на дисплей
    myGLCD.print("740", 5, 134);                // выводим 740 на дисплей
    myGLCD.print("750", 5, 104);                // выводим 750 на дисплей
    myGLCD.print("760", 5, 74);                 // выводим 760 на дисплей
    myGLCD.print("770", 5, 44);                 // выводим 770 на дисплей
    myGLCD.print("NOW", 295, 41);               // выводим now на дисплей
    myGLCD.print("-DAY", 223, 41);              // выводим now на дисплей
    myGLCD.print("-2DAY", 150, 41);             // выводим now на дисплей
    myGLCD.print("-3DAY", 78, 41);             // выводим now на дисплей
    myGLCD.drawLine( 30 , 48, 30, 198);         // Рисуем координату давления
    myGLCD.drawLine( 30 , 198, 316, 198 );      // Рисуем координату времени 
    
    
    myGLCD.setColor(100, 100, 100);               // устанавливаем белый цвет текста красный зеленый синий
    myGLCD.drawRect(0,0,159,37);                // Рисуем прямоугольник давления 
    myGLCD.drawRect(161,203,319,240);           // Рисуем прямоугольник со2
    myGLCD.drawRect(161,0,319,37);              // Рисуем прямоугольник температуры
    myGLCD.drawRect(0,203,159,240);             // Рисуем прямоугольник влажность
    myGLCD.drawRect(0,39,319,201);              // Рисуем прямоугольник вокруг графика давления
    
     
    
    
    int k;                                      //это я присваиваю
    for (k = 0; k < 284; k = k + 1)             //элементам массива
    {
    Xtaim[k]= 32 + k;                           //который время по горизонтали значения времени
    Ytemp[k]= 197;                              //который давление первоначальное значение в 720 мм рт ст
    }
 
}

void loop() 
      {

          int brightness = analogRead(LDR_PIN);        // Получаем значение с аналогового входа A0
          // Получение тестовых значений  Выводим на монитор полученное значение
          
           //Serial.print("brightness = "); // Название значения для наглядного представления
            //Serial.println(brightness);    // Выводим значение и используем вызов println, те переноса строки
  
            // Выставляем границы в соответствии с границами значений освещенности, полученными эксперементально ранее.
             // Функция constrain проверяет значение(brightness) и если надо задает новое, так чтобы оно была в области допустимых значений, заданной параметрами(MIN_BRIGHTNESS, MAX_BRIGHTNESS)
           brightness = constrain(brightness,MIN_BRIGHTNESS,MAX_BRIGHTNESS);
  
          // Распределяем полученное значение от 255 до 0, те при минимальной освещенности наш светодиод будет светится ярче и наоборот, при максимальной будет выключаться.
             int ldr_value = map(brightness, MIN_BRIGHTNESS, MAX_BRIGHTNESS, 1, 255);
 
              // и выводим его на используемый нами ШИМ выход 
               analogWrite(LED_PIN, ldr_value);

  
        
     mySerial.write(cmd,9);                      //запрос PPM CO2
     mySerial.readBytes(response, 9);
     int responseHigh = (byte) response[2];
     int responseLow = (byte) response[3];
     int ppm = (256*responseHigh)+responseLow;  // ну и по мануалу из ответа считаем PPM 
     
    
    int Temp = (bme.readTemperature());
    int Vlag = (bme.readHumidity());
    

// Печать значений на экран    
    myGLCD.setFont(Cifra1);                     // шрифт названия данных 
    myGLCD.setColor(255,255,255);               // устанавливаем  цвет текста красный зеленый синий   
    myGLCD.print( String(bme.readPressure()/133.3 , 0), 43, 7);               // выводим mmHg на дисплей  0 десятичных знаков

    if (Vlag > 60 || Vlag < 30 )
                  {
                    myGLCD.setColor(255,255,0);               // устанавливаем  цвет текста красный зеленый синий  
                    myGLCD.print (String(bme.readHumidity(), 0), 200, 209);                   // выводим влажность на дисплей 0 десятичных знаков
                  }
                   else
                          {
                            myGLCD.setColor(0,255,0);               // устанавливаем  цвет текста красный зеленый синий  
                            myGLCD.print (String(bme.readHumidity(), 0), 200, 209);                   // выводим влажность на дисплей 0 десятичных знаков
                          }
                          
    if (Temp > 25 )
                  {
                    myGLCD.setColor(255,155,0);               // устанавливаем  цвет текста красный зеленый синий  
                    myGLCD.print( String(bme.readTemperature(), 0), 200, 7);                  // выводим температуру на дисплей 0 десятичных знаков
                  }
                  else if (Temp < 18 )
                      {
                       myGLCD.setColor(0,255,255);               // устанавливаем  цвет текста красный зеленый синий  
                       myGLCD.print( String(bme.readTemperature(), 0), 200, 7);                  // выводим температуру на дисплей 0 десятичных знаков 
                      }
                      else
                          {
                            myGLCD.setColor(0,255,0);               // устанавливаем  цвет текста красный зеленый синий  
                            myGLCD.print( String(bme.readTemperature(), 0), 200, 7);                  // выводим температуру на дисплей 0 десятичных знаков 
                          }
    

    

    if (ppm < 1000 )
                    { 
                      myGLCD.setColor(0,0,0);                  // устанавливаем черный цвет текста красный зеленый синий стереть разряд тысяч  
                      myGLCD.fillRect(16,204,38,238);          // Вывод на дисплей закрашенного прямоугольника стереть разряд тысяч  
                      myGLCD.setColor(0,255,0);                  // устанавливаем черный цвет текста красный зеленый синий цвет со2
                      myGLCD.print(String (ppm), 40, 209);        // выводим со2 на дисплей, которое меньше 1000
                    }
                    else  if  (ppm >= 1000 && ppm < 1500)                          // какое со2 печатать, больше 1000 или меньше
                        { 
                          myGLCD.setColor(255,255,0);                  // устанавливаем черный цвет текста красный зеленый синий цвет со2       
                          myGLCD.print(String (ppm), 16, 209);              // выводим со2 на дисплей, которое больше 1000
                         }
                         else
                            {
                             myGLCD.setColor(255,0,0);                  // устанавливаем черный цвет текста красный зеленый синий цвет со2       
                             myGLCD.print(String (ppm), 16, 209);              // выводим со2 на дисплей, которое больше 1000 
                            }

    if (y == 825 || y == 0)                        // первый y это якобы секунды для выборки давления графика примерно 60y это 1 мин 27 сек 2483 сутки
                         {

    myGLCD.setColor(0,0,0);                  // устанавливаем черный цвет текста красный зеленый синий стереть  
    myGLCD.fillRect(163,2,317,33);          // Вывод на дисплей закрашенного прямоугольника стереть разряд тысяч  
    myGLCD.fillRect(163,205,317,238);          // Вывод на дисплей закрашенного прямоугольника стереть разряд тысяч
    myGLCD.fillRect(2,205,157,238);          // Вывод на дисплей закрашенного прямоугольника стереть разряд тысяч
                          
    myGLCD.setFont(BaroGraf2020);               // шифр спецсимволов   
    myGLCD.setColor(255, 128, 200);               // устанавливаем белый цвет текста красный зеленый синий 
    myGLCD.print("01", 120, 8);                 // надпись давления
    myGLCD.setColor(0,191,255);               // устанавливаем белый цвет текста красный зеленый синий
    myGLCD.print("67", 260, 209);               // надпись влажность
    myGLCD.setColor(255,128,55);               // устанавливаем белый цвет текста красный зеленый синий
    myGLCD.print("45", 260, 8);                 // надпись температуры
    myGLCD.setColor(128,255,128);               // устанавливаем белый цвет текста красный зеленый синий
    myGLCD.print("23", 120, 209);               // надпись со2
                         
    if (Ytemp[284] < Ytemp[283] || Ytemp[284] < Ytemp[282] )// cтрелка давления вверх
            {
              myGLCD.setColor(255, 55, 0);                  // устанавливаем черный цвет текста красный зеленый синий цвет со2
              myGLCD.setFont(BaroGraf2020);               // шифр спецсимволов
              myGLCD.print("8", 15, 7);                   // значек давление вверх
            }
    else if (Ytemp[284] > Ytemp[283] || Ytemp[284] > Ytemp[282] )// cтрелка давления вниз
            {
              myGLCD.setColor(255, 55, 0);                  // устанавливаем черный цвет текста красный зеленый синий цвет со2
              myGLCD.setFont(BaroGraf2020);               // шифр спецсимволов
              myGLCD.print("9", 15, 7);                   // значек давление вверх
            }
    else                              // иначе
        {
          myGLCD.setColor(0,0,0);                  // устанавливаем черный цвет текста красный зеленый синий стереть разряд тысяч  
          myGLCD.fillRect(2,2,36,36);          // Вывод на дисплей закрашенного прямоугольника стереть направлени давления         
        }                  
    

    float q=ceil (bme.readPressure()/133.3*3)/3;          // вычисление давления с точностью до 0.3
    byte p=(770 - q)*3 + 48;                       // вычисление фактической координать давления при 25 пикселях сверху
    if ( p < 48 )                                // что бы график давления не вылезал за мах мин
            {
              p = 48;
            }
            else if ( p > 197 )                   // что бы график давления не вылезал за мах мин
                    {
                      p = 197; 
                    }
    Ytemp[284] = p;                          //  последнему элементу массива текущее значение даления

    myGLCD.setColor(0,0,65);                  // устанавливаем черный цвет текста красный зеленый синий стереть график
    myGLCD.fillRect(32,48,316,197);          // Вывод на дисплей закрашенного прямоугольника стереть график

    


    int s;                         //  сдвиг массива влево
         for (s = 0; s < 284; s = s + 1) 
         {
         Ytemp[s] = Ytemp[s + 1];
         }
    
    int b;
         for (b = 0; b < 284; b = b + 1) 
         {
         myGLCD.setColor(0,60,0);               // устанавливаем  цвет текста красный зеленый синий             
         myGLCD.drawLine (Xtaim[b], Ytemp[b],Xtaim[b], 197); //  рисую график
         myGLCD.setColor(0,255,0);               // устанавливаем  цвет текста красный зеленый синий             
         myGLCD.drawPixel (Xtaim[b], Ytemp[b]); //  рисую график
         }

         
          myGLCD.setColor(30,30,30);                  // устанавливаем белый блеклый цвет текста красный зеленый синий
          myGLCD.drawLine( 31 , 168, 316, 168 );      // Рисуем координату давления 730
          myGLCD.drawLine( 31 , 138, 316, 138 );      // Рисуем координату давления 740
          myGLCD.drawLine( 31 , 108, 316, 108 );      // Рисуем координату давления 750
          myGLCD.drawLine( 31 , 78, 316, 78 );        // Рисуем координату давления 760

          myGLCD.drawLine( 244 , 53, 244, 197 );      // Рисуем координату времени
          myGLCD.drawLine( 172 , 53, 172, 197 );      // Рисуем координату времени
          myGLCD.drawLine( 100 , 53, 100, 197 );      // Рисуем координату времени
          myGLCD.drawLine( 28 , 53, 28, 197 );        // Рисуем координату времени


    
          y = 1;
   }
    else
        {
          y = y + 1;
        }
 //Serial.println(y);
   delay(1000);                                          // Пауза 1С
   

}

 

lavr
Offline
Зарегистрирован: 03.05.2017

https://yadi.sk/d/stAnaZISfHzGuQ

Шрифты для проекта.

Прошу простить за код - я программист от гугла...

lavr
Offline
Зарегистрирован: 03.05.2017

Дисплей подключен посредством делителя 1,5 кОм --- 2,7 кОм

Фоторезистор + резистор 10 кОм

Arduino pro mini

 

Genri5
Offline
Зарегистрирован: 31.05.2016

в

Genri5
Offline
Зарегистрирован: 31.05.2016

 

 

Genri5
Offline
Зарегистрирован: 31.05.2016

А библиотеку <UTFT.h> откуда брали ?

С github.

stojanov
stojanov аватар
Offline
Зарегистрирован: 14.06.2017

 Можете ли вы загрузить схему?

lavr
Offline
Зарегистрирован: 03.05.2017

Схемы нет, но, всё можно понять из скетча. Остальное расскажу - спрашиваете, пока не забыл)

lavr
Offline
Зарегистрирован: 03.05.2017
runaway
Offline
Зарегистрирован: 25.09.2012

Здравствуйте, уважаемые участники! Вопрос к s13. Повторил ваш прибор, всем доволен. Но пытаюсь чуток "полирнуть" дизайн окон на свой вкус. Удалось настроить "под себя" внешний вид титульного окна, одновременно избавившись от четвёртого экрана (текущее напряжение питания): вместо "t = хх.х" написал "хх.х ºС", где в кач-ве символа градусов использовал строчную "о" из tiny font. На мой взгляд получилось красивее, чем исходный вариант. Потом сдвинул температуру в левый нижний угол, а в правом нижнем поместил текущее напряжение питания в формате "х.хх V". Таким образом, четвёртое окно оказалось лишним, и я его закомментировал. И подправил счётчик кликов кнопкой, поставив вместо "4" тройку.

Теперь вопрос. На первом экране хочу убрать десятые и сотые показаний давления. График обзорный, и эти цифры на мой взгляд там совсем ни к чему. Вместо десятых и сотых хочу написать "mmhg" (тайни фонтом, например), а показания температуры дополнить символами "ºС", как на титульном окне. Место есть, всё должно получиться эстетично. Но НЕ МОГУ УБРАТЬ ДРОБНЫЕ ДОЛИ. Подскажите, как это можно сделать, или, если это долго объяснять, просто поправьте скетч. 

Пытался сделать round(), но дробные доли всё равно отображаются:

int Pressure_int;

...

Pressure_int = round(Pressure);

И вывел ее в печать первого окна, вместо Pressure

Но безуспешно - дробные остаются, а вместо семисот с копейками получается двести с копейками... Видимо, тип переменной не подходит... Упёрся. Помогите! ))

runaway
Offline
Зарегистрирован: 25.09.2012

Почти победил дробные доли... Вместо FPrint написал IPrint, и дробные погасли... Теперь бы вместо отбрасывания сделать округление, чтобы уж совсем фэн-шуй...

runaway
Offline
Зарегистрирован: 25.09.2012

Барограф s13.

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

Предложение автору. Намаялся я с этими дисплеями, 5110 которые... Некоторые экземпляры имеют очень узкий диапазон контраста, в котором можно получить ПОЧТИ нормальное изображение - почти чёрные пикселы на почти прозрачном фоне. И такие случаи нередки. В этой связи решил поискать нечто за ту же цену, монохромное, но получше качеством. И - НАШЁЛ!

HX1230, 96 x 68 точек, монохромный, рабочее поле того же размера, что и 5110:

https://aliexpress.ru/item/4000375141482.html?spm=a2g0o.productlist.0.0.39c14ce1c6F5bk&algo_pvid=bd79cd34-eaab-4103-8add-304e6f3e2f21&algo_expid=bd79cd34-eaab-4103-8add-304e6f3e2f21-0&btsid=0b0a0ae215828781315106796eee0f&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

Классные библиотеки к нему: https://github.com/cbm80amiga/HX1230_SPI

Демо классных библиотек: https://www.youtube.com/watch?v=t0gxEAm14D0

Вопрос-предложение автору: нельзя ли адаптировать ваш барограф под этот экран? Дело в том, что этот экран идёт не с контактной резинкой, как 5110, что является слабым местом последнего, а с наглухо припаянным шлейфом, как в дсплеях мобильных телефонов. Т.е. мало того, что в 1230 точек в несколько раз больше, чем в 5110, так там ещё и проблем с полосами и плясок с бубном (придавливание пальцем, протирание спиртом, и т.д.) не предвидится! Сам я навряд ли это дело потяну. Дайте хотя бы пример - кусочек вашего скетча, где что-то выводится на HX1230. Не знаю, может подобные примеры есть в авторском описании этих библиотек... Не хватает мне знаний, что весьма прискорбно... Пытаюсь учиться в свободное время, но информация очень разрозненна и не полна. Как я понимаю, описанием функций этот Павел не заморачивался, просто назвав их интуитивно понятными именами. Но как их правильно оформлять, как к ним обращаться? Напишите пример, пару строк хотя бы, а дальше я уже соображу, по образу и подобию, методом тыка...

И ОГРОМНОЕ спасибо за прибор! ))

Ulliss
Offline
Зарегистрирован: 16.09.2019

runaway пишет:

****. И - НАШЁЛ!

HX1230, 96 x 68 точек, монохромный, рабочее поле того же размера, что и 5110:

Классные библиотеки к нему: https://github.com/cbm80amiga/HX1230_SPI

***

сейчас я вялотекуще собираю метео на этом экране. сейчас застопорился на отключении(энергосбережении). в указанной библиотеке функции есть, но добиться от них результата пока не удается (даже темку создал) http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pomoshch-v-biblioteke-hx1230fb . из дома фотки вариантов экрана сброшу.

runaway
Offline
Зарегистрирован: 25.09.2012

Почитал твою темку. Приветствую тебя, брат по разуму! ))))

Думаю, "отцы по разуму" сказали тебе всё, что смогли! )))) По твоим вопросам и проблемам, чую, стоим мы примерно на одной ступени развития! "Пара минут с перекуром" - библиотеку допилить под себя, ага... 

Мой совет - пробуй, тыкайся... Не сиди... В принципе, такой подход себя оправдывает - у меня получилось, по крайней мере, с выводом высоты на экран, библиотечной функцией... Хотя тоже потыкался будь здоров, пока сообразил, что в примере устройство как bmp объявляется, а в авторском скетче - как dps... Потом, невероятным усилием мозга, изменил заклинание функции вызова высоты - и - О, ЧУДО... ))))

Ulliss
Offline
Зарегистрирован: 16.09.2019

посмотри вариант от ChostLion. он более элегантен, имхо, чем S13

runaway
Offline
Зарегистрирован: 25.09.2012

Да, я видел. Его окна мне тоже понравились. Но сейчас, допиленные, окна s13 тоже вполне себе ничего! Жалко фотки не могу запостить - убил я свой единственный дисплей, в попытках добиться от него взаимности... В смысле - стабильности картинки.

С 1230, если не потухну к его приезду, окошки с13 вообще хороши будут. С таким разрешением можно красиво писать тайни фонтом - ничего слипаться не будет, как иголочкой процарапывать... Главное, чтобы зрения хватило! )) Только мне не вполне понятно, как там с другим разрешением графики рисоваться будут... Пока вопросов больше, чем ответов. 

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

 

runaway
Offline
Зарегистрирован: 25.09.2012

https://mega.nz/#!hQMzRAjS!epxjbCYCMez9Engg4JrsX-QIq0Dz0iiRlrz2-ou8z10

Мой вариант титульного окна s13. "Из того, что было", по мере сил... 

Ulliss
Offline
Зарегистрирован: 16.09.2019

у меня из неоконченного:

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

исправить глюки окна с тенденциями температуры и давления. (что-то я в массивах слаб)

победить энергосбережение.

реализовать меню занесения данных по ветру и широты

все это добить до прогноза по алгоритму Замбретти

ну и сжать это до удобоваримых обьемов. а то сейчас уже 86% памяти  и 69% переменными сьел

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

поскольку я собираю именно портативную для рыбалки и охоты, мне и важна компактность и прогноз. А графики прошлого меня не интересуют.

продвигаюсь медленно. шишек много набиваю.

runaway
Offline
Зарегистрирован: 25.09.2012

Красиво!

Наклейку надо делать на морду... Струйником или лазерником на прозрачном стикере. Наклеить её на фоновую основу, плёнку или бумагу, а полученный пакет - на морду. В фоновом слое - окошко под жки. Как торцы защитить... Если морда круглая, с выступающими краями, типа щитовое исполнение, то здорово получается узким (10 .. 12 мм) скотчем по торцу с усилием обмотать, в один-два слоя, а потом аккуратно паяльным феном гофры разгладить. Скотчевое кольцо-обечайка получается как термоусадка, с U-образным поперечным сечением, без намёка на гофры. Но то всё такое, мелкое очумельство...

Впечатляет! Да, судя по всему, ступени развития у нас всё-таки разные! )) Я тут больше по мелочи пока... Но насчет рыбалки скажу, что там основной прогноз сосредоточен именно в предыдущих трёх сутках - КАК вело себя атм. давление! Если сильно/резко колбасило - рыба перестаёт кормиться! Это правило старое, но оно до сих пор успешно работает. Т.е. здесь нужен именно график давления трёх предыдущих суток.

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

sartoil
Offline
Зарегистрирован: 28.02.2020

Добрый день хочу собрать барометр по вашей схеме на BME280 там нужен модуль часов еще?

и еще у  меня ардуино мини про ее можно поставить?

sartoil
Offline
Зарегистрирован: 28.02.2020

Genri5 пишет:

Вот, что получилось у меня.

А можно схему вашего?

Genri5
Offline
Зарегистрирован: 31.05.2016

Вот скетч:

        #include "U8glib.h"
        #include "rus6x12.h"
        #include "rus5x7.h"
        #include "ds3231.h"
        #include <Wire.h>
        #include "cactus_io_BME280_I2C.h"
         BME280_I2C bme(0x76);

        U8GLIB_PCF8812 u8g(3, 4, 6, 5, 7);
        const uint8_t gradus[] PROGMEM = 
      {
        0x07,        
        0x05,         
        0x07,          
        0x00,         
        0x00,         
        0x00,        
        0x00,         
        0x00 };        

        #define BUFF_MAX 128

        uint8_t time[8];
        char recv[BUFF_MAX];
        unsigned int recv_size = 0;
        unsigned long prev,
        interval = 1000;
     
    void draw(void)
{
       
        char in;
        unsigned long now = millis();
        struct ts t;
        DS3231_get(&t);                       //получаем время

        u8g.setFont(rus5x7);
        u8g.drawStr( 0, 42, "Давление:");      //печатаем показания давления
        u8g.setFont(rus6x12);
        u8g.setPrintPos(54, 42);
        u8g.print(bme.getPressure_mmHq(),1);
        u8g.drawStr( 85, 42, "мм");

        u8g.setFont(rus5x7);
        u8g.drawStr( 0, 52, "Влажность:");      //печатаем показания влажности
        u8g.setFont(rus6x12);
        u8g.setPrintPos(60, 52);
        u8g.print(bme.getHumidity(),1);           
        u8g.drawStr( 90, 52, "%");

        u8g.setFont(rus5x7);
        u8g.drawStr( 0, 62, "Темпера-ра:");      //печатаем показания температуры
        u8g.setFont(rus6x12);
        u8g.setPrintPos(60, 62);                 
        u8g.print(bme.getTemperature_C()-1,1);    
        u8g.drawBitmapP( 81, 54, 1, 8, gradus); // печатаем символ градуса
        u8g.drawStr( 90, 62, "C");

        u8g.setFont(rus6x12);
        u8g.setPrintPos(16, 32);                //печатаем день недели
        printDay(t.wday);
        u8g.setPrintPos(0, 8);                 //печатаем день месяца
        u8g.print(t.mday);
        printMonth(t.mon);                      //печатаем месяц
        u8g.print((t.year)+100);                //печатаем год

        u8g.setFont(u8g_font_unifont);
        if(t.hour<10)                           // печатаем время
{
        u8g.setPrintPos(17, 22);
        u8g.print(t.hour);
}
        else 
{
        u8g.setPrintPos(17, 22);
        u8g.print(t.hour);
}
        u8g.print(":");
        if(t.min<10)
{
        u8g.print("0");
        u8g.print(t.min);
}
        else
{
        u8g.print(t.min);
}
        u8g.print(":");
        if(t.sec<10)
{
        u8g.print("0");
        u8g.print(t.sec);
}
        else 
{
        u8g.print(t.sec);
        if ((in == 10 || in == 13) && (recv_size > 0)) 
{
        parse_cmd(recv, recv_size);
        recv_size = 0;
        recv[0] = 0;
} 
        else if (in < 48 || in > 122){;        // ignore ~[0-9A-Za-z]
}
        else if (recv_size > BUFF_MAX - 2) {   // drop lines that are too long
           
        recv_size = 0;                         // drop
        recv[0] = 0;
}
        else if (recv_size < BUFF_MAX - 2)
{
        recv[recv_size] = in;
        recv[recv_size + 1] = 0;
        recv_size += 1;
}
}
}
    void setup(void)
{
  
        Wire.begin();
        bme.begin();
       
        DS3231_init(DS3231_INTCN);
     // parse_cmd("T004160727112016",16);
     // flip screen, if required
        u8g.setRot180();                        // розворот экрана на 180, если нужно
         
        if ( u8g.getMode() == U8G_MODE_R3G3B2 ) // присвоить значение цвета по умолчанию
{
        u8g.setColorIndex(255);                 //белый
}
        else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
{
        u8g.setColorIndex(3);                   // максимальная интенсивность
}
        else if ( u8g.getMode() == U8G_MODE_BW )
{
        u8g.setColorIndex(1);                   // pixel on
}
        else if ( u8g.getMode() == U8G_MODE_HICOLOR )
{
        u8g.setHiColorByRGB(255,255,255);
}
}
    void loop(void)
{
        bme.readSensor(); 
  
     // picture loop
    
        u8g.firstPage();  
        do
{
        draw();
}
        while( u8g.nextPage() );  // восстановить картинку после задержки
        delay(50);  
}

    void parse_cmd(char *cmd, int cmdsize)
{
        uint8_t i;
        uint8_t reg_val;
        char buff[BUFF_MAX];
        struct ts t;
    
        if (cmd[0] == 84 && cmdsize == 16)
{
       
       // t.sec = inp2toi(cmd, 1);
       // t.min = inp2toi(cmd, 3);
       // t.hour = inp2toi(cmd, 5);
       // t.wday = inp2toi(cmd, 6);
       // t.mday = inp2toi(cmd, 8);
       // t.mon = inp2toi(cmd, 10);
       // t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
      //  DS3231_set(t);
        
}       else if (cmd[0] == 49 && cmdsize == 1) {  // "1" get alarm 1
        DS3231_get_a1(&buff[0], 59);
       
}       else if (cmd[0] == 50 && cmdsize == 1) {  // "2" get alarm 1
        DS3231_get_a2(&buff[0], 59);
        
}       else if (cmd[0] == 51 && cmdsize == 1) {  // "3" get aging register
        
}       else if (cmd[0] == 65 && cmdsize == 9) {  // "A" set alarm 1
        DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
        
        for (i = 0; i < 4; i++) {
        time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
}
        byte flags[5] = { 0, 0, 0, 0, 0 };
        DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
        DS3231_get_a1(&buff[0], 59);
        
}       else if (cmd[0] == 66 && cmdsize == 7) {  // "B" Set Alarm 2
        DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
        
        for (i = 0; i < 4; i++) {
        time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
}
        byte flags[5] = { 0, 0, 0, 0 };
        DS3231_set_a2(time[0], time[1], time[2], flags);
        DS3231_get_a2(&buff[0], 59);
         
}       else if (cmd[0] == 67 && cmdsize == 1) {  // "C" - получить регистр температуры
        
}       else if (cmd[0] == 68 && cmdsize == 1) {  // "D" - сброс состояния регистра флага сигнализаци
        reg_val = DS3231_get_sreg();
        reg_val &= B11111100;
        DS3231_set_sreg(reg_val);
}       else if (cmd[0] == 70 && cmdsize == 1) {  // "F" - custom fct
        reg_val = DS3231_get_addr(0x5);
       
} 
        else if (cmd[0] == 71 && cmdsize == 1) {  // "G" - set aging status register
        DS3231_set_aging(0);
} 
        else if (cmd[0] == 83 && cmdsize == 1) {  // "S" - get status register
}
        else
{
}
}
    void printDay(int wday)
{
        switch(wday)
{
        case 1: u8g.print("Понедельник");break;
        case 2: u8g.print("  Вторник");break;
        case 3: u8g.print("   Среда");break;
        case 4: u8g.print("  Четверг");break;
        case 5: u8g.print("  Пятница");break;
        case 6: u8g.print("  Суббота");break;
        case 7: u8g.print("Воскресенье");break;
        default: u8g.print("Error");break;
} 
}
    void printMonth(int month)
{
        switch(month)
{
        case 1: u8g.print(" Января ");break;
        case 2: u8g.print(" Февраля ");break;
        case 3: u8g.print(" Марта ");break;
        case 4: u8g.print(" Апреля ");break;
        case 5: u8g.print(" Мая ");break;
        case 6: u8g.print(" Июня ");break;
        case 7: u8g.print(" Июля ");break;
        case 8: u8g.print(" Августа ");break;
        case 9: u8g.print(" Сентября ");break;
        case 10: u8g.print(" Октября ");break;
        case 11: u8g.print(" Ноября ");break;
        case 12: u8g.print(" Декабря ");break;
        default: u8g.print(" Error ");break;
} 
}

Как подключить BME280, DS3231 и дисплей понятно из скетча. Собирал на Nano V3. 

sartoil
Offline
Зарегистрирован: 28.02.2020

А можно по подробней схему и библиотеки, там однако ещё модуль часов есть?

Genri5
Offline
Зарегистрирован: 31.05.2016

Когда подготовлю выложу.

sartoil
Offline
Зарегистрирован: 28.02.2020

Спасибо большое жду.

Genri5
Offline
Зарегистрирован: 31.05.2016

Собрал в папочку библиотеки и шрифты. Вопрос, куда выложить?

sartoil
Offline
Зарегистрирован: 28.02.2020

Можно в любое облако.

sartoil
Offline
Зарегистрирован: 28.02.2020

А в этой прошивки есть графики для мониторинга?

runaway
Offline
Зарегистрирован: 25.09.2012

Мужчины, а у меня вопрос возник - зачем измерять комнатную влажность? В смысле - зачем её знать и что с ней делать, какие совершать действия, если, например, она низкая, или наоборот высокая?

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

А вот в бытовом смысле... Полный порожняк получается: влажность в помещении зимой, по крайней мере на основе моих измерений - это, примерно, как воздух в воздушном шарике: маленькая дырочка - и всё возвращается к "стандартным" 30 .. 35 процентам... За считанные минуты. Данные для частного деревянного дома. В бетонной коробке, наверное, влажность повыше будет. Пока работает увлажнитель - на пять процентов больше. От силы. Только выключил - откатывается на исходную буквально за десять минут. В ультразвуковой увлажнитель подходит только дистиллированная вода. Если из-под крана, то через полчаса работы в воздухе появляется уже заметный в луче фонарика туман известковой пыли. Через час - уже и без фонарика видать, просто от освещения. И этой хренью детям надо дышать? Или маски им одевать, пока увлажнитель работает? 

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

Ulliss
Offline
Зарегистрирован: 16.09.2019

runaway пишет:

Мужчины, а у меня вопрос возник - зачем измерять комнатную влажность? В смысле - зачем её знать и что с ней делать, какие совершать действия, если, например, она низкая, или наоборот высокая?

Вопросы риторические больше, ***

 

Так такие же риторические вопросы и про остальные параметры.

Замерз - оделся. Какая разница, какую цифру прибор показывает.

Давление низкое/высокое. И что? На работу можно не идти или заранее таблетку жевать?

Данные параметры - всего лишь информация.  А как ей распоряжаться, каждый решает по своему. Кто-то просто принимает к сведению, а кто-то настраивает другие приборы для поддержания задуманных параметров.

runaway
Offline
Зарегистрирован: 25.09.2012

Не... Температурой можно достаточно эффективно и недорого рулить автоматически. Давление тоже бывает нужно знать, в т.ч. и для того, чтобы правильно жевать таблетки (впрочем, как я понял, для вас на данный момент это не актуально). Кроме того, иногда нужен именно барический график прошедших нескольких суток. Я вам уже писал об этом чуть выше. А вот комнатная влажность, которая, кстати, с влажностью забортной практически никак не связана, если только вы не в шалаше проживаете... Мое сугубо личное мнение! )) Ну да, теплицы-грибницы... В принципе, там гигростат может быть реально востребован...
Да, а как себя ведут Si7021 на улице?

ra6fnq
ra6fnq аватар
Offline
Зарегистрирован: 26.10.2011

Замечательно себя ведёт (HTU-21D)! Уже больше года висит на улице, Ещё жив. Перед ним, ставил DHT22, осенью - зимой умирали.

ra6fnq
ra6fnq аватар
Offline
Зарегистрирован: 26.10.2011

Замечательно себя ведёт (HTU-21D)! Уже больше года висит на улице, Ещё жив. Перед ним, ставил DHT22, осенью - зимой умирали.

Ulliss
Offline
Зарегистрирован: 16.09.2019

runaway пишет:
Не... Температурой можно достаточно эффективно и недорого рулить автоматически. Давление тоже бывает нужно знать, в т.ч. и для того, чтобы правильно жевать таблетки (впрочем, как я понял, для вас на данный момент это не актуально). Кроме того, иногда нужен именно барический график прошедших нескольких суток. Я вам уже писал об этом чуть выше. А вот комнатная влажность, которая, кстати, с влажностью забортной практически никак не связана, если только вы не в шалаше проживаете... Мое сугубо личное мнение! )) Ну да, теплицы-грибницы... В принципе, там гигростат может быть реально востребован... Да, а как себя ведут Si7021 на улице?

как рыбак-любитель со стажем и географ-любитель по образованию =))- не соглашусь по графику давления. Мне достаточно часовой и трех часовой тенденции, чтоб увидеть резкость изменения. А изменение плавное, хоть и большое за более длительный период и рыбам и мне пофиг. Поэтому и согласен, что на вопрос об использовании погодной информации будет масса вариантов ответа. И нет правильных или неправильных ответов. 

runaway
Offline
Зарегистрирован: 25.09.2012

> Замечательно себя ведёт (HTU-21D)! Уже больше года висит на улице, Ещё жив. Перед ним, ставил DHT22, осенью - зимой умирали.

О, спасибо за информацию... DHT (любые) - это шлак, вариант для макеток... Они и в помещении ведут себя примерно так же - самостоятельно выходить из зашкала у них не принято. Это не датчик - так, имитация...

 

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

Сколько людей - столько мнений! )) А я вот заметил, что на поведение подводных лодок нестабильность атмосферного давления обычно влияния практически не оказывает. Хотя, если весна выдалась поздняя - тогда совсем другое дело...

runaway
Offline
Зарегистрирован: 25.09.2012

Всё, разобрался я с 5110 дисплеями... Выяснил ОКОНЧАТЕЛЬНО, в чём была проблема полос, мусора и нестабильного изображения. 

С самого начала было очевидно, что проблема заключается в плохих контактах между "стеклянным" контроллером дисплея и внешними цепями, т.е. медными проводниками. Неясно было только, где КОНКРЕТНО сидит неисправность. Настойчивые эксперименты позволили это, наконец, выяснить. ))

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

1. Отщёлкнуть и снять жестяную рамку вместе с экраном и световодом

2. Зубочисткой извлечь контактную резинку из щели

3. Надеть лобковую лупу, желательно с подсветкой, ибо будет довольно мелко и противно

4. Свежим лезвием безопасной притвы, АККУРАТНО снять четыре фаски вдоль четырёх длинных рёбер бруска контактной резинки, по две с каждой стороны - таким образом, чтобы не затронуть "гребёнку", набранную из токопроводных резиновых пластинок. Срезаем только прозрачный силикон по краям, надавливая режущей кромкой лезвия сразу на всю длину ребра резинового бруска. Как результат получаем /П\ образные в поперечном сечении контактные торцы резинового бруска, с обеих его сторон - и со стороны контактов печатной платы, и со стороны стекляшки. До обряда обрезания, оба торца, в поперечном своём сечении, имели форму |П|, и вот эти самые | | как раз и мешали нормальному контакту токопроводных эластичных пластин с контактными площадками - и со стороны стекла, и со стороны печатной платы.

5. Собрать всё в обратном порядке

6. Всем радоваться

Спасибо за внимание!

sartoil
Offline
Зарегистрирован: 28.02.2020

GhostLion пишет:

Пришел модуль BME280. Переделал скетч под него и еще добавил дни недели на главный экран. Сделал печатную плату и корпус из акрила на стойках уже готов. Осталось спаять.

Добрый день, подскжите чем питаете схему любой батареей от сотика, или определенный вольтаж нужен чтобы показывало правельный заряд?

Ulliss
Offline
Зарегистрирован: 16.09.2019

На плате там зарядник виднеется под дисплеем. TP4056. Скорей всего аккум на 3.7v.

sartoil
Offline
Зарегистрирован: 28.02.2020

Тоже думаю 3.7 хотя ардуинка от 5 питается.

sartoil
Offline
Зарегистрирован: 28.02.2020

GhostLion пишет:

Исправил пару ошибок в коде. Изменил метод опроса датчика BME280. Сделал установку дня недели.

Здравствуйте почему то с этой версии Meteostation Copyright by GhostLion v1.9 и 2.0 не запускается скетч, с 1.8 все работает подскажите ?

MIK22
Offline
Зарегистрирован: 09.02.2017

Мой вариант от S13. Оставил два окна. График на трое суток. Работает полтора года, никаких проблем.

sabbufer
Offline
Зарегистрирован: 12.07.2017

MIK22. Можно Ваш вариант барометра,желательно поподробнее,

со схемой,скетчем и библиотеками. Какой индикатор использовали.

Jevega
Jevega аватар
Offline
Зарегистрирован: 27.12.2016

Обращение к Lavr (557) Всё получилось великолепно! За исключением лишь сообщения:
"Скетч использует 26230 байт (85%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1567 байт (76%) динамической памяти, оставляя 481 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно."
У меня А-Нано и дисплей 2.4. И ещё, не знаю, может быть с датчиками проблемы(хотя и покупал у разных продавцов) - BME280 в наглую показывает стабильно 742 мм/р.ст.

lavr
Offline
Зарегистрирован: 03.05.2017

У меня ардуино про мини, при компиляции было такое же сообщение. Который месяц работает стабильно и без косяков. Я пытался оптимизировать код, но...я же программист от гугла - не хватает опыта.

По поводу BME280 ничего сказать не могу - у меня работает. Попробуйте посмотреть в мониторе порта, есть ли изменения.

Еще.

Измените концовку скетча - картинка будет симпотишней!

int b;
         for (b = 0; b < 284; b = b + 1) 
         {
         myGLCD.setColor(0,60,0);               // устанавливаем  цвет текста красный зеленый синий             
         myGLCD.drawLine (Xtaim[b], Ytemp[b],Xtaim[b], 197); //  рисую график
         }
    

         
          myGLCD.setColor(30,30,30);                  // устанавливаем белый блеклый цвет текста красный зеленый синий
          myGLCD.drawLine( 31 , 168, 316, 168 );      // Рисуем координату давления 730
          myGLCD.drawLine( 31 , 138, 316, 138 );      // Рисуем координату давления 740
          myGLCD.drawLine( 31 , 108, 316, 108 );      // Рисуем координату давления 750
          myGLCD.drawLine( 31 , 78, 316, 78 );        // Рисуем координату давления 760

          myGLCD.drawLine( 244 , 53, 244, 197 );      // Рисуем координату времени
          myGLCD.drawLine( 172 , 53, 172, 197 );      // Рисуем координату времени
          myGLCD.drawLine( 100 , 53, 100, 197 );      // Рисуем координату времени
          myGLCD.drawLine( 28 , 53, 28, 197 );        // Рисуем координату времени

           int z;
         for (z = 0; z < 284; z = z + 1) 
         {         
         myGLCD.setColor(0,255,0);               // устанавливаем  цвет текста красный зеленый синий             
         myGLCD.drawPixel (Xtaim[z], Ytemp[z]); //  рисую график
         }


    
          y = 1;
   }
    else

Покажете итог ?