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

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

Доброго времени суток. Только 10.0 и всё отображается с десятыми.

temp1 = temp/10.0;

Точка, с запятой не идёт.

Спасибо.

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015
  
  temp1 = temp/10.0;
  
Доброго времени суток. Так заработало как надо. 
Спасибо за помощь.
Андрей1963
Андрей1963 аватар
Offline
Зарегистрирован: 24.01.2015

Вникнуть пока некогда. Первое впечатление - как то сумбурно..... неупорядочно написано. А не удаляйте ..... Поправте всё что нужно и выложите снова (если не пропадёт интерес).

Андрей1963
Андрей1963 аватар
Offline
Зарегистрирован: 24.01.2015

Я своё уже не хочу переделывать

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015


    #include <SPI.h>
   #include <Adafruit_GFX.h>
   #include <Adafruit_PCD8544.h>
   #include <BMP085.h> 
   #include <Wire.h>
   #include <avr/sleep.h>
   #include <avr/wdt.h>
   #include <EEPROM.h>
   #define CNT 1           //  количество циклов по 8 секунд от работы до работы (180)
   int count1 = 0 ;          //  переменная для счётчика циклов по 8 сек
   volatile boolean wdt_tripped=1;
   ////////////  активизируем дисплей  //////////////////
   Adafruit_PCD8544 display = Adafruit_PCD8544(4, 10, 9, 7, 8);
   /////////// активизируем датчик давления ////////////
   BMP085 dps = BMP085();     // Модель Digital Pressure Sensor - BMP085
   float temp1 = 0 ;
   float Press  = 0 ;        //  переменная  давление
   byte PressEP    ;       //  высота столбца в памяти
   byte addressP = 0;      //  адрес записи высоты столбца 
   int adresP      ;       //  адрес считывания высоты столбца 
   byte cycle = 0  ;       //  колличество столбцов в графике
   int adrP = 59 ;         //  место столбца графика
   int cons = 0 ;          //  константа высоты столбца
   const int analogInPin = A0;  // Analog input pin 
   float sensorValue = 0;        
   float outputValue = 0;        
   long  temp = 0, Pressure = 0; // переменная для получения данных с датчика давления
void setup()
{
   wdt_disable();          //  активация пробуждения 
   wdt_reset();            //  по сторожевому таймеру
   wdt_enable(WDTO_2S);    //  каждые 8 сек (меньше - для настройки)             
   Wire.begin();
  Wire.begin();            //  
   dps.init(MODE_ULTRA_HIGHRES, 1400, true); 
   display.begin();        //  старт дисплея
   delay(500); 
   display.setContrast(39);
   display.clearDisplay();
   Serial.begin(9600); 
   adresP = addressP ;     //  начальный адрес чтения - текущий адрес записи
}

void loop()
{
  sensorValue = analogRead(analogInPin);            
  outputValue = float(analogRead(analogInPin))/310;
  // 1023 аналог / 3,3V =310
  // просыпаемся смотрим сколько циклов по 8 сек. спали
   wdt_interrupt_mode(); 
   if (wdt_tripped ==1) 
 {
   count1++;
   wdt_tripped = 0; 
   if (count1 == CNT)                   //  если уже "пора" 
   {  
  /////////////  устанавливаем константу величины столбца в зависимости от текущего давления /////////////////
  //  794(770 - 780);784(760 - 770); 774(750 - 760); 764(740 - 750); 
    dps.getPressure(&Pressure); // получаем данные о давлении
  dps.getTemperature(&temp);  //получаем данные о температуре
  temp1 = temp/10.0;
  Press = Pressure/133.3;
  if ( Press < 780)
  {cons = 794;}
  if ( Press < 770)
  {cons = 784;}
  if (Press < 760)
  {cons = 774;}
  if (Press < 750)
  {cons = 764;}
 
  Serial.print ("pressure:");
  Serial.println(Press);
  delay(100);
  
  /////////////  пишем высоту столбца в EEPROM /////////////////////////////
   
   EEPROM.write(addressP,(cons - Press)*2);  // от константы отнимаем текущее давление , вписываем 10мм давления  в (48 - 28) величину столбца, 1мм давления-2пикселя
                                            
   grafik();                                //  рисуем график       
   addressP = addressP + 1;                 //  устанавливаем следующий адрес  
   if (addressP >= 60)                      //  адреса 0 - 60
   {addressP = 0;}
   count1 = 0;      
 }
 }
    //   и снова "баюшки"
    sleepNow();
}
                     //////  ФУНКЦИИ  //////

/////////////////  рисуем график  ////////////////////////
  void grafik()
  { 
    display.clearDisplay();                //  очищаем дисплей
    Pressing();                            //  рисуем текущее давление и все надписи
    display.setTextColor(BLACK);
    adresP = addressP ;                    //  начальный адрес чтения - текущий адрес записи
    for (cycle = 0; cycle <60; cycle ++)   //  60 циклов вывода линий на дисплей
    { 
    stolb();
    }
    display.display();
    delay(100);
  }
//////////////  текущее давление и все надписи на дисплей //////////////
  void Pressing()
 {  
   display.clearDisplay();
   display.setTextSize(2);             // покрупнее
   display.setTextColor(BLACK);
   display.setCursor(0,0);
   display.print(Press,1);             // давление 
   display.println("мм");
   display.setTextSize(1);
   display.setCursor(0,17);
   display.print("t=");
   display.print(temp1,1);
   //display.print("бат=");
   display.print("*C ");
   display.print(outputValue,1);
   display.println("V");
   display.setCursor(60,21);
   display.println("_");   
   ////////////  пределы отображения давления  ////////////
   display.setCursor(66,27);
   if (cons == 794)
   {display.println("780");}        
   if (cons == 784)
   {display.println("770");}
   if (cons == 774)
   {display.println("760");}
   if (cons == 764)
   {display.println("750");}
   //display.setCursor(63,34);
   //display.println("-");
   display.setCursor(60,41);
   if (cons == 794)
   {display.println("_770");}
   if (cons == 784)
   {display.println("_760");}
   if (cons == 774)
   {display.println("_750");}
   if (cons == 764)
   {display.println("_740");}
 
   display.display();
 }
 //////////////// прорисовка одного столбца  ///////
 void stolb()
 { 
   PressEP = EEPROM.read(adresP);                     //  читаем из памяти высоту столбца
   display.drawLine (adrP, PressEP, adrP,48, BLACK);  // рисуем столбец (PressEP вместо 48 - получим одну линию)

   adrP = adrP - 1;                                   // устанавливаем место следующего столбца
   if (adrP < 0)                                      // следим за местом
   {adrP = 59 ; }                                     // при переходе через начало ставим в конец
   adresP = adresP - 1 ;                              // устанавливаем следующий адрес памяти
   if (adresP < 0)                                    //  следим за адресом
   {adresP = 59 ;}   
 }

 ///////////  здесь мы просто просыпаемся
   void wdt_interrupt_mode() 
   {
   wdt_reset();
   WDTCSR |= _BV(WDIE);                 // Restore WDT interrupt mode
   }
   ISR(WDT_vect) 
   {
   wdt_tripped=1;                       // set global volatile variable
   }

/////////////  а здесь засыпаем 
   void sleepNow()   
{
   _SFR_BYTE(ADCSRA) &= ~_BV(ADEN);
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // Здесь устанавливается режим сна
   sleep_enable();                        // Включаем sleep-бит в регистре mcucr. Теперь возможен слип 
   _SFR_BYTE(ADCSRA) |= _BV(ADEN);
   sleep_mode();                          // Здесь устройство перейдет в режим сна!!!
}

Код рабочий.

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

Доброго времени Андрей. Так код изначально Ваш. Пост #49, soznik мне помогал, спасибо ему за то.

soznik
Offline
Зарегистрирован: 20.09.2015

Алексей Вы наверное не поняли здесь разговор шел о другой версии проекта на дисплее 128х64 монохромном размером 3,2"

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

Да и еще Алексей я смотрю у вас собранно на АТмеге и стоит кварц . Если кварц на 8 Мгц то можно изменить  FUSE биты и сделать на внутреннем генераторе ( я так думаю).

soznik
Offline
Зарегистрирован: 20.09.2015

Вот он добавил комменарии и датчик температуры DS18B20  получилось 101% 

Пришлось поменять библиотеку на датчик давления сейчас занято 96% .

  #include <U8glib.h>
   #include <Adafruit_BMP085.h>
   #include <Wire.h>
   #include <EEPROM.h>
   #include "DHT.h"
   #include <DallasTemperature.h>    
   #include <OneWire.h> 
   U8GLIB_ST7920_128X64 u8g(6, 5, 4, U8G_PIN_NONE);
   // SCK(6)-E(6), MOSI(5)-R/W(5),CS(4)-RS(4),
   #define tempDAL 10    //DS18B20 назначаем вход для датчика,в данном случае 10 
   OneWire oneWire(tempDAL);             
   DallasTemperature sensors(&oneWire); 
   Adafruit_BMP085 bmp;  // Pressure Sensor - BMP085
   DHT dht(7, DHT11);        //Датчик влажности DHT11 - вывод 7
   float Press  = 0 ;        //  переменная  давление
   byte PressEP    ;       //  высота столбца в памяти
   byte PressEP1    ;       //  высота столбца в памяти 1
   byte addressP = 0;      //  адрес записи высоты столбца 
   byte addressP1 = 100;      //  адрес записи высоты столбца 1
   int adresP      ;       //  адрес считывания высоты столбца 
   int adresP1      ;       //  адрес считывания высоты столбца 1
   byte cycle = 0  ;       //  колличество столбцов в графике
   byte cycle1 = 0  ;       //  колличество столбцов в графике  1
   int adrP = 99 ;          //  место столбца графика
   int adrP1 = 199 ;         //  место столбца графика 1
   int cons = 0 ;          //  константа высоты столбца
   const int analogInPin = A0;  // Вход вольтметра
   float h ;        // влажность с DHT
   float tempD ;         // температура с DALLAS
   const int analogInPin1 = A1;  // Вход фоторезистора
   unsigned long tim ;
   unsigned long loopTime; // время таймера давления
   unsigned long BatTime;  // время таймера инд. BATT
   float outputVolt = 0;    
   long  temp = 0, Pressure = 0; // переменная для получения данных с датчика давления
   int regim=1;
   int analog=0;

  void setup()
{
   analogWrite(9, 133); // шим яркость LCD 9 pin  
   tim = millis();
   Wire.begin();            //  
   sensors.begin();   // запуск датчика OneWire
   bmp.begin();
   dht.begin();        // старт датчика влажности
   u8g.begin();        //  старт дисплея
   Serial.begin(9600); 
   u8g.setRot180();   //  переворачиваем дисплей если надо
   adresP = addressP ;     //  начальный адрес чтения - текущий адрес записи
   adresP1 = addressP1 ;     //  начальный адрес чтения - текущий адрес записи
 }
  void loop()
  {
    analog=analogRead(16);//считываем сигнал с пина АЦП  кнопки  (А2)

    if(analog<100)//если кнопка 1 нажата   
     { 
       regim=1; 
                }
    if(analog>700&&analog<800)//если кнопка 2 нажата   
     { 
       regim=2; 
                }
    if(analog>800&&analog<900)//если кнопка 3 нажата   
     { 
       regim=3; 
                }
   int val = analogRead(analogInPin1);   
   val= constrain(val,33 ,888);      
   analogWrite(9, val/4);  //    шим яркость LCD 9 pin  
   outputVolt = float(analogRead(analogInPin))/204,6; // 1023 аналог / 5V =204,6
   sensors.requestTemperatures();    //запрос на чтение значений всех датчиков  повешинных на Arduino. в этом случае только один DS18B20 
   tempD=sensors.getTempCByIndex(0); 
   h = dht.readHumidity();       // получаем данные
  
   //Press =  Press = bmp.readPressure()/133.3;
   Press = Press = bmp.readPressure()/133.3-0.6;  // здесь вводим корректировку датчика BMP085
                                   // если есть метеостанция рядом.
    /////////////  устанавливаем константу величины столбца в зависимости от текущего давления /////////////////
  //  776(770 - 780);766(760 - 770); 756(750 - 760); 746(740 - 750); 
 
  if ( Press < 770)
  {cons = 776;}
  if ( Press < 760)
  {cons = 766;}
  if (Press < 750)
  {cons = 756;}
  if (Press < 740)
  {cons = 746;}
    /////////////  Включаем таймер /////////////////////////////
   tim = millis();
   if(tim >= (loopTime + 864000)) //  864 сек. для 100 столбцов в сутки
   {
   loopTime = tim;  
 
  /////////////  пишем высоту столбца в EEPROM /////////////////////////////
   
   EEPROM.write(addressP,((767 - Press)*2));  // от константы отнимаем текущее давление и *2 пикселя на мм, 
                                            
   addressP = addressP + 1;                 //  устанавливаем следующий адрес  
   if (addressP >= 100)                      //  адреса 0 - 100
   {addressP = 0;}
    EEPROM.write(addressP1,(cons - Press)*4);  // от константы отнимаем текущее давление , 
                                            
   addressP1 = addressP1 + 1;                 //  устанавливаем следующий адрес  
   if (addressP1 >= 200)                      //  адреса 100 - 200
   {addressP1 = 100;}
 }
 /////////////////  выводим всё на дисплей  ////////////////////////
  if(regim==1)//первый режим
   {
    u8g.firstPage();
  do {
    u8g.drawStr(0,63,"1");
    Pressing();  //  общая информация

  } while( u8g.nextPage() );
  }
   if(regim==2)//второй режим график на всю высоту дисплея без переключения диапазона
    { 
       u8g.firstPage();
  do {
   u8g.drawStr(0,63,"2");
   grafik();  // в  void grafik() уже прописан  stolb();

  } while( u8g.nextPage() );
  }
  
   if(regim==3)//третий режим график  с переключением диапазона измерения
    {  
       u8g.firstPage();
  do {
    u8g.setFont(u8g_font_timR08);
   {u8g.drawStr(0,63,"3");}
    grafik1(); 
   }while( u8g.nextPage() );
   }
  }
             //////  ФУНКЦИИ  //////

/////////////////  рисуем графики  ////////////////////////
  void grafik()     // на всю высоту дисплея без переключения диапазона
  {
    u8g.setFont(u8g_font_timR08); 
    u8g.drawStr(1,7,"<------24 HOUR------>"); 
    u8g.setPrintPos(103, ((767 - Press)*2)+3); // устанавливаем позицию показания давления
    u8g.print(Press,1);
 
   { u8g.drawStr(0,35,". . . . . . . . . . . . . . . . . . . . ."); }   //  рисуем осевую 750 mm/Hg
       adresP = addressP ;                    //  начальный адрес чтения - текущий адрес записи
    for (cycle = 0; cycle <100; cycle ++)    //  100 циклов вывода линий на дисплей
    { 
    stolb();
    }  
  }
   void grafik1()   //  рисуем  всё с переключением диапазона
  { 
     
    u8g.setFont(u8g_font_timR14);  
    u8g.setPrintPos(0, 13);
    u8g.print(Press,1);
    u8g.setFont(u8g_font_timR08);
    u8g.drawStr( 46, 13, "MM");
    u8g.drawStr(1,23,"<------24 HOUR------>");
    
    u8g.drawRFrame(89,0,35,15,3);
  
    u8g.setPrintPos(93,11);
       u8g.print(outputVolt,1);  
    u8g.drawStr( 111, 11, "V");
    u8g.drawBox(124, 5, 2, 5);

   ////////////  пределы отображения давления  ////////////
   u8g.setFont(u8g_font_timR10);
   {u8g.drawStr(100,21,"_");}
   if (cons == 776)
   {u8g.drawStr(104,35," 770");}        
   if (cons == 766)
   {u8g.drawStr(104,35," 760");}
   if (cons == 756)
   {u8g.drawStr(104,35," 750");}
   if (cons == 746)
   {u8g.drawStr(104,35," 740");}
   //display.setCursor(63,34);
   //display.println("-");
   
   if (cons == 776)
   {u8g.drawStr(100,61,"_760");}
   if (cons == 766)
   {u8g.drawStr(100,61,"_750");}
   if (cons == 756)
   {u8g.drawStr(100,61,"_740");}
   if (cons == 746)
   {u8g.drawStr(100,61,"_730");}              
     adresP1 = addressP1 ;                     //  начальный адрес чтения - текущий адрес записи
    for (cycle1 = 0; cycle1 <100; cycle1 ++)   //  100 циклов вывода линий на дисплей
    {
     stolb1();
    } 
    }  

 
  void Pressing()    //  рисуем текущее давление и все надписи
 {  
    u8g.setFont(u8g_font_timR14);
    u8g.setPrintPos(0, 13);
    u8g.print(Press,1);
    u8g.setFont(u8g_font_timR08);
    u8g.drawStr( 46, 13, "MM/Hg");
    
    
    u8g.drawRFrame(88,0,35,15,3);
  if ( outputVolt >3.8) 
    { u8g.drawStr(93,11,"BARO");} 
 
  if
    (outputVolt <3.8 &&  tim >= (BatTime + 2000)  ) 
  {  // u8g.setPrintPos(93,11);
     // u8g.print(outputVolt);  
     u8g.drawStr(93,11,"BATT");}
  if
   (tim >=(BatTime + 3000))
   { BatTime = tim; }        
   u8g.setFont(u8g_font_timR14);
   u8g.drawStr( 0, 31, "t="); 
   u8g.setPrintPos(23,31);
   u8g.print(tempD,1);
   u8g.drawRFrame(58,18,4,4,1);  // значок градуса
   u8g.drawStr(66,31,"C"); 
   u8g.drawStr( 0, 51, "H=");
   u8g.setPrintPos(35,51);
   
   u8g.print((float) h-0,0);   //  h-0  можно ввести корректировку датчика или привыкнуть к текущим
   u8g.drawStr(66, 51, "%");
   u8g.setFont(u8g_font_timR08);
  }
 //////////////// прорисовка одного столбца  ///////
 void stolb()                // на всю высоту дисплея
 { 
   PressEP = EEPROM.read(adresP);                     //  читаем из памяти высоту столбца
   u8g.drawPixel( adrP, PressEP);                     // линия 
   //u8g.drawLine (adrP, PressEP, adrP ,63);          // рисуем столбец 
   //u8g.drawLine (adrP, PressEP, adrP ,PressEP+1);   // линия толщиной 2 пикселя
   adrP = adrP - 1;                                   // устанавливаем место следующего столбца
   if (adrP < 0)                                      // следим за местом
   {adrP = 99 ; }                                     // при переходе через начало ставим в конец
   adresP = adresP - 1 ;                              // устанавливаем следующий адрес памяти
   if (adresP < 0)                                    //  следим за адресом
   {adresP = 99 ;}   
 }
   void stolb1()      // с переключением диапазона измерения
 { 
   PressEP1 = EEPROM.read(adresP1);                      //  читаем из памяти высоту столбца
   u8g.drawLine (adrP1-100, PressEP1, adrP1-100 ,63);            // рисуем столбец 

   adrP1 = (adrP1 - 1);                                  // устанавливаем место следующего столбца
   if (adrP1 < 100)                                      // следим за местом
   {adrP1 = 199 ; }                                      // при переходе через начало ставим в конец
   adresP1 = adresP1 - 1 ;                               // устанавливаем следующий адрес памяти
   if (adresP1 < 100)                                    //  следим за адресом
   {adresP1 = 199 ;}   
 }

Помогите освободить немного памяти под анемометр. (непропадать же вертушке на крыше)

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

Простите я на nokia 5110 застрял. 

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

 Да у меня питание 3,3 , кварц на 8М соответственно. Я не очень на внутренний генератор надеюсь. На фото макетка, а так платка своего изготовления, потому и подключение дисплея своё. Попытаюсь С° вставить.

soznik
Offline
Зарегистрирован: 20.09.2015

Алексей как вы написали значек градуса здесь на клавиатуре его нет.

А программе прийдется наверно рисовать пикселями или линиями в библиотеке его то-же нет.

 display.drawPixel(80,8,BLACK) ;

 display.drawPixel(81,9,BLACK) ; и.т.д

или drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),

окружность типа display.drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);  у меня не идет. 

 

 
aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

Доброго времени суток. Не поделитесь скетчем на этот дисплей.

TFT 1,8

С уважением Алексей.

ValSerg
Offline
Зарегистрирован: 22.11.2015

А я все "мусолю" скеч автора темы (Sergey_Ch), восновном упрощая его но и немного модернизируя... "Все гениальное - ПРОСТО!!!", правило, которым я руководствуюсь часто. В барометре, обычном бытовом барометре (не альтиметре), даже нет особой нужды созерцать показания в абсолютной величине. Ибо давление, не воспринимается человеком например так, как температура. Основная цель- иметь график его изменения за последние сутки - двое, из чего делается заключение о тенденции вероятного изменения погоды и самочувствия... Конечно, не будет лишним показать и текущее, особенно имея на "борту" такие возможности.

Основные изменения ПО на текущий момент - отсутствие кнопок, показаний напряжения АКБ (так как борометр домашний, стационарный), диапазон измерения выбран оптимальным (740-780mm Hg), базовая (нулевая) линия графика проходит по значению 760mm Hg, что соотв. нормальному АД, исходя из этого, на мой взгляд, шкала справа оказалась не эффективной (не нужной), за счет чего диапазон полезного для графика места был немного расширен, восприятие на мой взгляд, более удобное. 

  В планах - текущие показания должны менять сное положение, если закрываются графиком, переход на OLED который еще не пришел из КНДР..

Слева: предыдущий вариант (интервал сутки), справа: новый вариант (полтора суток, время еще не прошло)

/*********************************
Проект "Барограф"

диапазон 740-780mm Hg базовая линия по центру (760mm Hg.)
без шкалы (с расширенным интервалос времени)

mmHg    Pa
720    95992
740    98658
760   101325
780   103991
800   106658
                            Pmin  Pmax
РЕЖИМ ИЗМ:(740-780 ммHg = 98658 -103991 Pa)

************* Подключение дисплея Nokia 5110 к Arduino ProMini **************
// 1 - VCC------------------------------ +3.3v от Vcc Arduino ProMicro
// 2 - GND------------------------------ GND Arduino ProMicro
// 3 - SCE (LCD chip select (CS)-------- pin 7 Arduino ProMicro
// 4 - RST------------------------------ pin 8 Arduino ProMicro
// 5 - D/C (Data/Command select)-------- pin 6 Arduino ProMicro 
// 6 - DN<MOSI> (Serial data out (DIN)-- pin 5 Arduino ProMicro
// 7 - SCLK (Serial clock out (SCLK)---- pin 4 Arduino ProMicro
// 8 - LED-------------------------------GND Arduino ProMicro

************** Подключение датчика BMP085 к Arduino ProMicro *****************
// 1 - VCC----- VCC +3.3v Arduino ProMicro
// 2 - SDA--- SDA pin 2 Arduino ProMicro
// 3 - SCL--- SCL pin 3 Arduino ProMicro
// 4 - XCLR------------- не используется
// 5 - EDC-------------- не используется 
// 6 - GND----------------- к общему GND
*****************************************************************************/

#include <Wire.h>              // библиотека шины получения и передачи данных
#include <BMP085.h>            // библиотека для работы с датчиком давления BMP085
#include <Adafruit_GFX.h>      // библиотека для работы дисплея Nokia5110
#include <Adafruit_PCD8544.h>
#include <TimeHelpers.h>       // библиотека для работы с периодами времени

//Инициализируем дисплей на указанных пинах ArduinoUNO
Adafruit_PCD8544 display = Adafruit_PCD8544(4, 5, 6, 7, 8);

BMP085 dps = BMP085();     // Модель Digital Pressure Sensor - BMP085

long Pressure = 0; // переменная для получения данных с датчика давления
long Pmax = 0; // переменная для установки максимального значения давления
long Pmin = 0; // переменная для установки минимального значения давления
int cycle = 0; // Значение переменной - шаг изменения при выполнении цикла for
int y = 0;     // Значение переменной Y – y координата дисплея
int z = 24;    // координата z – строка дисплея по оси y для
               // привязки линии от значения давления к нулевому уровню (760mm Hg)


/*-------------- Настройка времени работы циклов измерения давления --------------------------*/

#define Diagram_interval _SEC_(1542)  // переодичность вывода данных на дисплей (86400сек/84=1028 (24часа) )    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


// объявляем переменные у0 - у83
 int y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14, y15, 
y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27, y28, y29, y30, y31,
y32, y33, y34, y35, y36, y37, y38, y39, y40, y41, y42, y43, y44, y45, y46, y47,
y48, y49, y50, y51, y52, y53, y54, y55, y56, y57, y58, y59, y60, y61, y62, y63,
y64, y65, y66, y67, y68, y69, y70, y71, y72, y73, y74, y75, y76, y77, y78, y79, 
y80, y81, y82, y83;


long  v0=101400,  v1=101400, v2=101400, v3=101400, v4=101400, v5=101400, v6=101400,v7=101400,
v8=101400, v9=101400, v10=101400, v11=101400, v12=101400, v13=101400, v14=101400, v15=101400, 
v16=101400, v17=101400, v18=101400, v19=101400, v20=101400, v21=101400, v22=101400, v23=101400,
v24=101400, v25=101400, v26=101400, v27=101400, v28=101400, v29=101400, v30=101400, v31=101400,
v32=101400, v33=101400, v34=101400, v35=101400, v36=101400, v37=101400, v38=101400, v39=101400,
v40=101400, v41=101400, v42=101400, v43=101400, v44=101400, v45=101400, v46=101400, v47=101400,
v48=101400, v49=101400, v50=101400, v51=101400, v52=101400, v53=101400, v54=101400, v55=101400,
v56=101400, v57=101400, v58=101400, v59=101400, v60=101400, v61=101400, v62=101400, v63=101400,
v64=101400, v65=101400, v66=101400, v67=101400, v68=101400, v69=101400, v70=101400, v71=101400,
v72=101400, v73=101400, v74=101400, v75=101400, v76=101400, v77=101400, v78=101400, v79=101400,
v80=101400, v81=101400, v82=101400, v83=101400;


void setup ()
{
  Wire.begin();       // старт шины данных
  display.begin();    // старт дисплея
  delay(500);         // время на инициализацию датчика и дисплея
 
  dps.init(MODE_ULTRA_HIGHRES, 500, true); 
  /*
  значение 2700 см = 27 метров - истинная высота Энергодара над уровнем моря,                           !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  давление будет рассчитываться на основе этой величины. 
  Примечание: используйте функцию zeroCal после инициализации датчика.
  dps.zeroCal (101800, 0); // Установить нулевую точку
  */
    
  display.setContrast(60);  // регулировка контраста изображения
  display.clearDisplay();   // Очистка экрана и буфера дисплея
  
}


void loop() 

{
  
Diagram(); // Выполняем подпрограмму построения графика давления

// выполняем подпрограмму периодичного измерения давления Meterage()
// с переодичностью, установленной в коде для переменной Diagram_interval (сек).

DO_EVERY(Diagram_interval,

  {
   Meterage();
  }
  );
 
} // завершаем цикл void loop



//==============================================================//
//------- ПОДПРОГРАММА ПЕРИОДИЧНОСТИ ИЗМЕРЕНИЙ ДАВЛЕНИЯ --------//
//==============================================================//
void Meterage ()
{
dps.getPressure(&Pressure); // получаем данные о давлении
delay (50);

// последовательно изменяем значение давления « v » на предыдущее при каждом цикле замера
v83 = v82; v82 = v81; v81 = v80;
v80 = v79; v79 = v78; v78 = v77; v77 = v76; v76 = v75; v75 = v74; v74 = v73; v73 = v72; v72 = v71; v71 = v70;
v70 = v69; v69 = v68; v68 = v67; v67 = v66; v66 = v65; v65 = v64; v64 = v63; v63 = v62; v62 = v61; v61 = v60;
v60 = v59; v59 = v58; v58 = v57; v57 = v56; v56 = v55; v55 = v54; v54 = v53; v53 = v52; v52 = v51; v51 = v50;
v50 = v49; v49 = v48; v48 = v47; v47 = v46; v46 = v45; v45 = v44; v44 = v43; v43 = v42; v42 = v41; v41 = v40;
v40 = v39; v39 = v38; v38 = v37; v37 = v36; v36 = v35; v35 = v34; v34 = v33; v33 = v32; v32 = v31; v31 = v30;
v30 = v29; v29 = v28; v28 = v27; v27 = v26; v26 = v25; v25 = v24; v24 = v23; v23 = v22; v22 = v21; v21 = v20; 
v20 = v19; v19= v18; v18 = v17; v17 = v16; v16 = v15; v15 = v14; v14 = v13; v13 = v12; v12 = v11; v11 = v10; 
v10 = v9; v9 = v8; v8 = v7; v7 = v6; v6 = v5; v5 = v4; v4 = v3; v3 = v2; v2 = v1; v1 = v0; v0 = Pressure;

} // закрываем void meterage ()


//==============================================================//
//-------- ПОДПРОГРАММА ОТОБРАЖЕНИЯ ГРАНИЦ ИЗМЕРЕНИЙ -----------//
//==============================================================//

void Draw_Bord_val ()
{
// В зависимости от выбранных пределлов границ измерений рисуем отметки значений давления
int Bord_val_min = (Pmin/133.3)-700;
int Bord_val_max= (Pmax/133.3)-700;
} // закрываем void Draw_Bord_val ()


//==============================================================//
//--------------- ПОДПРОГРАММА ПОСТРОЕНИЯ ГРАФИКА --------------//
//==============================================================//
void Diagram()
{
  dps.getPressure(&Pressure); // получаем данные о давлении
  delay (50);
  
 /********* Оформляем экран ***********/
    display.setTextSize(1);   //размер шрифта (минимальный - 1)
    display.setTextColor(BLACK);
    
// устанавливаем значение мин и мах давление отображаемое на графике                             !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

{
  Pmin = 98658; Pmax = 103991; 
}

Draw_Bord_val (); //рисуем отметки значений давления

 /*************** Рисуем значение текущего давления ********************/  
    display.setCursor(0,0);
    display.print (Pressure/133.3); // выводим текущее атм. давление переведя его в мм Рт.Ст.
    display.print ("Hg");
    
/**************** Готовим данные для вывода на график ********************/

//Значение Y (высоту линий графика 0-48) приводим пропорционально к параметрам измеряемого давления
// формируем массив из 84-х значений данных, которые будут выводиться на дисплей
int arrayDraw [84] =
{ 
y0 = map(v0, Pmin, Pmax, 48, 1),
y1 = map(v1, Pmin, Pmax, 48, 1), 
y2 = map(v2, Pmin, Pmax, 48, 1), 
y3 = map(v3, Pmin, Pmax, 48, 1),
y4 = map(v4, Pmin, Pmax, 48, 1), 
y5 = map(v5, Pmin, Pmax, 48, 1), 
y6 = map(v6, Pmin, Pmax, 48, 1), 
y7 = map(v7, Pmin, Pmax, 48, 1), 
y8 = map(v8, Pmin, Pmax, 48, 1), 
y9 = map(v9, Pmin, Pmax, 48, 1), 
y10 = map(v10, Pmin, Pmax, 48, 1), 
y11 = map(v11, Pmin, Pmax, 48, 1), 
y12 = map(v12, Pmin, Pmax, 48, 1), 
y13 = map(v13, Pmin, Pmax, 48, 1), 
y14 = map(v14, Pmin, Pmax, 48, 1), 
y15 = map(v15, Pmin, Pmax, 48, 1), 
y16 = map(v16, Pmin, Pmax, 48, 1), 
y17 = map(v17, Pmin, Pmax, 48, 1), 
y18 = map(v18, Pmin, Pmax, 48, 1), 
y19 = map(v19, Pmin, Pmax, 48, 1), 
y20 = map(v20, Pmin, Pmax, 48, 1),
y21 = map(v21, Pmin, Pmax, 48, 1), 
y22 = map(v22, Pmin, Pmax, 48, 1), 
y23 = map(v23, Pmin, Pmax, 48, 1), 
y24 = map(v24, Pmin, Pmax, 48, 1), 
y25 = map(v25, Pmin, Pmax, 48, 1), 
y26 = map(v26, Pmin, Pmax, 48, 1), 
y27 = map(v27, Pmin, Pmax, 48, 1), 
y28 = map(v28, Pmin, Pmax, 48, 1), 
y29 = map(v29, Pmin, Pmax, 48, 1), 
y30 = map(v30, Pmin, Pmax, 48, 1),
y31 = map(v31, Pmin, Pmax, 48, 1),
y32 = map(v32, Pmin, Pmax, 48, 1),
y33 = map(v33, Pmin, Pmax, 48, 1),
y34 = map(v34, Pmin, Pmax, 48, 1),
y35 = map(v35, Pmin, Pmax, 48, 1),
y36 = map(v36, Pmin, Pmax, 48, 1),
y37 = map(v37, Pmin, Pmax, 48, 1),
y38 = map(v38, Pmin, Pmax, 48, 1),
y39 = map(v39, Pmin, Pmax, 48, 1),
y40 = map(v40, Pmin, Pmax, 48, 1),
y41 = map(v41, Pmin, Pmax, 48, 1),
y42 = map(v42, Pmin, Pmax, 48, 1),
y43 = map(v43, Pmin, Pmax, 48, 1),
y44 = map(v44, Pmin, Pmax, 48, 1),
y45 = map(v45, Pmin, Pmax, 48, 1),
y46 = map(v46, Pmin, Pmax, 48, 1),
y47 = map(v47, Pmin, Pmax, 48, 1),
y48 = map(v48, Pmin, Pmax, 48, 1),
y49 = map(v49, Pmin, Pmax, 48, 1),
y50 = map(v50, Pmin, Pmax, 48, 1),
y51 = map(v51, Pmin, Pmax, 48, 1),
y52 = map(v52, Pmin, Pmax, 48, 1),
y53 = map(v53, Pmin, Pmax, 48, 1),
y54 = map(v54, Pmin, Pmax, 48, 1),
y55 = map(v55, Pmin, Pmax, 48, 1),
y56 = map(v56, Pmin, Pmax, 48, 1),
y57 = map(v57, Pmin, Pmax, 48, 1),
y58 = map(v58, Pmin, Pmax, 48, 1),
y59 = map(v59, Pmin, Pmax, 48, 1),
y60 = map(v60, Pmin, Pmax, 48, 1),
y61 = map(v61, Pmin, Pmax, 48, 1),
y62 = map(v62, Pmin, Pmax, 48, 1),
y63 = map(v63, Pmin, Pmax, 48, 1),
y64 = map(v64, Pmin, Pmax, 48, 1),
y65 = map(v65, Pmin, Pmax, 48, 1),
y66 = map(v66, Pmin, Pmax, 48, 1),
y67 = map(v67, Pmin, Pmax, 48, 1),
y68 = map(v68, Pmin, Pmax, 48, 1),
y69 = map(v69, Pmin, Pmax, 48, 1),
y70 = map(v70, Pmin, Pmax, 48, 1),
y71 = map(v71, Pmin, Pmax, 48, 1),
y72 = map(v72, Pmin, Pmax, 48, 1),
y73 = map(v73, Pmin, Pmax, 48, 1),
y74 = map(v74, Pmin, Pmax, 48, 1),
y75 = map(v75, Pmin, Pmax, 48, 1),
y76 = map(v76, Pmin, Pmax, 48, 1),
y77 = map(v77, Pmin, Pmax, 48, 1),
y78 = map(v78, Pmin, Pmax, 48, 1),
y79 = map(v79, Pmin, Pmax, 48, 1),
y80 = map(v80, Pmin, Pmax, 48, 1),
y81 = map(v81, Pmin, Pmax, 48, 1),
y82 = map(v82, Pmin, Pmax, 48, 1),
y83 = map(v83, Pmin, Pmax, 48, 1),};

/**************** Рисуем график ********************/
for (cycle = 0; cycle <84; cycle ++) // 84 цикл вывода 84-ой линии на дисплей
   {
    // рисуем линии на позициях от х=83 до х=0 справа налево с значениями, полученными из массива
    // с номерами согласно циклу от 0 до 83, значениями, равными от=у0 до у=83)
    display.drawLine (83-cycle, arrayDraw [cycle], 83-cycle, z, BLACK);    
    } 

display.display(); // все нарисованное выводим на экран дисплея

if (cycle >83)  // Если значение циклов cycle достигло значения больше 83 (экран дисплея заполнен)
  {
   cycle = 0;
/* номер цикла приобретает значение = 0, начинаем убирать значение с позиции по х=0
на его месте размещаем значение с поз.1, на его - с поз.2 и так далее.
Самое свежее значение выводится на позиции 83, остальные сдвигаются на 1 влево. Самое старое
значение, полученное 84 цикл назад, удаляется безвозвратно. */
  }

display.clearDisplay(); // очищаем дисплей

} // завершаем подпрограмму void Diagram()
/*********************************************************/

 

aruinoVit
Offline
Зарегистрирован: 22.11.2015

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

/* Вариант не окончательный(DS1302 переодически глючит)
   Главное отличие от предыдущих введена автоматическая установка на графике "min" и "max" и середина(ибо в первом варианте при смене диапазона графика писал брехню)
   Время цикла и колличество циклов установлены для настройки (CNT 24, 1s) 
   Для работы(Цикл - 8сек. Кол-во - 360 (изменения - 1раз в 48 минут)). 
   (360 циклов - 60столбцов - 48 часа - на дисплее пределы отображения графика) 
   Почистить .... Убрать всё лишнее.... Перестать читать форум и тырить чужие коды.... 
 */

#include "DHT.h"
#define DHTPIN 10     // what pin we're connected to

// I assume you know how to connect the DS1302.
// DS1302:  CE pin    -> Arduino Digital 2
//          I/O pin   -> Arduino Digital 8
//          SCLK pin  -> Arduino Digital 9
#include <DS1302.h>

   #include <Adafruit_GFX.h>
   #include <Adafruit_PCD8544.h>
  #include <Adafruit_BMP085.h>
   #include <Wire.h>
   #include <avr/sleep.h>
   #include <avr/wdt.h>
   #include <EEPROM.h>
   #define CNT 360             //  количество циклов по 8 секунд от работы до работы
 
#define DHTTYPE DHT21   // DHT 21 (AM2301) 
 
 static unsigned char PROGMEM logo8_Che_bmp[] =
{ B110001, 
  B010001, 
  B010001, 
  B011111, 
  B000001, 
  B000001, 
  B000001};//Буква Че! Где найти русскую библиотеку под Adafruit_PCD8544.h???Писать самому влом, проще экран покупать с русскими шрифтами
  
 //Хотел вывести картинку - чего то зависала ардуино при засыпании, хотя в принципе работает
// static unsigned char PROGMEM lcd_image_mas[]=
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xf
 
   int count1 = 0 ;          //  переменная для счётчика циклов по 8 сек
   volatile boolean wdt_tripped=1;
   ////////////  активизируем дисплей  //////////////////
   Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
   /////////// активизируем датчик давления ////////////
   Adafruit_BMP085 bmp;
   float Press  = 0 ;        //  переменная  давление
   float temp1=0,h=0,tempH = 0 ;
   byte PressEP,PressEPformat,Pmin,Pmax  ;       //  высота столбца в памяти давления
     byte PressET,PressETformat,Tmin,Tmax  ;       //  высота столбца в памяти температуры
      byte PressEH,PressEHformat,Hmin,Hmax  ;       //  высота столбца в памяти влажности
   byte addressP = 0,addressT = 70,addressH = 140;      //  адрес записи высоты столбца 
   int adresP,adresT,adresH      ;       //  адрес считывания высоты столбца 
   byte cycle = 0,cycle1 = 0 ,cycle2 = 0   ;       //  колличество столбцов в графике
   int adrP = 59,adrT = 129,adrH = 199 ;         //  место столбца графика
   int cons = 700 ;          //  константа высоты столбца
   int consT = 1 ;
    int consH = 1 ;
 //long  temp = 0; // переменная для получения данных с датчика давления
 // const int analogInPin = A0;  // Analog input pin 
  // float sensorValue = 0;        
  // float outputValue = 0;   
DHT dht(DHTPIN, DHTTYPE); 

// Init the DS1302
DS1302 rtc(2, 8, 9);//rst,dat,clk
Time t;

void setup()
{
   wdt_disable();          //  активация пробуждения 
   wdt_reset();            //  по сторожевому таймеру
   wdt_enable(WDTO_8S);    //  каждые 8 сек (меньше - для настройки)             
   Wire.begin();
   bmp.begin();            //  
   
   display.begin();        //  старт дисплея
   delay(500); 
   display.setContrast(50);
   display.clearDisplay();
   Serial.begin(9600); 
adresP = addressP ;     //  начальный адрес чтения - текущий адрес записи давления
       PressEP=50; Pmin=50;Pmax=30;
   
dht.begin();
adresT = addressT ;     //  начальный адрес чтения - текущий адрес записи температуры
       PressET=40; Tmin=40;Tmax=10;
       
adresH = addressH ;     //  начальный адрес чтения - текущий адрес записи влажности
       PressEH=70; Hmin=70;Hmax=100;
}

void loop()
{
  //sensorValue = analogRead(analogInPin);            
  //outputValue = float(analogRead(analogInPin))/204,6;
  // просыпаемся смотрим сколько циклов по 8 сек. спали
   wdt_interrupt_mode(); 
   if (wdt_tripped ==1) 
 {
   count1++;
   wdt_tripped = 0; 
   if (count1 == CNT)                   //  если уже "пора" 
   {  
  /////////////  устанавливаем константу величины столбца в зависимости от текущего давления /////////////////
  Press = bmp.readPressure()/133.3;
  temp1=bmp.readTemperature();
  h = dht.readHumidity();
  tempH = dht.readTemperature(); 
  delay(100);
 /////////////  пишем высоту столбца давления в EEPROM /////////////////////////////
   
   EEPROM.write(addressP,(Press-cons));  // от текущего давления отнимаем константу, вписываем давления  в величину столбца 48, 1мм давления-постоянно меняется
  
   grafik();                                //  рисуем график       
   addressP = addressP + 1;                 //  устанавливаем следующий адрес  
   if (addressP >= 60)                      //  адреса 0 - 60
   {addressP = 0;}
  count1 = 0;      
 }
else  if (count1 == CNT/12) { display.clearDisplay();                //  очищаем дисплейи выводим текущее значение
      tekuschee_znach();
   }
 
     else  if (count1 == CNT/2) { 
 
  /////////////  пишем высоту столбца температуры в EEPROM /////////////////////////////
   
  temp1=bmp.readTemperature();
  delay(100);
  
   EEPROM.write(addressT,(temp1-consT));  //от текущей температуры отнимаем константу, вписываем давления  в величину столбца 48, 1мм давления-постоянно меняется
    
    grafik_temp();                                //  рисуем график       
   addressT = addressT + 1;                 //  устанавливаем следующий адрес  
   if (addressT >= 130)                      //  адреса 70 - 130
   {addressT = 70;}
   //count1 = 0;      
                              } 
   else  if (count1 == CNT/4) { 
   /////////////  пишем высоту столбца влажности в EEPROM /////////////////////////////
   h = dht.readHumidity();
  delay(100);
  
   EEPROM.write(addressH,(h-consH));  // от текущей влажности отнимаем константу, вписываем давления  в величину столбца 48, 1мм давления-постоянно меняется
    grafik_HUM();                                //  рисуем график       
   addressH = addressH + 1;                 //  устанавливаем следующий адрес  
   if (addressH >= 200)                      //  адреса 140 - 200
   {addressH = 140;}
   //count1 = 0;      
                              } 
  
  else  if (count1 == CNT/6) { 
    testdrawroundrect();//заставка))ну скорее место под нее
                              }
                              
//  else  if (count1 == CNT/3) { 
//      display.clearDisplay(); 
//      //display.setCursor(0,0);
//   display.setTextColor(BLACK);
//  //  display.drawBitmap(0, 0, lcd_image_mas, 32, 32,1);// картинка не пошла 
//      
//     display.display(); 
//                              }                             
                             
// else  if (count1 == CNT/3) { //если хотим выводить в конкретное время то так, тогда контроллер работает токо 5 раз из 360
//   DHTdraw(); значения
//   //VREMJA(); или время    что то одно из 2 строк
//                               } 

//либо выводим каждые 8 секунд в зависимости от четности CNT
//ну и в последний момент добавил таки графики изредка - все равно уже режима сна толком не получается 

   else  if (count1%5==0) {  //каждый 5-й счетчик еще добавил другое изображение того же самого, сюда можно прописать вывод например вольтажа как у кого то было
    DHTdraw();
                               }  
    else  if (count1%7==0) {  //каждый 7-й счетчик еще добавил график давления
   grafik();
                               } 
    else  if (count1%8==0) {  //каждый 8-й счетчик еще добавил график температуры 
    grafik_temp();
                               } 
    else  if (count1%9==0) {  //каждый 9-й счетчик еще добавил график влажности
    grafik_HUM();
                               }                            
 else  if (count1%2==0) {
 VREMJA();
 //delay(2000);}
 } 
else  if (count1%2!=0){
tekuschee_znach();
} 
}
//Serial.println(10);проверял как цикл работает! А как в ардуино сделать точку останова для проверки констант и данных???Или какие другие компиляторы использовать?
   //display.display();
 //
  //};
    //   и снова "баюшки" - доверяю первоисточнику(чо он там деает я не проверял)
  //delay(2000);
    sleepNow();
}
                     //////  ФУНКЦИИ  БЫдлокодера с повторениями ибо влом писать одну но с параметрами//////
                     //почти все осталось как прежде но добавилась автоподгонка шкалы графика под значения с датчиков

/////////////////  рисуем график давления как было ////////////////////////
  void grafik()
  { 
    display.clearDisplay();                //  очищаем дисплей
    Pressing();                            //  рисуем текущее давление и все надписи
    display.setTextColor(BLACK);
   adresP = addressP ;                    //  начальный адрес чтения - текущий адрес записи
    for (cycle = 0; cycle <60; cycle ++)   //  60 циклов вывода линий на дисплей
    { 
  //////////////// прорисовка одного столбца  ///////      
 
      PressEP = EEPROM.read(adresP);                     //  читаем из памяти высоту столбца
      if (PressEP>Pmax){Pmax=PressEP;};
      if (PressEP-3<Pmin){Pmin=PressEP-3;};// -3 чтобы график не лежал на дне в неменяющуюся погоду или при тестах(опускал датчик давления в пакет, надувал воздуха и смотрел чо будет)
      
      PressEPformat=map(PressEP, Pmin,Pmax,48,8);
   display.drawLine (adrP, PressEPformat, adrP,48, BLACK);  // рисуем столбец (PressEP вместо 48 - получим одну линию)
   adrP = adrP - 1;                                   // устанавливаем место следующего столбца
   if (adrP < 0)                                      // следим за местом
   {adrP = 59 ; }                                     // при переходе через начало ставим в конец
   adresP = adresP - 1 ;                              // устанавливаем следующий адрес памяти
   if (adresP < 0)                                    //  следим за адресом
   {adresP = 59 ;}   
    }
    
    display.display();
    delay(100);
  }
                  /////////////////  рисуем график  температуры немножко по другому////////////////////////
  void grafik_temp()
  { 
    display.clearDisplay();                //  очищаем дисплей
    //Pressing();                            //  рисуем текущее давление и все надписи
     display.clearDisplay();
   display.setTextSize(1);             // покрупнее бы - но 2 уже много, а 1.5 увы нет
  display.setTextColor(BLACK);
   display.setCursor(0,0);
   display.print("<-48 aca->  ");//ну или 72 часа если 540 циклов, мне показалось раз в час "маловато будет", новый год все таки))
   display.setTextSize(1);
   display.print(char(167));
       display.println("C");
   display.drawBitmap(21, 0,  logo8_Che_bmp, 8, 8, 1);
   display.setCursor(65,1);
   display.println("_");   
   ////////////  пределы отображения давления  ////////////
   //т.к. температура не бывает в нашем климате ваше 100 град то можно график еще увеличить на ширину 1 буквы, но тогда надо под память выделить больше(оставлял 10 про запас)
   display.setCursor(71,8);
  //display.print("0"); 
  display.println(Tmax);
   display.setCursor(65,21);
   display.println("_");   
   ////////////  пределы отображения середины давления  ////////////
   display.setCursor(71,27);
   //display.print("0");
   display.println((Tmin+Tmax)/2);

   display.setCursor(65,41);
   display.print("_"); display.println(Tmin);

 display.setCursor(63,11);
   display.println(".");
   display.setCursor(63,31);
   display.println(".");
   
   display.setCursor(64,11);
   display.println(".");
   display.setCursor(64,31);
   display.println("."); 
    display.display();  
 
    ////////////////////////////////////////////////////////////////////////
    display.setTextColor(BLACK);
    adresT = addressT ;                    //  начальный адрес чтения - текущий адрес записи
    for (cycle1 = 70; cycle1 <130; cycle1 ++)   //  60 циклов вывода линий на дисплей
    { 
 //////////////// прорисовка одного столбца  ///////      
      PressET = EEPROM.read(adresT);                     //  читаем из памяти высоту столбца
      if (PressET>Tmax){Tmax=PressET;};
      if (PressET-1<Tmin){Tmin=PressET-1;};
      
      PressETformat=map(PressET, Tmin,Tmax,48,8);
 // на нокии ничерта толком не видно для пенсионеров если рисовать в 1 линию, на другом экране я бы сделал именно линией   
   //display.drawLine (adrT-70, PressETformat, adrT-70,48, BLACK);  // рисуем столбец (PressEP вместо 48 - получим одну линию)
   display.drawLine (adrT-70, PressETformat, adrT-70,48, BLACK);
     //display.drawLine (adrT-70, 8, adrT-70,PressETformat+2, BLACK);  // рисуем столбец (PressEP вместо 48 - получим одну линию)
//display.drawLine (adrP, PressEPformat, adrP,48, BLACK);  // рисуем столбец (PressEP вместо 48 - получим одну линию)
   adrT = adrT - 1;                                   // устанавливаем место следующего столбца
   if (adrT < 70)                                      // следим за местом
   {adrT = 129 ; }                                     // при переходе через начало ставим в конец
   adresT = adresT - 1 ;                              // устанавливаем следующий адрес памяти
   if (adresT < 70)                                    //  следим за адресом
   {adresT = 129 ;}   
    }
    
    display.display();
    delay(100);
//       Serial.print(PressETformat);  Serial.println("PressETformat");
  }
  
  void grafik_HUM()
  { 
    display.clearDisplay();                //  очищаем дисплей
    //Pressing();                            //  рисуем текущее давление и все надписи
     display.clearDisplay();
   display.setTextSize(1);             // покрупнее
  display.setTextColor(BLACK);
   display.setCursor(0,0);
   display.print("<-48 aca->");
        display.println("%Hum");
   display.drawBitmap(21, 0,  logo8_Che_bmp, 8, 8, 1);
   display.setCursor(60,1);
   display.println("_");   
   ////////////  пределы отображения давления  ////////////
   display.setCursor(66,8);
  //display.print("0"); 
  display.println(Hmax);
   display.setCursor(60,21);
   display.println("_");   
   ////////////  пределы отображения середины давления  ////////////
   display.setCursor(66,27);
   //display.print("0");
   display.println((Hmin+Hmax)/2);

   display.setCursor(60,41);
   display.print("_"); display.println(Hmin);

 display.setCursor(58,11);
   display.println(".");
   display.setCursor(58,31);
   display.println(".");
   
   display.setCursor(59,11);
   display.println(".");
   display.setCursor(59,31);
   display.println("."); 
    display.display();  
 
    ////////////////////////////////////////////////////////////////////////
    display.setTextColor(BLACK);
    adresH = addressH ;                    //  начальный адрес чтения - текущий адрес записи
    for (cycle2 = 140; cycle2 <200; cycle2 ++)   //  60 циклов вывода линий на дисплей
    { 
 //////////////// прорисовка одного столбца  ///////      
      PressEH = EEPROM.read(adresH);                     //  читаем из памяти высоту столбца
     // if (PressEH>Hmax){Hmax=PressEH;};
      if (PressEH<Hmin){Hmin=PressEH;};
      
      PressEHformat=map(PressEH, Hmin,Hmax,48,8);
 //максимум влажности принял в 100% и рисовал отраженно чтоб различать графики   
   display.drawLine (adrH-140, 8, adrH-140,PressEHformat+2, BLACK);  // рисуем столбец (PressEP вместо 48 - получим одну линию)
     // display.drawLine (adrT-70, 8, adrT-70,PressETformat+2, BLACK);  // рисуем столбец (PressEP вместо 48 - получим одну линию)
//display.drawLine (adrP, PressEPformat, adrP,48, BLACK);  // рисуем столбец (PressEP вместо 48 - получим одну линию)
   adrH = adrH - 1;                                   // устанавливаем место следующего столбца
   if (adrH < 140)                                      // следим за местом
   {adrH = 199 ; }                                     // при переходе через начало ставим в конец
   adresH = adresH - 1 ;                              // устанавливаем следующий адрес памяти
   if (adresH < 140)                                    //  следим за адресом
   {adresH = 199 ;}   
    }
    display.display();
    delay(100);
       
  }
//////////////  текущее давление и все надписи на дисплей //////////////
  void Pressing()
 {  
   display.clearDisplay();
   display.setTextSize(1);             // покрупнее
  display.setTextColor(BLACK);
   display.setCursor(0,0);
   display.println("<-48 aca->mmHg");
   
   display.drawBitmap(21, 0,  logo8_Che_bmp, 8, 8, 1);
    //display.print("bat=");
  // display.print(outputValue,1);
  // display.println("V");
   display.setCursor(60,1);
   display.println("_");   
   ////////////  пределы отображения давления  ////////////
   display.setCursor(66,8);
  display.print("7"); display.println(Pmax);
  
//   
    display.setCursor(60,21);
   display.println("_");   
   ////////////  пределы отображения середины давления  ////////////
   display.setCursor(66,27);
   display.print("7");display.println((Pmin+Pmax)/2);
  
   //display.setCursor(63,34);
   //display.println("-");
   display.setCursor(60,41);
   display.print("_7"); display.println(Pmin);
 
 display.setCursor(58,11);
   display.println(".");
   display.setCursor(58,31);
   display.println(".");
   
   display.setCursor(59,11);
   display.println(".");
   display.setCursor(59,31);
   display.println("."); 
 
   display.display();
 }
/////////////////////////////////////
void tekuschee_znach(void)
{  Press = bmp.readPressure()/133.3;
  temp1=bmp.readTemperature();
  h = dht.readHumidity();
  tempH = dht.readTemperature(); 
  delay(100);
  
  display.clearDisplay();
   display.setTextSize(2);             // покрупнее
   display.setTextColor(BLACK);
   display.setCursor(0,0);
   display.print(Press,1);   // давление 
   display.setTextSize(1);
   display.println("mmHg");
   
   display.setTextSize(2);
   display.setCursor(0,17);
   display.print("t=");
    display.print(temp1,1);
    display.setTextSize(1);
   display.print(char(167));
   display.setTextSize(2);
    display.print("C");
   
    display.setCursor(0,34);
     display.print("B=");
    display.print(h,1);
    display.setTextSize(1);
   //display.print(char(175));
   display.setTextSize(2);
    display.print("%");
  display.display();
};
/////////////////////////////////////
void testdrawroundrect(void) {display.clearDisplay(); 
  for (int16_t i=0; i<display.height()/5-2; i+=2) {
    display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, BLACK);
    display.setTextSize(1);
    display.setCursor(9,21);
     display.println("METEOPRIBOR");//ну как прибор, игрушка-радоконструктор
    display.display();
  }
}

void DHTdraw(void) 
{
 Press = bmp.readPressure()/133.3;
  temp1=bmp.readTemperature();
  h = dht.readHumidity();
  tempH = dht.readTemperature(); 
  delay(100);
  
  t = rtc.getTime();
 display.clearDisplay(); 
 display.setTextSize(1);             // покрупнее
   display.setTextColor(BLACK);
   display.setCursor(0,0);
 // Send Day-of-Week
  display.print(rtc.getDOWStr());
//display.print(" ");
//display.print(rtc.getMonthStr(FORMAT_SHORT));Как FORMAT_SHORT в этой ф-ии влияет на ф-ию VREMJA???Я не понял - пришлось убрать тут
//  display.print("--");  
display.setCursor(54,0);
    // Send date
 // display.print(rtc.getTimeStr());
 // display.print("///");
 
 //display.print(t.hour, DEC);
  display.print(t.hour/10);
display.print(t.hour%10);
 display.print(":");
 //display.print(t.min, DEC);
 display.print(t.min/10);
display.print(t.min%10);
//  Serial.print(" -- "); 
  // Send time
    display.setCursor(10,10);
   display.print(rtc.getDateStr());

   display.setCursor(0,20);
   display.print("T="); //задаем температуру
    display.setCursor(13,20);
  display.print(tempH,1);  //Это температура с DHT22
  //display.setCursor(45,20);
  display.print("/");
  
  //display.setCursor(53,20);
  display.print(temp1,1); //Это температура с барометра
display.print(char(167));
display.println("C");

display.setCursor(0,30);
  display.print("Hum="); // задаем влажность с DHT22
  display.setCursor(28,30);
  display.print(h);
  display.setCursor(63,30);
  display.print("%");

display.setCursor(0,40);
  display.print("Pres="); // задаем атмосферное давление
  display.setCursor(31,40);
  display.print(Press); //рассчет атмосферного давления
  display.setCursor(68,40);
  display.print("mm");
  // Serial.print("  Alt(m):");          кому надо, это текущая высота над уровнем моря
  // Serial.print(Altitude / 100);
  display.display(); // Вывод вместимого буфера на дисплей
}
 ///////////  здесь мы просто просыпаемся
   void wdt_interrupt_mode() 
   {
   wdt_reset();
   WDTCSR |= _BV(WDIE);                 // Restore WDT interrupt mode
   }
   ISR(WDT_vect) 
   {
   wdt_tripped=1;                       // set global volatile variable
   }

/////////////  а здесь засыпаем 
   void sleepNow()   
{
   _SFR_BYTE(ADCSRA) &= ~_BV(ADEN);
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // Здесь устанавливается режим сна
   sleep_enable();                        // Включаем sleep-бит в регистре mcucr. Теперь возможен слип 
   _SFR_BYTE(ADCSRA) |= _BV(ADEN);
   sleep_mode();                          // Здесь устройство перейдет в режим сна!!!
}

   void VREMJA()   
{
   t = rtc.getTime(); 
  display.clearDisplay(); 
 display.setTextSize(2);             // покрупнее
   display.setTextColor(BLACK);
   display.setCursor(12,5);                        
 //display.print(t.hour, DEC);
 display.print(t.hour/10);
display.print(t.hour%10);//чтобы 0 еще выводить перед временем и значение не плыло, можно как ниже
//   if(RTC.minute<10)lcd.print(0); // лидирующий ноль, если нужен
//      lcd.print(RTC.minute);
 display.print("-");
 display.setCursor(49,5); 
 //display.print(t.min, DEC);
display.print(t.min/10);
display.print(t.min%10);

 display.setTextSize(1); 
 display.setCursor(36,2); 
//display.print(t.sec, DEC);

display.print(t.sec/10);
display.print(t.sec%10);

//display.printNumI(int(now.minute()), 50, 0);
 display.setCursor(12,20); 
display.print(rtc.getMonthStr());

display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
 display.setCursor(0,30); 
 display.print("  ");
display.print(rtc.getDOWStr());
display.print("  ");
display.setTextColor(BLACK);
display.setTextSize(1);
display.setCursor(10,40);
display.print(rtc.getDateStr());

//display.setTextColor(WHITE, BLACK); // 'inverted' text
//  display.println(3.141592);
  
display.display(); 
}
//////////  НО ЧИСТИТЬ ВСЁ РАВНО НАДО!!!  /////////
// Кнопку хочется прикрутить меняющую экраны по нажатию! И надо бы реализовать подвод часов - с заспанием не совсем представляю как это сделать

 

tu4kin
Offline
Зарегистрирован: 26.01.2016

ValSerg пишет:

"Все гениальное - ПРОСТО!!!"

//==============================================================//
//------- ПОДПРОГРАММА ПЕРИОДИЧНОСТИ ИЗМЕРЕНИЙ ДАВЛЕНИЯ --------//
//==============================================================//
void Meterage ()
{
dps.getPressure(&Pressure); // получаем данные о давлении
delay (50);

//==============================================================//
//--------------- ПОДПРОГРАММА ПОСТРОЕНИЯ ГРАФИКА --------------//
//==============================================================//
void Diagram()
{
  dps.getPressure(&Pressure); // получаем данные о давлении
  delay (50);
  
 

а с какой целью 2 раза снимать давление с датчика?

soznik
Offline
Зарегистрирован: 20.09.2015

aruinoVit 

Что-то с часами вообще не то (не компилируется).

 

aruinoVit
Offline
Зарегистрирован: 22.11.2015

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

ValSerg пишет:

........переход на OLED который еще не пришел из КНДР..

Круто!

Северные корейцы после термоядерных бомб уже начали OLED дисплеи делать! ;)

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Господа, здравствуйте. Просьба-вопрос от новичка в Ардуино (но не в электронике).

В Ардуино я с неделю всего вникаю. Данный прибор ОЧЕНЬ мне интересен. Попытка залить код в ардуино нано провалилась. Понимаю, что надо подключать библиотеки (я в этом пока разбираюсь плохо). Надергал разных и попытался приаттачить. Результат - окно ардуино айде стало просто черным. После того, как он ругнулся на библеотеки. Перезапуск результата не изменил.

Но это фиг с ним. Разберусь и разорхивирую программу еще раз. Видимо где-то оказались двойными библиотеки.

Не могли кто-нибудь выложить комплектно скетч и библиотеки?

Матчасть - Ардуино нано либо про мини. ЛСД нокии 3310 датчик давления BMP180

soznik
Offline
Зарегистрирован: 20.09.2015

Здесь файлы не приклепляются . Берете любой скетч из ветки .

К примеру мой с поста № 49 из него копируем по одной библиотеке и гуглим.



    #include <SPI.h>

   #include <Adafruit_GFX.h>

   #include <Adafruit_PCD8544.h>

   #include <BMP085.h>

   #include <Wire.h>

   #include <avr/sleep.h>

   #include <avr/wdt.h>

   #include <EEPROM.h>


в этом примере  8 библиотек поштучно ищем.

лучше скачивать в ZIP архиве и в ардуине IDE добавлять 

как добавлять тоже гугл в помощь .

Сам учился полгода назад методом проб и ошибок и был рад любой подсказке.

На ютубе много уроков.

Будут вопросы спрашивай ещё.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Спасибо. Немного понятнее стало. Но засада есть и здесь. Некоторые библиотеки без проблем. Некоторые (Wire.h, avr/sleep.h, avr/wdt.h) только описания. Я понимаю это так, что эти библиотеки модифицируются под конкретные устройства? Если это так, то я приплыл.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Лекс 59 пишет:

Спасибо. Немного понятнее стало. Но засада есть и здесь. Некоторые библиотеки без проблем. Некоторые (Wire.h, avr/sleep.h, avr/wdt.h) только описания. Я понимаю это так, что эти библиотеки модифицируются под конкретные устройства? Если это так, то я приплыл.

avr/sleep.h,   avr/wdt.h их не надо ставить, они уже  в комплекте идут.
Только инклюд написать

Вот тут лежат: arduino-1.6.9\hardware\tools\avr\avr\include\avr

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Прикрутил библиотеку на бародатчик. Скопировал скетч из 49 поста. Результат:

Barograf_1:35: error: invalid digit "8" in octal constant

Barograf_1:37: error: invalid digit "9" in octal constant

Barograf_1:55: error: invalid digit "8" in octal constant

Barograf_1:57: error: invalid digit "9" in octal constant

Barograf_1:75: error: invalid digit "8" in octal constant

Barograf_1:77: error: invalid digit "9" in octal constant

Barograf_1:95: error: invalid digit "8" in octal constant

Barograf_1:97: error: invalid digit "9" in octal constant

Barograf_1:115: error: invalid digit "8" in octal constant

Barograf_1:117: error: invalid digit "9" in octal constant

Barograf_1:135: error: invalid digit "8" in octal constant

Barograf_1:137: error: invalid digit "9" in octal constant

Barograf_1:155: error: invalid digit "8" in octal constant

Barograf_1:157: error: invalid digit "9" in octal constant

Barograf_1:159: error: invalid digit "8" in octal constant

Barograf_1:161: error: invalid digit "8" in octal constant

Barograf_1:163: error: invalid digit "8" in octal constant

Barograf_1:165: error: invalid digit "8" in octal constant

Barograf_1:167: error: invalid digit "8" in octal constant

Barograf_1:169: error: invalid digit "8" in octal constant

Barograf_1:171: error: invalid digit "8" in octal constant

Barograf_1:173: error: invalid digit "8" in octal constant

Barograf_1:175: error: invalid digit "8" in octal constant

Barograf_1:177: error: invalid digit "9" in octal constant

Barograf_1:179: error: invalid digit "9" in octal constant

Barograf_1:181: error: invalid digit "9" in octal constant

Barograf_1:183: error: invalid digit "9" in octal constant

Barograf_1:185: error: invalid digit "9" in octal constant

Barograf_1:187: error: invalid digit "9" in octal constant

Barograf_1:189: error: invalid digit "9" in octal constant

Barograf_1:191: error: invalid digit "9" in octal constant

Barograf_1:193: error: invalid digit "9" in octal constant

Barograf_1:195: error: invalid digit "9" in octal constant

Barograf_1:197: error: invalid digit "9" in octal constant

Barograf_1:1: error: expected unqualified-id before numeric constant

exit status 1
invalid digit "8" in octal constant

Ардуино Нано.

soznik
Offline
Зарегистрирован: 20.09.2015

не понял откуда такаой лог

 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

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

Делал так:

Новое окно. Удаляю содержимое. Копирую скетч из поста. Вставляю а ардуино айде. Заливаю.

Выскакивает это либо подобное сообщение об ошибках.

Возможно что-то делаю неправильно. Но с другими скетчами прокатывало. Например тестер аккумуляторов от Бодрого 2014.

soznik
Offline
Зарегистрирован: 20.09.2015

какя версия ардуины IDE стоит увас 

 

soznik
Offline
Зарегистрирован: 20.09.2015

Когда редактировал это скетч у

меня была версия 1,6,6 сейчас 1,6,8 попробовал не идет ругается на строку

47  dps.init(MODE_ULTRA_HIGHRES, 12000, true); 

пока не пойму или библиотеку не ту поставил || ?

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

arduino-1.6.4 и arduino-1.6.8-windows. Обе компактные версии (без установки).

 

soznik
Offline
Зарегистрирован: 20.09.2015

попробуйте установить полную версию 1.6.6 

на ней у меня работало , а сейчас на версии 1.6.8 все скетчи с BMP-085 ругаются на "dps.init"

 

 

soznik
Offline
Зарегистрирован: 20.09.2015

В облачном сервисе компелируется нормально.

https://codebender.cc/sketch:205188

https://codebender.cc/personallibrary/bmp085#BMP085.h

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

В кодебендере регистрироваться не буду. Я ретроград. Облачных сервисов избегаю.

Спасибо за информацию. Сейчас разорхивируется 1.6.6 и попробую.

soznik
Offline
Зарегистрирован: 20.09.2015

успехов.

 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Оки. Вгрузилось. Благодарю вас. Пробовать буду уже завтра. Сегодня поздновато.

А версия оказалась тоже компактная без установки.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Фигушки. При отсоединении линий данных от ардуино (А4, А5) дисплей показывает цветочек. При подключеном датчике не происходит ничего. Дисплей не реагирует.

Датчик у меня BMP180. Читал, что библиотека подходит от ВМП085. Возможно это не так?

Блин, я уже размечтался о компактном приборчике. На барометры поглядываю давно, но барографе даже и не мечтал. А тут такой приборчик замечательный. И облом сразу. И куда рыть ХЗ. Обидно.

Похоже придется сначала искать способ проверить датчик. Было бы жаль, если мертвый. До меня посылки едут от 2 до 3 месяцев.

И да, я подавал на датчик 5 вольт. Возможно этим и убил. Или не убил. А ведь читал, что у него свой стабилизатор и он 5 вольт не боится.

Подал 3,5 вольта от ардуино на питание - ничего не изменилось. Так же через несколько секунд начинает часто-часто (герц 10) моргать светодиод L  на ардуино и все. Дисплей чистый. Дисплей рабочий 100%. Он у меня отдельным блочком с адаптером на 5 вольтовые устройства.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Жесть. Попытался залить в ардуино другой скетч. С поста 38. Фиг. Ошибки.

Залил блинк, поморгал нормально.

Попытался залить тот же скетч, что получался. С поста 49 - фигушки, снова ошибки.

Перезапустил ардуино айде и переткнул ардуинку, снова попытался - результат прежний.

Что за хрень - какие то программы льются без проблем, какие то только с бубном и случайно. Непонятки.

soznik
Offline
Зарегистрирован: 20.09.2015

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

А цветочик на дисплее в скетче с поста №49 будет гореть долго , чтоб ускорить начало вывода показаний (при настройке ) надо уменьшить значения в строках 21 и 44. еще раз желаю успехов и еще раз внимательней прочитайте всю ветку форума. Расписано всё очень подробно все изменения в программе. Я сам начинал почти-что отсюда.

Бубен в руки и танцуем.

 

Андрей1963
Андрей1963 аватар
Offline
Зарегистрирован: 24.01.2015
Библиотеки  #include <avr/sleep.h>  и  #include <avr/wdt.h>   работают не со всеми версиями загрузчика (bootloader) ардуины.

Пост 185   (Лекс 59) Похоже у ВАС эта проблема с самого начала. Ссылку дать не могу(сам уже забыл где читал). По поисковику - "режим watchdog в ардуино" (режим сна в ардуино) ищем , пробуем работоспособность этого режима в своей дуине(методика проверки описана там же), не работает -  перепрошиваем bootloader на раброчую (с этими библиотеками) версию.

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

В конце концов у меня остался вариант пост109 , 117 с питанием от адаптера квартирного безпроводного телефона (рядом база стоит). Работает со времени поста109 безотказно.

Ещё раз заострю - не пытайтесь сделать всё и сразу. В теме несколько моих конструкций и доработок чужих идей. Не всё получалось сразу....... 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

soznik пишет:

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

Бубен в руки и танцуем.

Похоже датчик не пережил знакомство с 5 вольтами. Жаль. Теперь долго и упорно ждать нового. Китай от меня вот он, рядом, но нет сначала поедет посылка в Москву, и только потом ко мне.

Таким образом, пока откланиваюсь...

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Андрей1963 пишет:

 

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

В конце концов у меня остался вариант пост109 , 117 с питанием от адаптера квартирного безпроводного телефона (рядом база стоит). Работает со времени поста109 безотказно.

За эту информацию спасибо. Думаю пригодится не только мне. Ну а мне сейчас ждать нового датчика. Да еще пока сформирую заказ на то на се, чтобы десять раз не бегать. Этот датчик купил у знакомого, он их выписал два с запасом. Но увы, все по законам Мерфи: "Все что может быть понято неправильно, будет понято неправильно". Так и я не знал про два разных исполнения датчика, как и человек, пост которого я читал. Он говорил про другое исполнение. Что оно не боится и 6 вольт.

Но монитор порта говорит, что датчик признаков жизни не подает. Пробовал примеры из разных библиотек.

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

soznik
Offline
Зарегистрирован: 20.09.2015

Лекс 59 попробуйте еще раз проверить датчик 

У меня все датчики заказаны от разных поставщиков и все  со стабилизаторами. Его на платке отлично видно  в корпусе sot-23. Этот стабилизатор с низким подением напряжения поэтому модуль работает от 3,3 и 5,0 вольт. А вот переполюсовки он боится и то не совсем сгорает а начинает сильно врать.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

soznik пишет:

 Этот стабилизатор с низким подением напряжения поэтому модуль работает от 3,3 и 5,0 вольт. А вот переполюсовки он боится и то не совсем сгорает а начинает сильно врать.

Там действительно есть стабилизатор. Я потому его так спокойно и подключал. И сейчас не понимаю почему в даташите указаны 3,3 вольта. Нафик он тогда нужен стабилизатор? Модуль с 4 выводами. Я только что пробовал его прогонять примерами из трех установленых у меня библиотек на такие датчики. Перепробовал все примеры из каждого. Монитор не откликнулся ни разу.

Часом ранее на этой же ардуино нано я проверил часы 1307. Порты она использует те же. Нормально. Монитор откликается кракозяблами.

Думаю датчик мертв. Возможно мне не повезло изначально. Обидно.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Немного инфы по дисплею 3110. Сегодня подключал его для освоения. Через адаптер. Все норм все работает. Потом смотрю, а первая нога дисплея (Vcc) воткнута в соседнюю дырку на макетной панели. Т.е. плюс 5 вольт не было подключено вобще. А дисплей работает.
Попробовал на втором дисплее - аналогично. Я ХЗ, опасно это для дисплея или нет. Но стоит иметь в виду подобное знание. Что дисплей может показывать, получая питание через порты. На адаптере у меня резистивные делители 1к и 2к и три диода гасят питание.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Получил несколько датчиков BMP180-очень понравились.

Чтоб немного опробовать датчики в деле,

написал простенький барограф (домашнюю метеостанцию)

Кому интересно смотрим видео!

Все материалы выложил в открытый доступ!

 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

bodriy2014 пишет:

написал простенький барограф (домашнюю метеостанцию)

Класс! Особенно понравились объяснения. Как раз для начинающих вроде меня. Все предельно ясно.

Собрал. Увы - датчик мертв. Без него чего-то рисует. С ним ничего не происходит. Ладно, бывают в жизни огорчения.

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

Но сейчас ждать придется.

Понравились комментарии в скетче. Кстати, а как делается хекс? Ну, если объяснение короткое. Если длинное - разыщу сам.

Так, чувствую, что барограф у меня точно будет. Либо один либо другой. Там решу.

Кстати, вы неправы относительно количества бароГРАФОВ в сети. Не замечал такого. Барометров, да, хватает. А толку? Какое давление было вчера? А час назад? В какую сторону оно ползет? Или на месте стоит? Голова трещит потому, что давление меняется, или есть другие причины?

Барограф на порядок интереснее барометра для меня. Да и для всех метеозависимых (я пока, тьфу-тьфу, к ним не отношусь).

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Лекс 59 пишет:

........... Кстати, а как делается хекс? Ну, если объяснение короткое. Если длинное - разыщу сам.

...................

Короткое.

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

Потом просто компилируете и в логах снизу пишется временная папка где сохранился скетч,

пока не закрыли IDE идем туда и берем.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

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

Это можно поправить простыми средствми?

За объяснения по хексу спасибо. Предельно четко и понятно. Повесил себе текст в заметках, пока не набил руку.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Лекс 59 пишет:

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

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

В общем раз этот девайс оказался кому-то еще и интересен сделаю чтоб график просто полз в лево!))

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Доработал скетч.

--построение графиков

--управление подсветкой

вот видео

soznik
Offline
Зарегистрирован: 20.09.2015

bodriy2014

Всё  это хорошо но датчик температуры надо применить отдельный на пример DS18b20

т.к. в ВМР-180 происходт саморазогрев и показания сильно завышаются

в этой ветке форума об этом уже писалось.