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

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

Ну а это мои барографы. Вариант от s13 пока с не полным графиком. Вариант от bodriy2014 имеет период немного длиннее - 27 часов.

Самый наглядный график у s13. Вариант от bodriy2014 , будет наглядно показывать только резкие перепады. Этот вариант  пожалуй попозже, после периода первоначальной обкатки, переделаю под двое суток. Он тогда станет более выпуклым.

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

Пока по назначению их разделяю по прежнему. От s13 мне, от bodriy2014 маме.

Если рассматривать общие возможности приборов, то вариант от s13 наиболее полный. Возможность выбрать график по вкусу, два разных периода отображения, контроль батареи. Хорошее понятное управление без доп. меню и прочего. Просто перебор по очереди.

Посмотрю насколько хватит аккумулятора (800 мач фактическая емкость). Возможно сделаю вариант с аккумулятором как резервным источником, но общее питание от сети.

s13
Offline
Зарегистрирован: 22.05.2016

Ну раз Вам понравился вариант, думаю и родственник доволен будет. 800ма/ч должно хватать дней на 100 если без гашения дисплея, с гашением на 2-3 года если сам быстрее не сядет. Всё же советую небольшую солнечную панельку для подпитки, её достаточно даже в тень просто на подоконник поставить направив на небо и она уже даёт 12-14ма, этого будет достаточно для подзаряда, а если на солнце попадёт, то за день батарею даже севшую набьёт. Ну или разьем для подпитки от зарядного чтобы подключать по мере разряда акка как вариант. Смысл греть зарядник сутками. Может ещё каие мысли по улучшению ? Детали пока не пришли, можно ещё поправить. Параллельно кнопке не забывайте конденсатор ставить на 47n-100n, могут возникать множественные прерывания при выходе из сна и как следствие зависание проца. Ну и блокировочные по питанию меги тоже обязательно.

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

Вариант действительно понравился. Над деталями реализации подумаю. Солнечные панели пока закажешь, пока приедут. Для меня сроки редко менее 2х-3х месяцев. Держать несколько месяцев макетку на подоконнике тоже не вариант.

Охолонусь. Подумаю. Возможно пихну пока в аналогичный корпус. Еще предстоит решить/поэкспериментировать, если с засыпанием и от батареи 4,5, то нужны ли делители на дисплей. Они ведь ограничат нижний предел по напряжению. Ну и т.д.

Я в таких случаях, когда одолевают сомнения, отступаю немного в сторону. А комп на чердаке сам проведет анализ. И через некоторое время я буду четко представлять, что и как.

Это не означает, что я прощаюсь. Просто для себя я уже выбор сделал.

Спасибо Вама за очень интересную работу.

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

Для s13.

Плюнул на свою полукомпетентность в данном вопросе и залил сегодня вашу последнюю версию с гашением дисплея. Вроде гаснет.

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

С питанием пока поставлю литий с контроллером. Квадратную батарейку пока не решился. У нее напруга 4,95. Тогда придется делители на дисплей лепить. А литий, чтобы вместиться в корпус.

А так от лития просто вставлю в цепь питания дисплея 1-2 диода, чтобы немного пригасить напругу. Тем более дисплей большую часть времени будет спать.

Сейчас немного покатаюсь на макетке с этим вариантом. Если все норм, то в корпус.

s13
Offline
Зарегистрирован: 22.05.2016

Если питать от лития, никакие делители и диоды не нужны, всё напрямую. По даташиту Vdd max = 7v. а входные сигналы ещё +0.5v так что и питание от 5 вольт ему не страшно. Только контраст возможно придётся убавить. Год стоит и питается напрямую от лития, причём он всегда полон (4.24) все сигналы тоже напрямую и проблем нет.

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

s13 пишет:

Если питать от лития, никакие делители и диоды не нужны, всё напрямую. По даташиту Vdd max = 7v. а входные сигналы ещё +0.5v так что и питание от 5 вольт ему не страшно. Только контраст возможно придётся убавить. Год стоит и питается напрямую от лития, причём он всегда полон (4.24) все сигналы тоже напрямую и проблем нет.

При моих пробах 5110/3310 тоже работали нормально. Но не слишком долго. По даташиту 5 вольт там кратковременный режим. Неоднократно читал, в том числе у людей, которым доверяю, что иногда дохнут дисплеи напрямую от 5 вольт. Видимо как повезет. Предпочитаю перестраховываться. Привычка конструктора ВПК - все должно быть максимально надежно, максимально долго. И я точно знаю, что года через 2-3 уже, если прибор сдохнет, мне проще будет купить/замутить новый, чем разбираться в старом. Еще нюанс - это сегодня 3310/5110 не проблема. Что будет года через 3-4?

Surikat
Offline
Зарегистрирован: 13.07.2016

уменя вопрос подойдёт датчик bmp280 в замен bmp180?

Sasha21
Offline
Зарегистрирован: 14.09.2016

Попроробуйте такой скетч , режим sleep, dht-11 влажность , bmp180 давление температура , индикатор заряда.

 

#include  <avr/sleep.h>
#include  <avr/wdt.h>
#include <Adafruit_GFX.h>//установить
#include <Adafruit_PCD8544.h>//установить
#include <Wire.h>//уже есть в системе
#include <Adafruit_BMP085.h>//установить
#include <DHT.h>
//пользовательские настройки!!!#########################################
long obnov_press=100; //частота обновления графика давления в секундах
long obnov_temp=100; //частота обновления графика температуры в секундах
long obnov_hid=100;
#define tip_gr_p 0 //тип графика давления 1-столбы,0-линия
#define tip_gr_t 0 //тип графика температуры 1-столбы,0-линия
#define tip_gr_h 0
#define cont 55 //контрастность
#define akb A0 //любой своюодный аналоговый пин для измерения напряжения АКБ 
//пользовательские настройки!!!#########################################
byte mass[84],mass1[84],mass2[84];
byte x_p =0, x_t =0, x_h =0;
float pres;float temp;float hid;

 
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);//подключение дисплея
Adafruit_BMP085 bmp;
// Define pino e tipo do sensor DHT
DHT dht(3, DHT11); 
unsigned long tik_tak =0,tik_press=0,tik_temp=0,tik_hid=0;
unsigned long vr_pr=obnov_press*1000;
unsigned long vr_temp=obnov_temp*1000;
unsigned long vr_hid=obnov_hid*1000;
//////////////////////////////////////////////////

// watchdog interrupt
ISR (WDT_vect) 
{
   wdt_disable();  // disable watchdog
}  // end of WDT_vect

 byte old_ADCSRA ;

void sleep8s(){
  
  ADCSRA = 0;  

  // clear various "reset" flags
  MCUSR = 0;     
  // allow changes, disable reset
  WDTCSR = bit (WDCE) | bit (WDE);
  // set interrupt mode and an interval 
  //WDTCSR = bit (WDIE) | bit (WDP2) | bit (WDP1);    // set WDIE, and 1 second delay
  WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0);   // set WDIE, and 8 second delay
  wdt_reset();  // pat the dog
  
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_enable();
 
  // turn off brown-out enable in software
  MCUCR = bit (BODS) | bit (BODSE);
  MCUCR = bit (BODS); 
  sleep_cpu ();  
  
  // cancel sleep as a precaution
  sleep_disable();
  } 
void lcdmain(){
 // Apaga o buffer e o display
  display.clearDisplay();

  //Температура
  display.drawRoundRect(0,0, 44,24, 3, 2);
  
  display.setCursor(11,3);  // Seta a posição do cursor
  //display.println("TEMP");
  display.println("ТЕМП");   
  display.setCursor(29,14);
  display.drawCircle(31, 15, 1,1);
  display.println(" C");
   // Оновлення значення температури
 // display.fillRect(4,13, 25 , 10, 0);
  display.setCursor(4,14);
  display.println(temp,1); 
 
   
  // Вологість
  display.drawRoundRect(45,0, 39 ,24, 3, 2);
  display.setCursor(50,3);  
  display.println("ВОЛОГ");
  display.setCursor(75,14);
  display.println("%");  
   // Оновлення значення вологості
 // display.fillRect(50,13, 23 , 10, 0);
  display.setCursor(50,14);
  display.println(hid,1); 
 
    
  // Тиск
  display.drawRoundRect(12,25, 72 ,23, 3, 2);
  display.drawRoundRect(0,26, 11 ,22, 3, 2);
  display.drawLine(3,25,7,25,1);
  display.setCursor(35,28); 
 
  display.println("ТИСК");
  display.setCursor(56,38);
  display.println("mm.");
  display.setCursor(72,38);
  display.println("Hg");

  // Оновлення значення тиску
  // display.fillRect(4, 37, 46 , 10, 0);
  display.setCursor(17,38);
  display.println(pres,2); 
  //display.println(analogRead(akb)*6.6/1024);
 
   if (analogRead(akb)*(6.6/1024) >= 4.10 ){
   display.fillRect(1,27,9,25,1); }
   if (analogRead(akb)*(6.6/1024) >= 4.00 ){
   display.fillRect(1,29,9,23,1); }
   if (analogRead(akb)*(6.6/1024) >= 3.90 ){
   display.fillRect(1,31,9,21,1); }
   if (analogRead(akb)*(6.6/1024) >= 3.80 ){
   display.fillRect(1,33,9,19,1); }
   if (analogRead(akb)*(6.6/1024) >= 3.70 ){
   display.fillRect(1,35,9,17,1); }
   if (analogRead(akb)*(6.6/1024) >= 3.60 ){
   display.fillRect(1,37,9,15,1); }
   if (analogRead(akb)*(6.6/1024) >= 3.50 ){
   display.fillRect(1,39,9,13,1); }
   if (analogRead(akb)*(6.6/1024) >= 3.40 ){
   display.fillRect(1,41,9,11,1); }
   if (analogRead(akb)*(5.0/1024) >= 3.30 ){
   display.fillRect(1,43,9,9,1); }
   if (analogRead(akb)*(6.6/1024) >= 3.20 ){
   display.fillRect(1,45,9,7,1); }
   display.display();
}
void pressu(){
 
    if(millis()-tik_tak>1000){//данные оbновляем каждую секунду
    tik_tak=millis();pres=bmp.readPressure()/133.33;
    hid = dht.readHumidity();
    display.clearDisplay();    
    display.drawRoundRect(0,8, 84 ,40, 3, 2); //Рамка
   
    display.setCursor(0,0);display.print("Тиск");
    display.setCursor(30,0);display.print(pres,2);display.print("mm");
    for(byte i=0;i<83;i++){
   
      if(tip_gr_p==0){display.drawPixel(i, 47-mass[i], BLACK);}}
      display.display();} 
    if(millis()-tik_press>vr_pr){
      tik_press=millis();mass[x_p]=pres-725;
      if(x_p<83){x_p++;}
      if(x_p==83){for(byte i=0;i<83;i++){mass[i]=mass[i+1];}}}    
   

}
void temper(){
    if(millis()-tik_tak>1000){//данные оbновляем каждую секунду
    tik_tak=millis();temp=bmp.readTemperature();
    display.clearDisplay();    
    display.drawRoundRect(0,8, 84 ,40, 3, 2); //Рамка
   
    display.setCursor(0,0);display.print("Темп.");
    display.setCursor(34,0);display.print(temp,2);
    display.drawCircle(65,1, 1,1);
    display.print(" С");
    for(byte i=0;i<83;i++){
   
      if(tip_gr_t==0){display.drawPixel(i, 47-mass1[i], BLACK);}}
      display.display();} 
      if(millis()-tik_temp>vr_temp){
      tik_temp=millis();mass1[x_t]=temp;
      if(x_t<83){x_t++;}
      if(x_t==83){for(byte i=0;i<83;i++){mass1[i]=mass1[i+1];}}}    

}
void volog(){
    display.clearDisplay();    
    display.drawRoundRect(0,8, 84 ,40, 3, 2); //Рамка
   
    display.setCursor(0,0);display.print("Волог.");
    display.setCursor(40,0);display.print(hid);display.print(" %");
    for(byte i=0;i<83;i++){
   
      if(tip_gr_h==0){display.drawPixel(i, 47-mass2[i], BLACK);}}
      display.display(); 
      if(millis()-tik_hid>vr_hid){
      tik_hid=millis();mass2[x_h]=hid/2-5;
      if(x_h<83){x_h++;}
      if(x_h==83){for(byte i=0;i<83;i++){mass2[i]=mass2[i+1];}}}
}
void setup(){
  
  old_ADCSRA = ADCSRA;
  bmp.begin();
 
  // Ініциалізация DHT11
  dht.begin(); 
  //pinMode(8,OUTPUT);digitalWrite(8,LOW);   //GND LCD
  //pinMode(7,OUTPUT);digitalWrite(7,HIGH);  //VCC LCD
  display.begin();display.setContrast(cont);
  display.display(); display.setTextSize(1);
  display.setTextColor(BLACK);display.display();
  }
void loop(){ 
 
  ADCSRA = old_ADCSRA;
  lcdmain();
  sleep8s();
  delay(1000);
  pressu();
  sleep8s(); 
  delay(1000);
  temper();
  sleep8s(); 
  delay(1000);
  volog();
  sleep8s();
  delay(1000);

}

 

s13
Offline
Зарегистрирован: 22.05.2016

Работает 280. Здесь новый скетч и исправленная библиотека. Родная с гитхаба не пошла.

Библиотека 280: https://yadi.sk/d/YE2EcgISwa9z5

Скетч:

#include <LCD5110_Graph.h>    //  rinkydinkelectronics.com/library.php
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <LowPower.h>         //  github.com/rocketscream/Low-Power

Adafruit_BMP280 bme; // I2C

// ********** Опции компиляции **************
#define cont 67             // для изменения раскоментировать эту строку (70 по умолчанию)
#define zapolnen            // Заполнение графика 1
//#define gasim_lcd           // если экономим батарейки гашением LCD


long P_win = 165 * 133.3;    // Верхняя граница абс. графика по умолчанию до сдвига (600 + 165) = 765мм

uint32_t Pressure; 
unsigned char sotki ;    // сотые для давления
unsigned char p_count, p2;
long P_Min, P_Max, P_Dt, P_Mid; 
uint16_t P_Mem[217]; //-79980 = 600мм (3 day 20min memory, 72 per 24 hour) 
signed char x, y, last_x, last_y;
// nokia 5110 connect
// pin d3 - Serial clock out (SCLK)
// pin d4 - Serial data out (DIN)
// pin d5 - Data/Command select (D/C)
// pin d6 - LCD reset (RST)
// pin d7 - LCD chip select (CS)

LCD5110 myGLCD(3, 4, 5, 6, 7);


// bmp280 connect
// sda  - a4
// scl  - a5
// csb  - 3v3

// Use pin 2 as wake up pin
const char wakeUpPin = 2; // d2 для кнопки
const char lightPin1 = 11; // d11 подсветка дисплея
const char lightPin2 = 12; // d12 инверсная подсветка дисплея
const char batPin = 0;    // a0 - ан. вход для контроля батареи 220к/51к

char scr_num = 0;          // Номер экрана для отображения
boolean key_pressed = false; // Признак что кнопку жали
boolean Refresh = true;      // Признак что нужно обновить отрисовку (для экономии батарей)
boolean Lcd_On = true;      // Признак что дисплей включен
char light_on = 4;         // длительность подсветки при включении 4*4 = 16с. 

extern unsigned char SmallFont[];  // внешние шрифты
extern unsigned char BigNumbers[];
extern unsigned char TinyFont[];    
unsigned char tik = 0;           // счетчики для времени
unsigned char Count_Minute = 0; 
uint32_t Son_count    = 0;

//******************************** START ***************************************
void setup() {
  
  
  myGLCD.InitLCD();
#if defined (cont)
  myGLCD.setContrast(cont); //регулировка контраста при необходимости
#endif
  myGLCD.setFont(SmallFont);
  Wire.begin();
  myGLCD.print("START BMP280", 5, 15);
  myGLCD.update();
  while (!bme.begin()){}; // ждём запуска датчика

  
  analogReference(INTERNAL); //1.1v internal op.source
  pinMode(batPin,INPUT);     //Вход для контроля батареи
      
  LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);

  pinMode(wakeUpPin, INPUT);  // Configure wake up pin as input.  
  digitalWrite(wakeUpPin, 1); // pullup
  
  pinMode(lightPin1, OUTPUT);// lcd light pin as output;
  pinMode(lightPin2, OUTPUT);// lcd light inv pin as output;
  

  if (bme.begin()) Pressure = bme.readPressure();                 // считать давление


  P_Mid = Pressure - 79980; // (79980 = 600mm) отсекаем лишнее
  P_Mem[p_count] = P_Mid; // заносим в память первое значение давления для правильной работы усреднения

//  Serial.begin(9600);
//  while (!Serial) ; // wait for Arduino Serial Monitor
//  delay(200); 
}



void loop() {          // ***************************************************************************************************************

  // Allow wake up pin to trigger interrupt on low.

if ((Son_count < 5)||((!(Son_count % 5))&&(tik==0))) {    // через 5 минут активности, не заходим в тело по 5 минут


//  Serial.print("S=");Serial.print(Son_count);Serial.print(" %=");Serial.println(Son_count % 5);


  if (bme.begin()) Pressure = bme.readPressure();                 // считать давление
  
 // для экранов с инверсным подсветом использовать lightPin2
  if  (light_on > 0) {
    digitalWrite(lightPin1, 1);digitalWrite(lightPin2, 0);
    light_on--;
  }
  else {digitalWrite(lightPin1, 0);digitalWrite(lightPin2, 1);} // lcd light on/off
  
 


  if (Pressure > 79900){  // 600mm
    P_Mid = (P_Mid + (Pressure - 79980))/2; // усреднение замеров, отбрасываем показания ниже 600мм.(сбоит бывает)
  }
    if (Count_Minute >= 20){ Refresh = true; // каждые 20 мин. запоминаем усредненное значение в память и обновляем графики


 
    if (p_count == 216) {
      for (int i = 0; i < 216; i++) // сдвигаем если буфер полон
      {
        P_Mem[i] = P_Mem[i+1];
      }
    } 
    else {
      p_count++;
    }
    P_Mem[p_count] = P_Mid; 
    if (Pressure > 79980){
      P_Mid = Pressure - 79980; // новый старт усреднения
    }
    Count_Minute = 0;
  }


#if defined (gasim_lcd)
    if ((Son_count < 15)&&(!Lcd_On)) {myGLCD.disableSleep(); Lcd_On = true;}   // Если разрешено, гасим дисплей через 15 мин.
    if ((Son_count >= 15)&&(Lcd_On)) {myGLCD.enableSleep(); Lcd_On = false;}
#endif
//  Отображение экранов
if (Lcd_On) {switch (scr_num)
  {
  case 0:  // summary screen
    Refresh = true;          // Обновить отрисовку каждый цикл
//    temp3 = dps.readTemperature();
 
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(BigNumbers);

    //Давление с BMP180
    myGLCD.printNumI(Pressure / 133.3, 15, 5, 3); //рассчет атмосферного давления
    myGLCD.setFont(SmallFont);
    myGLCD.print(".", 60, 22);
    sotki = ((Pressure / 133.3)-int(Pressure / 133.3))*100;
    myGLCD.printNumI((sotki / 10), 66, 22, 1);// десятые 
    myGLCD.printNumI((sotki % 10), 72, 22, 1);// сотые
    myGLCD.print("t=", 20, 35);
    myGLCD.printNumF(bme.readTemperature(), 2, 32, 35);  //температура
    break;

  case 1:  // график давления c фиксированным масштабом    *****************************************************
     if (Refresh){    // Рисуем если разрешено обновить
     
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }
    P_Dt = 10 * 133.3;  // Размах графика 10мм
    for (int i=p2; i<p_count ; i++) {   // ищем окно графика
      if (P_win < P_Mem[i]) {
        P_win = P_win + P_Dt/2;         // сдвиг графика на половину текущего размера
      } 
      if ((P_win - P_Dt)> P_Mem[i]) {
        P_win = P_win - P_Dt/2;
      } 
    }    
    P_Max = P_win ;
    P_Min = P_Max - P_Dt;
    
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов 
        
    x=72;
   
      for (int i=p_count; i>p2 ; i--) {
        y = map (P_Mem[i],P_Max,P_Min,8,48);
        if (y < 8) {y = 8;}
        if (y > 47) {y = 47;} 
#if defined (zapolnen)        
        myGLCD.drawLine(x, y, x, 47);
#else        
        if (x == 72) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
             
        last_x = x; 
        last_y = y;
#endif        
        x--;
      }
   

    myGLCD.printNumF(Pressure/ 133.3, 2, 5, 0);    
    myGLCD.printNumF(bme.readTemperature(), 1, 60, 0);  //температура
    
    myGLCD.setFont(TinyFont);
    myGLCD.printNumI(((P_win + 79980)/133.3)-699.5 , 76, 8, 2);
    myGLCD.printNumI(((P_win + 79980 - P_Dt/2)/133.3)-699.5 , 76, 25, 2);
    myGLCD.printNumI(((P_win + 79980 - P_Dt)/133.3)-699.5 , 76, 42, 2);
//    myGLCD.print("24 Abs", RIGHT, 0);
//    myGLCD.print("Dt:", LEFT, 42); 
//    myGLCD.printNumF(P_Dt / 133.3, 2, 20, 42);  
//    myGLCD.printNumF(Pressure / 133.3, 2, 50, 42); 
 
 
  
    }
    break;

  case 2:  // график давления за сутки с масштабированием
    if (Refresh){    // Рисуем если разрешено обновить
    
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }

    for (int i=p_count; i>p2 ; i--) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 
    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>p2 ; i--) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
    myGLCD.print("24 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
    }
    break;

  case 3:  // график давления за трое суток  
    if (Refresh){    // Рисуем если разрешено обновить
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    for (int i=p_count; i>0 ; i = i - 3) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 

    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>0 ; i = i - 3) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }

        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
    myGLCD.print("72 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
    }
    break;   

  case 4: // напряжение аккумулятора для контроля
    Refresh = true;          // Обновить отрисовку каждый цикл
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов
    myGLCD.print("Bat:", LEFT, 15);    
    myGLCD.printNumF(analogRead(batPin)/176.6, 2, 24, 15);  //напр.батареи (коэфф. подобрать при желании)
    break;
  }

  if (Refresh) {myGLCD.update(); Refresh = false;} // Вывод вместимого буфера на дисплей и сброс признака обновления
} // if (Lcd_On)

    }  // скобка для условия сна в начале цикла в отладке не спим



  attachInterrupt(0, wakeUp, LOW); // Проснемся от кнопки


  //    Отключить питание на 4с
 
     LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); 
 

   if (!key_pressed) {tik++;} else {key_pressed = false; Son_count = 0;} // в зачёт 4с. если не тыкали кнопку
 
    if (tik >=15) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
 
} // Конец цикла


void wakeUp() // прерывание сна по нажатию кнопки
{
  // Just a handler for the pin interrupt.
  detachInterrupt(0); 
  if (light_on > 0) {scr_num++;} // Первый тычок только подсвет
  light_on = 2;            // после нажатия на кнопку подсветка 2*4 = 8с.
  Refresh = true;        // Обновить отрисовку
  key_pressed = true;   // кнопку жали
    if (scr_num > 4) {
      scr_num = 0;
    }
    LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); //антидребезг
    attachInterrupt(0, wakeUp, LOW); // восстановить прерывания от кнопки
} 





 

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

Вопрос для s13. После нашего общения барограф у меня славно работал. Несколько месяцев спустя повис, при переключении режимов. Ну перезапустил и все. Пару дней и снова повис. Я решил, что подсел аккумулятор и при этой напруге прибор работает плохо. Зарядил. Повис в тот же день. Попробовал заменить дисплей - виснет уже на пробах. Вопрос заключается в следущем: у Вас работает стабильно? Или пришлось что-то предпринимать? Сейчас прибор лежит полуразобраный уже пару месяцев. Пока руки не доходят. Активно занимаюсь осциллографом VirtOS. Но подумываю переделать барограф уже на печатку и в компактный корпус. Поэтому спрашиваю про возможные изменения. Пока единственное отличие у меня от Вашей схемы - нет кондеров по 22 пика. Но я их нигде не ставил. Ни в одной схеме. И все норм.

Да, Здравствуйте.

s13
Offline
Зарегистрирован: 22.05.2016

Здравствуйте. 

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

Вот три рабочих, с двух крышки снял чтобы видно было что внутри. Коробки 85х50х20 с али:

s13
Offline
Зарегистрирован: 22.05.2016

Вот вариант под bmp180 без прерываний, опрос кнопки 4 раза в секунду. Не думаю что сильно повысит прожорливость, а от зависаний должно избавить. Теперь экраны можно листать если держать кнопку.

#include <LCD5110_Graph.h>    //  rinkydinkelectronics.com/library.php
#include <Wire.h>
#include <Adafruit_BMP085.h>  //  github.com/adafruit/Adafruit-BMP085-Library
#include <LowPower.h>         //  github.com/rocketscream/Low-Power

Adafruit_BMP085 dps;

// ********** Опции компиляции **************
//#define SeaLevel            // разкоментировать для коррекции на высоту
//#define cont 67             // для изменения раскоментировать эту строку (70 по умолчанию)
#define zapolnen            // Заполнение графика 1
//#define gasim_lcd           // если экономим батарейки гашением LCD


long P_win = 165 * 133.3;    // Верхняя граница абс. графика по умолчанию до сдвига (600 + 165) = 765мм

#if defined (SeaLevel)  // если не включена коррекция, экономим память
float Alt_corr = 32.4;  // Коррекция высоты в метрах.
#endif

uint32_t Pressure; 
unsigned char sotki ;    // сотые для давления
unsigned char p_count, tmp, p2;
long P_Min, P_Max, P_Dt, P_Mid; 
uint16_t P_Mem[217]; //-79980 = 600мм (3 day 20min memory, 72 per 24 hour) 
signed char x, y, last_x, last_y;
// nokia 5110 connect
// pin d3 - Serial clock out (SCLK)
// pin d4 - Serial data out (DIN)
// pin d5 - Data/Command select (D/C)
// pin d6 - LCD reset (RST)
// pin d7 - LCD chip select (CS)

LCD5110 myGLCD(3, 4, 5, 6, 7);


// bmp180 connect
// sda  - a4
// scl  - a5

// Use pin 2 as wake up pin
const char wakeUpPin = 2; // d2 для кнопки
const char lightPin1 = 11; // d11 подсветка дисплея
const char lightPin2 = 12; // d12 инверсная подсветка дисплея
const char batPin = 0;    // a0 - ан. вход для контроля батареи 220к/51к

char scr_num = 0;          // Номер экрана для отображения
boolean key_pressed = false; // Признак что кнопку жали
boolean Refresh = true;      // Признак что нужно обновить отрисовку (для экономии батарей)
boolean Lcd_On = true;      // Признак что дисплей включен
char light_on = 4;         // длительность подсветки при включении 4*4 = 16с. 

extern unsigned char SmallFont[];  // внешние шрифты
extern unsigned char BigNumbers[];
extern unsigned char TinyFont[];    
unsigned char tik = 0;           // счетчики для времени
unsigned char Count_Minute = 0; 
uint32_t Son_count    = 0;

//******************************** START ***************************************
void setup() {
  
  
  myGLCD.InitLCD();
#if defined (cont)
  myGLCD.setContrast(cont); //регулировка контраста при необходимости
#endif
  myGLCD.setFont(SmallFont);
  Wire.begin();
  
  analogReference(INTERNAL); //1.1v internal op.source
  pinMode(batPin,INPUT);     //Вход для контроля батареи
    
  LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);

  //dps.begin(BMP085_ULTRALOWPOWER);
  //dps.begin(BMP085_STANDARD);
  dps.begin(BMP085_HIGHRES);
  //dps.begin(BMP085_ULTRAHIGHRES);
 

  pinMode(wakeUpPin, INPUT);  // Configure wake up pin as input.  
  digitalWrite(wakeUpPin, 1); // pullup
  
  pinMode(lightPin1, OUTPUT);// lcd light pin as output;
  pinMode(lightPin2, OUTPUT);// lcd light inv pin as output;
  
#if defined (SeaLevel)
  Pressure = dps.readSealevelPressure(Alt_corr); // с коррекцией на уровень моря
#else
  Pressure = dps.readPressure();                 // без коррекции к уровню моря
#endif

  P_Mid = Pressure - 79980; // (79980 = 600mm) отсекаем лишнее
  P_Mem[p_count] = P_Mid; // заносим в память первое значение давления для правильной работы усреднения

//  Serial.begin(9600);
//  while (!Serial) ; // wait for Arduino Serial Monitor
//  delay(200); 
}



void loop() {          // ***************************************************************************************************************

if ((Son_count < 5)||((!(Son_count % 5))&&(tik==0))) {    // через 5 минут активности, не заходим в тело по 5 минут


//  Serial.print("S=");Serial.print(Son_count);Serial.print(" %=");Serial.println(Son_count % 5);

#if defined (SeaLevel)
  Pressure = dps.readSealevelPressure(Alt_corr); // с коррекцией на уровень моря
#else
  Pressure = dps.readPressure();                 // без коррекции к уровню моря
#endif

 // для экранов с инверсным подсветом использовать lightPin2
  if  (light_on > 0) {
    digitalWrite(lightPin1, 1);digitalWrite(lightPin2, 0);
    light_on--;
  }
  else {digitalWrite(lightPin1, 0);digitalWrite(lightPin2, 1);} // lcd light on/off
  
 


  if (Pressure > 79900){  // 600mm
    P_Mid = (P_Mid + (Pressure - 79980))/2; // усреднение замеров, отбрасываем показания ниже 600мм.(сбоит бывает)
  }

    if (Count_Minute >= 20){ Refresh = true; // каждые 20 мин. запоминаем усредненное значение в память и обновляем графики

 
    if (p_count == 216) {
      for (int i = 0; i < 216; i++) // сдвигаем если буфер полон
      {
        P_Mem[i] = P_Mem[i+1];
      }
    } 
    else {
      p_count++;
    }
    P_Mem[p_count] = P_Mid; 
    if (Pressure > 79980){
      P_Mid = Pressure - 79980; // новый старт усреднения
    }
    Count_Minute = 0;
  }


#if defined (gasim_lcd)
    if ((Son_count < 15)&&(!Lcd_On)) {myGLCD.disableSleep(); Lcd_On = true;}   // Если разрешено, гасим дисплей через 15 мин.
    if ((Son_count >= 15)&&(Lcd_On)) {myGLCD.enableSleep(); Lcd_On = false;}
#endif
//  Отображение экранов
if (Lcd_On) {switch (scr_num)
  {
  case 0:  // summary screen
    Refresh = true;          // Обновить отрисовку каждый цикл
//    temp3 = dps.readTemperature();
 
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(BigNumbers);

    //Давление с BMP180
    myGLCD.printNumI(Pressure / 133.3, 15, 5, 3); //рассчет атмосферного давления
    myGLCD.setFont(SmallFont);
    myGLCD.print(".", 60, 22);
    sotki = ((Pressure / 133.3)-int(Pressure / 133.3))*100;
    myGLCD.printNumI((sotki / 10), 66, 22, 1);// десятые 
    myGLCD.printNumI((sotki % 10), 72, 22, 1);// сотые
    myGLCD.print("t=", 20, 35);
    myGLCD.printNumF(dps.readTemperature(), 1, 32, 35);  //температура
    break;

  case 1:  // график давления c фиксированным масштабом    *****************************************************
     if (Refresh){    // Рисуем если разрешено обновить
     
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }
    P_Dt = 10 * 133.3;  // Размах графика 10мм
    for (int i=p2; i<p_count ; i++) {   // ищем окно графика
      if (P_win < P_Mem[i]) {
        P_win = P_win + P_Dt/2;         // сдвиг графика на половину текущего размера
      } 
      if ((P_win - P_Dt)> P_Mem[i]) {
        P_win = P_win - P_Dt/2;
      } 
    }    
    P_Max = P_win ;
    P_Min = P_Max - P_Dt;
    
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов 
        
    x=72;
   
      for (int i=p_count; i>p2 ; i--) {
        y = map (P_Mem[i],P_Max,P_Min,8,48);
        if (y < 8) {y = 8;}
        if (y > 47) {y = 47;} 
#if defined (zapolnen)        
        myGLCD.drawLine(x, y, x, 47);
#else        
        if (x == 72) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
             
        last_x = x; 
        last_y = y;
#endif        
        x--;
      }
   

    myGLCD.printNumF(Pressure/ 133.3, 2, 5, 0);    
    myGLCD.printNumF(dps.readTemperature(), 1, 60, 0);  //температура
    
    myGLCD.setFont(TinyFont);
    myGLCD.printNumI(((P_win + 79980)/133.3)-699.5 , 76, 8, 2);
    myGLCD.printNumI(((P_win + 79980 - P_Dt/2)/133.3)-699.5 , 76, 25, 2);
    myGLCD.printNumI(((P_win + 79980 - P_Dt)/133.3)-699.5 , 76, 42, 2);
//    myGLCD.print("24 Abs", RIGHT, 0);
//    myGLCD.print("Dt:", LEFT, 42); 
//    myGLCD.printNumF(P_Dt / 133.3, 2, 20, 42);  
//    myGLCD.printNumF(Pressure / 133.3, 2, 50, 42); 
 
 
  
    }
    break;

  case 2:  // график давления за сутки с масштабированием
    if (Refresh){    // Рисуем если разрешено обновить
    
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }

    for (int i=p_count; i>p2 ; i--) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 
    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>p2 ; i--) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
    myGLCD.print("24 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
    }
    break;

  case 3:  // график давления за трое суток  
    if (Refresh){    // Рисуем если разрешено обновить
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    for (int i=p_count; i>0 ; i = i - 3) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 

    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>0 ; i = i - 3) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }

        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
    myGLCD.print("72 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
    }
    break;   

  case 4: // напряжение аккумулятора для контроля
    Refresh = true;          // Обновить отрисовку каждый цикл
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов
    myGLCD.print("Bat:", LEFT, 15);    
    myGLCD.printNumF(analogRead(batPin)/176.6, 2, 24, 15);  //напр.батареи (коэфф. подобрать при желании)
    break;
  }

  if (Refresh) {myGLCD.update(); Refresh = false;} // Вывод вместимого буфера на дисплей и сброс признака обновления
} // if (Lcd_On)

    }  // скобка для условия сна в начале цикла в отладке не спим


  //    Отключить питание на 4с или до нажатия кнопки
 tmp = 0;

if (key_pressed){LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);key_pressed = false;}

 while ((tmp < 16) && (digitalRead(wakeUpPin)==HIGH))
 {    
     LowPower.powerDown(SLEEP_250MS, ADC_OFF, BOD_OFF); 
     tmp++;    
 }
if (tmp<16) 
{  
  if (light_on > 0) {scr_num++;} // Первый тычок только подсвет
  light_on = 2;            // после нажатия на кнопку подсветка 2*4 = 8с.
  Refresh = true;        // Обновить отрисовку
  key_pressed = true;   // кнопку жали
  if (scr_num > 4) scr_num = 0;
}

   if (!key_pressed) {tik++;} else {Son_count = 0;} // в зачёт 4с. если не тыкали кнопку
   
    if (tik >=15) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
 
} // Конец цикла





 

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

s13, Спасибо! Попробую кнопку. Если не поможет - заменю программу. Я тоже нацелился на такой корпус. Две штуки лежат. Я подумывал на кварц. Читал, что не любят они сотрясений. А мой прибор нередко плюхался мордой. Несбалансированная конструкция получилась, аккумулятор в верхней части, а приделать лыжи для устойчивости поленился. Да и макетка нехорошо разведена. И гетинакс отстойный.  Буду, возможно, разводить плату под ЛУТ. Если все удачно получится - размещу сдесь.

R2PM
Offline
Зарегистрирован: 28.12.2015

Доброе время суток уважаемые коллеги!!!!!

Простите за не грамотность, но есть огромное желание повторить борограф с дисплем LCD 128 на 64 с контроллером ST7920 и датчик давления BMP 180. Подскажите где рабочий скетч и по возможности схема. Питать буду от 5 врльт и стацонарно.

Спасибо большое. С уважением Виктор R2PM Tula

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

Доброе время суток.

R2PM   В этой ветке начиная с поста № 75 и далее построено на данном дисплее .

И расписано довольно подробно.

R2PM
Offline
Зарегистрирован: 28.12.2015

Доброе время суток!!!

СПАСИБО за ответ!!! В принципе почти разобрался, но где есть описание в скетче задейственные пины (можно собрать_ повторить) есть ошибка при компелировании, например пост 121, а пост 109 компиляция проходит, а вычислить схему не возможно. Подскажите пожалуста. Среда 1.6.13. Библиотеки на датчик ставил разные пезулльтат один по посту 121

'class BMP085' has no member named 'init'

С уважением Виктор

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

У меня версия 1.6.6 компилируется с поста 121 нормально 

Возможно надо переустановить библиотеку на BMP085

https://drive.google.com/file/d/0B0AIJgNiGhqQQk05ZUpRZXVGNHc/view?usp=sharing

Попробуйте старую удалить и поставить эту.

R2PM
Offline
Зарегистрирован: 28.12.2015

soznik пишет:

У меня версия 1.6.6 компилируется с поста 121 нормально 

Возможно надо переустановить библиотеку на BMP085

https://drive.google.com/file/d/0B0AIJgNiGhqQQk05ZUpRZXVGNHc/view?usp=sharing

Попробуйте старую удалить и поставить эту.

Добрый день!!!

СПАСИБО!!!! С Вашей без промблем средой 1.6.13

Сейчас окончательно разберусь со схемой и .... результат должу.

Ещк раз спасибо.

R2PM
Offline
Зарегистрирован: 28.12.2015

soznik пишет:

Вот код с датчиком влажности использовано 93% памяти.

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

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

По подключению датчиков и кнопок спрашивайте отвечу всем.

Доброе время суток!!!

Спасибо за проект - с поста 121 проект работает!!

есть желание с 150 додеоать.Можите написать мне про подключаемые кнопки, мjй адрес rd3pq@rambler.ru


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

Так давно уже было пришлось вспоминать заново..

Как я писал планку с кнопками взял от какой-то двдишки и рассчитал значения в строках 60-70 (скетч с поста 150) 

кнопки подключены делителем напряжения.

Подробно описано здесь http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku 

Подключены к выводу 16 это  А2



А0 - вольтметр (подключается на аккумулятор )

А1 фоторезистор (что-бы подсветка ночью не освещала комнату) выход D9 подключал через полевик( катод подсветки-полевик-корпус)

R2PM
Offline
Зарегистрирован: 28.12.2015

Добрый день!!!

Спасибо за ответ, но к каким пинам подключается датчик влажности.

Виктор

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

D7 строка 15

R2PM
Offline
Зарегистрирован: 28.12.2015

Делитель напряжения  какой номинал или коэффициэнт деления , так понимаю три кнопки

Спасибо

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

Открывать  барограф нет особого желания в статье по ссылке работа с кнопками очень жорошо описанно 

попробуйте разобратся сами . Не получится тогда вскрою и посмотрю.

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

R2PM пишет:

Делитель напряжения  какой номинал или коэффициэнт деления , так понимаю три кнопки

Спасибо

Можно ничего не рассчитывать, соберите кнопки через делители столько сколько нужно.

Затем напишите простой скетч

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(analogRead(A2));
  delay(1000);
}

и нажимая кнопки коп порт покажет какое значение на АЦП выдает каждая, дальше через if от них пляшите.

R2PM
Offline
Зарегистрирован: 28.12.2015

спасибо большое!!!!

вечером попробую всё подключить

. потом раскажу

R2PM
Offline
Зарегистрирован: 28.12.2015

Доброе время суток!!!

Запустил проект с поста 159, работает без промблем на Pro Mini с камнем 328, осталось только подключить кнопки с делителем напряжения. Кстати говоря скетч с поста 150 затер загрузчик в андруинке, а скетч с поста 121 не плохо работает - устойчиво.

Виктор R2PM

R2PM
Offline
Зарегистрирован: 28.12.2015
R2PM
Offline
Зарегистрирован: 28.12.2015

Доброе время суток!!!

Нужна помощь в номиналах делителя напряжения  по посту 159.

Спасибо. С уважением Виктор R2PM

 

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

диапазон АЦП, то это от 0 до 1023 . Что соответствует напряжению от 0 до 5в. Например значение 512 это 2.5в.

в программе три значения (Строки 57-65)

<100 это кнопка на корпус , 

analog>700&&analog<800  для расчета возмём 750  (750*5/ 1023=3,66)

для второй кнопки нам надо получить 3,66 вольта.

Uвых= U вх * (R2/ (R1+R2))

+5в--10кОм(R1)    --вывод А2-----27 кОм(R2)---- кнопка -------  корпус.

Получается если кнопка не нажата на А2 5вольт или значение АЦП 1023.на

нажимаем кнопку на делителе 3,648 или  1023*3,648/5= 746 ( входит в диапазон 700-800).

Третью кнопку расчитайте сами.

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

Чтоб не расчитывать вам дали программку . берете два резистора допустим 10 кОм и 33 кОм подключаем 3кнопки две через сопротивы , а третью на корпус смотрим получившиеся значения АЦП задаем диапазон для каждой кнопки и вставляем в строки 57-65.

В ардуино есть встроенные подтягивающие резисторы (pull-up) которые можно включить программно

digitalWrite(16,HIGH);//включаем внутренний pull-up резистор на А2

Тогда сопративу с +5в на А2 ставить не надо.

Успехов.

 

R2PM
Offline
Зарегистрирован: 28.12.2015

soznik пишет:

Чтоб не расчитывать вам дали программку . берете два резистора допустим 10 кОм и 33 кОм подключаем 3кнопки две через сопротивы , а третью на корпус смотрим получившиеся значения АЦП задаем диапазон для каждой кнопки и вставляем в строки 57-65.

В ардуино есть встроенные подтягивающие резисторы (pull-up) которые можно включить программно

digitalWrite(16,HIGH);//включаем внутренний pull-up резистор на А2

Тогда сопративу с +5в на А2 ставить не надо.

Успехов.

 

Доброе время суток!!!

Всё победил, делитель напряжения выполнил. Спасибо за проект!!!!

Успехов. С уваженим Виктор R2PM Tula

 

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

Повторил Барограф лайт  и из поста 362 с BMP-280, всё чудно работает, код естесственно подправил.

Спасибо создателям!

Sasha21, ваш с DHT22 и BMP-280 тоже работает- в начальном экране есть все значения, но графики не идут

 

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

Сделал я все же плату по варианту барографа от s13 и загнал ее в корпус.  https://yadi.sk/d/nn1BAn2334prEX

Плату очень удачной не считаю. 4 перемычки не считая двух перемычек СМД. Но, что выросло, то выросло. Прошивка старая. Корпус и контактные стойки под дисплей и модуль ВМР180 пришлось немного подрезать по высоте. Стойки корпуса пришлось сфрезировывать до высоты около 2 мм. С кнопкой мудрить не стал, прицепил термоклеем. Пока проработала не так долго. Суммарно недели две. При подключении зарядки лития графики не теряются.

Пробы на зависание при щелчках кнопки. Пробовал двояко. Аккуратно. каждый новый клик полсле завершения обработки предыдущего. Норм. Хаотичные беспорядочные клики минут несколько. Норм. Барограф не завис ни разу. Но кнопку я при этом заменил на специфическую.  Она срабатывает по ощущениям как кнопки на пульте ДУ. Видимо силикон и токопроводящая резина внутри.

В связи с этим немного рассуждений о природе т.н. "дребезга контактов". Обычные широкораспространенные кнопки построены на перещелкивании изогнутых упругих пластин. Мы на нее надавили и она выстрелила в обратную загибу сторону. Идет соударение с контактной площадкой. Отскок. Снова соударение. Затухающий колебательный процесс. В результате вместо одного импульса идет несколько. Кондеры радикально картину изменит не могут. У них и свои эффекты есть. У меня нет ждущего осциллографа, способного зафиксировать процессы такого рода. Чисто умозрительные заключения. И я убежден, что кнопки с токопроводящей резиной если и обладают эффектом дребезга, то куда более сглаженным. Во всяком случае в барографе по варианту s13 я бы рекомендовал использовать именно такие. Ну либо другие кнопки с безударным срабатыванием.

s13, еще раз благодарю вас за интересный вариант барографа.

s13
Offline
Зарегистрирован: 22.05.2016

Когда делал свой метеодатчик http://narodmon.ru/2355 на esp8266, чтобы считать прерывания от счетчика гейгера был использован такой способ избавления от дребезга:

void IMP_IN() {
  if (!in_int){
    in_int = true;
    delayTime = millis();
    while (millis() <= delayTime+5){};    // задержка 5 мс.
    imp_val++;                                        // счетчик +
    in_int = false; 
  }
}
 
заводится флаг in_int, который сбрасывается только через 5мс, а пока он не сброшен, идёт просто возврат из прерывания.
Ну и переменные которые используются в прерывании нужно пометить как volatile. ( это если кто решит улучшить )
А так, барограф через интернет оказался поинтереснее. Хоть и собран на есп8266, но в среде ардуино, и прицепить любой датчик или дисплей проблем нет, библиотеки подходят без изменений.
 
 
Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

s13 пишет:

Когда делал свой метеодатчик 

Да, тепло там у вас. У нас, собственно тоже, в р-не -20. Но для нас это действительно не так плохо. И видимо стены фонят тепловым излучением. Разброс немалый.

А о антидребезге програмном я думал. Но поскольку ни разу не программист и даже не электронщик, упоминать не стал. И еще мне кажется, что если уж совсем проблемный набор (МК, дисплей, кнопка) оказывается и зависает от нажатий, можно попробовать отключить подсветку. Бросок тока должен упасть на порядок. Со всеми вытекающими.

s13
Offline
Зарегистрирован: 22.05.2016

Лекс 59 пишет:

А о антидребезге програмном я думал. Но поскольку ни разу не программист и даже не электронщик, упоминать не стал.

Намёк понял, кажись нашел проблему, по крайней мере остервенелое тыкание кнопки в течение получаса зависания не дало :) применил всё что выше писал, и ещё запретил прерывания на время общения с датчиком bmp180. Пробуйте.

Кекс для 8Mhz:

:100000000C949E030C94D9170C9406180C94C603F8
:100010000C94C6030C94C6030C9495170C94C60359
:100020000C94C6030C94C6030C94C6030C94C6032C
:100030000C94C6030C94C6030C94C6030C94C6031C
:100040000C9433180C94C6030C94C6030C94C6038A
:100050000C94C6030C94C6030C94C6030C94C603FC
:100060000C9424130C94C6030406205F00000003C4
:10007000A000C00C00F94F806BEB00988C8052A55B
:100080008003000001C88089C00050850021C200A3
:10009000084000208200002000188C00FA2F804BBE
:1000A000E0805A66808AA500E08F80EAAB0072A9E2
:1000B000009A8C00FAAF804AA70001400009400076
:1000C00021488051450089420042660072A6807A2C
:1000D0008780FAA500722500FA2700FAA880FA881E
:1000E00000722B00F88F808BE8808BE800F88D8001
:1000F000F82080F90F80F9CF80722700FA8400720F
:100100002740FA85804AA90083E800F02F00E06EBE
:1001100000F0EF00D88D80C0EC009AAC8003E8803E
:10012000C081808BE000420400082080020400317E
:100130002380F92300312480312F8031628023EA2B
:1001400000255380F9038002E00006E000F84280B9
:1001500003E0007987803903803123007D2300315B
:1001600027C078840029400043E4007027006066BF
:100170000070670048C48074578059E68023E88087
:100180000360008BE200610C000E182D0D000000D2
:1001900000000000000000000000000000103838DF
:1001A00038383838383810000000000000000000EF
:1001B000000000000000000000000000000000003F
:1001C000000000000000000000000000000000002F
:1001D000000000000000000040E0E04000000000DF
:1001E00000000002060E0E0E0E0E0E0602000000AB
:1001F000001038383838383838381000000000809F
:10020000C0E0E0E0E0E0E0C080000000FCFAF60EB4
:100210000E0E0E0E0EF6FAFC0000EFC78300000073
:1002200000000083C7EF00007FBFDFE0E0E0E0E018
:10023000E0DFBF7F0000000000000000000000F0D1
:10024000F8FC000000000000000000000083C7EF81
:1002500000000000000000000000001F3F7F0000C1
:100260000002060E0E0E0E0E0EF6FAFC0000E0D096
:10027000B83838383838383B170F00007FBFDFE018
:10028000E0E0E0E0E0C0800000000002060E0E0E9C
:100290000E0E0EF6FAFC00000010383838383838E8
:1002A00038BBD7EF00000080C0E0E0E0E0E0E0DF36
:1002B000BF7F0000FCF8F0000000000000F0F8FC38
:1002C00000000F173B383838383838BBD7EF0000FC
:1002D0000000000000000000001F3F7F0000FCFA4B
:1002E000F60E0E0E0E0E0E06020000000F173B3823
:1002F0003838383838B8D0E000000080C0E0E0E09E
:10030000E0E0E0DFBF7F0000FCFAF60E0E0E0E0EFE
:100310000E0602000000EFD7BB383838383838B83E
:10032000D0E000007FBFDFE0E0E0E0E0E0DFBF7FA3
:1003300000000002060E0E0E0E0E0EF6FAFC000075
:1003400000000000000000000083C7EF0000000074
:10035000000000000000001F3F7F0000FCFAF60EC6
:100360000E0E0E0E0EF6FAFC0000EFD7BB38383832
:10037000383838BBD7EF00007FBFDFE0E0E0E0E0D7
:10038000E0DFBF7F0000FCFAF60E0E0E0E0E0EF63A
:10039000FAFC00000F173B383838383838BBD7EF35
:1003A00000000080C0E0E0E0E0E0E0DFBF7F0006AA
:1003B00008205F0000000000000000002F00000087
:1003C000000700070000147F147F1400242A7F2AEE
:1003D00012002313086462003649552250000005BC
:1003E00003000000001C224100000041221C00000C
:1003F00014083E08140008083E0808000000A06029
:1004000000000808080808000060600000002010D4
:10041000080402003E5149453E0000427F40000072
:100420004261514946002141454B31001814127F69
:1004300010002745454539003C4A494930000171C3
:1004400009050300364949493600064949291E0075
:100450000036360000000056360000000814224125
:1004600000001414141414000041221408000201A6
:1004700051090600324959513E007C1211127C008C
:100480007F49494936003E41414122007F41412296
:100490001C007F49494941007F09090901003E418B
:1004A00049497A007F0808087F0000417F41000029
:1004B0002040413F01007F08142241007F4040401E
:1004C00040007F020C027F007F0408107F003E4145
:1004D00041413E007F09090906003E4151215E006D
:1004E0007F091929460046494949310001017F0128
:1004F00001003F4040403F001F2040201F003F4080
:1005000038403F00631408146300070870080700B0
:10051000615149454300007F414100AA55AA55AAAF
:1005200055000041417F00000402010204004040E8
:10053000404040000003050000002054545478005F
:100540007F484444380038444444200038444448F8
:100550007F00385454541800087E0901020018A482
:10056000A4A47C007F080404780000447D400000BF
:100570004080847D00007F102844000000417F40BF
:1005800000007C04180478007C08040478003844D7
:1005900044443800FC242424180018242418FC00A7
:1005A0007C0804040800485454542000043F44408C
:1005B00020003C4040207C001C2040201C003C408F
:1005C00030403C004428102844001CA0A0A07C001F
:1005D0004464544C440000107C8200000000FF0082
:1005E000000000827C1000000006090906000000DF
:1005F00008000201000003040700000000000000E2
:1006000000010204081020408001020408102001AB
:100610000204081020040404040404040402020276
:100620000202020303030303030000000025002865
:10063000002B0000000000240027002A0000407A60
:1006400010F35A00A0724E18090010A5D4E800005B
:10065000E87648170000E40B54020000CA9A3B00F9
:100660000000E1F505000080969800000040420F70
:10067000000000A08601000000102700000000E834
:1006800003000000006400000000000A00000000F9
:10069000000100000000002C76D888DC674F08239A
:1006A000DFC1DFAE59E1B1B796E5E3E453C63AE600
:1006B00051997696E8E6C28426EB898C9B62ED40E0
:1006C0007C6FFCEFBC9C9F40F2BAA56FA5F490052F
:1006D0005A2AF75C936B6CF9676DC11BFCE0E40D63
:1006E00047FEF520E6B500D0ED902E030094357757
:1006F000050080841E080000204E0A000000C80C7F
:10070000333333330F986E12831141EF8D211489E7
:100710003BE65516CFFEE6DB18D1844B381BF77C41
:100720001D901DA4BBE424203284725E228100C986
:10073000F124ECA1E53D2700B70A421211241FBEA7
:10074000CFEFD8E0DEBFCDBF11E0A0E0B1E0E0E543
:10075000FEE302C005900D92A634B107D9F726E05A
:10076000A6E4B1E001C01D92A831B207E1F717E09D
:10077000CCE3D7E004C02297FE010E949C1CC83342
:10078000D107C9F70E94BC190C94261F0C940000D5
:1007900080914C01811130C081E080934C0180E058
:1007A0000E94C91780910A0118162CF480914E01FD
:1007B0008F5F80934E0182E080930A0181E08093F5
:1007C0000C0180934D0180914E01853014F0109200
:1007D0004E0120E030E040E050E065E070E08AE06B
:1007E00096E00E94481740E050E068EC73E080E03B
:1007F0000E94A91710924C01089566E470E08FE4FE
:1008000091E00E94F10B6FEA73E08FE491E00E94A7
:100810007C0F8AE495E00E94061283E00E9403198F
:1008200060E080E00E944C1920E030E040E050E0C1
:1008300066E070E08AE096E00E94481762E083E399
:1008400095E00E94111560E082E00E944C1961E081
:1008500082E00E94851961E08BE00E944C1961E002
:100860008CE00E944C1983E395E00E94F21560939E
:100870002F05709330058093310590933205DC018C
:10088000CB018C569843A140B109809318059093F1
:100890001905A0931A05B0931B05E0912905F0E016
:1008A000EE0FFF1FEA59FC4F9183808308953F921A
:1008B0004F925F926F927F928F929F92AF92BF9270
:1008C000CF92DF92EF92FF920F931F93CF93DF931C
:1008D00060914601709147018091480190914901D2
:1008E000653071058105910578F025E030E040E044
:1008F00050E00E94461C672B682B692B09F0E2C56B
:1009000080914B018111DEC580E00E94C91783E30D
:1009100095E00E94F21560932F0570933005809347
:1009200031059093320583E395E00E947E15609334
:100930002B0570932C0580932D0590932E0540E098
:1009400050E068EC73E080E00E94A91780910A01F2
:10095000181674F461E08BE00E94851960E08CE069
:100960000E94851980910A01815080930A0108C074
:1009700060E08BE00E94851961E08CE00E9485199F
:1009800040912F05509130056091310570913205ED
:100990004D3188E3580781E068077105F0F0DB010D
:1009A000CA018C569843A140B109009118051091D5
:1009B000190520911A0530911B05800F911FA21F68
:1009C000B31FB695A7959795879580931805909333
:1009D0001905A0931A05B0931B0580914A01843133
:1009E000B8F181E080930C0180912905883D59F48C
:1009F000E6E6F3E0828193818193919395E0E6317D
:100A0000F907C1F703C08F5F80932905E09129059D
:100A1000F0E0EE0FFF1FEA59FC4F8091180590910E
:100A20001905918380834D36C8E35C07C1E06C07EC
:100A3000710560F04C5658436140710940931805A8
:100A40005093190560931A0570931B0510924A0183
:100A500080910B01882309F435C580914E018230C5
:100A600009F4B6C23CF4882309F444C0813009F487
:100A7000EFC01EC5833009F4E5C3843009F018C502
:100A800081E080930C018FE491E00E94E40B6FEA17
:100A900073E08FE491E00E947C0F2FE030E040E0B3
:100AA00050E061E371E08FE491E00E94A50D80E0E9
:100AB0000E940619BC01882777FD8095982F0E9417
:100AC000171B2AE939E940E353E40E947C1AAB0181
:100AD000BC0130E2832EA12CB12CEEE2CE2EFFE041
:100AE000EF2EF12C08E110E022E08FE491E00E946B
:100AF000FE0EDEC481E080930C018FE491E00E9441
:100B0000E40B69E871E08FE491E00E947C0F609152
:100B10002F057091300580913105909132050E942A
:100B2000151B2DEC3CE445E053E40E947C1A0E9426
:100B3000E41AAB01BC01E0E2CE2EF3E0EF2EF12C83
:100B400005E010E02FE030E08FE491E00E94060E17
:100B50006FEA73E08FE491E00E947C0F26E130E0C1
:100B60004CE350E062E171E08FE491E00E94A50D5A
:100B700060912F057091300580913105909132057B
:100B80000E94151B2DEC3CE445E053E40E947C1AC6
:100B90002B013C010E94E41A882777FD8095982F4D
:100BA0000E94171B9B01AC01C301B2010E94131AE2
:100BB00020E030E048EC52E40E94C71B0E94E91A92
:100BC000862F60932A05CAE06C2F0E943A1C482F9A
:100BD00050E060E070E0EE24E394F12C06E110E0D8
:100BE00022E430E08FE491E00E94060E80912A0515
:100BF0006C2F0E943A1C492F50E060E070E028E41E
:100C000030E08FE491E00E94060E23E230E044E100
:100C100050E064E171E08FE491E00E94A50D409105
:100C20002B0550912C0560912D0570912E05B0E299
:100C30008B2EA12CB12CCEE2CC2ED3E2ED2EF12CBA
:100C400000E210E021E08FE491E00E94FE0E30C44B
:100C500080910C01882309F42BC4009129050834E4
:100C600018F41092280504C088EB800F80932805A3
:100C700085E395E0A0E0B0E080931C0590931D050E
:100C8000A0931E05B0931F05C091280580910D010A
:100C900090910E01A0910F01B0911001EC2EF12C5A
:100CA000F701EE0FFF1FEA59FC4F20E030E010E0A3
:100CB000A9014E0D5F1D401751073CF5A901440FD6
:100CC000551F4E0F5F1FEA014881598160E070E0B7
:100CD00084179507A607B70724F486569D4FAF4F94
:100CE000BF4F2C013D01D5E34D1AD5E05D0A6108E7
:100CF0007108441555056605770524F48A59924014
:100D0000A109B1092F5F3F4FD3CF80930D0190937D
:100D10000E01A0930F01B0931001809320059093D2
:100D20002105A0932205B093230585539540A10981
:100D3000B1098093240590932505A0932605B093CF
:100D400027058FE491E00E94E40B6FEA73E08FE4E3
:100D500091E00E947C0F88E48093650360902905F0
:100D6000712C4301880C991CF401EA59FC4F4F0186
:100D7000C0E0D0E0A0E33A2EB8E04B2E1FE2512EA7
:100D80008091280590E09E01260D371D821793075C
:100D90000CF04DC0E0902405F0902505009126054B
:100DA00010912705209120053091210540912205C1
:100DB00050912305FE01EE0FFF1FE80DF91D608124
:100DC000718180E090E01F921F921F923F92E8E0B5
:100DD000AE2EB12CC12CD12C0E94CB190F900F90AC
:100DE0000F900F9068301CF06093640302C0409233
:100DF000640380916403803314F050926403609123
:100E00006503772767FD709540916403552747FD7B
:100E100050950FE210E09B018FE491E00E94F80FE3
:100E2000809165038150809365032197A9CF6091DC
:100E30002F057091300580913105909132050E9407
:100E4000151B2DEC3CE445E053E40E947C1AAB01F9
:100E5000BC01D0E28D2EA12CB12C1EE2C12EE12CC2
:100E6000F12C05E010E022E08FE491E00E94FE0EFC
:100E700040912B0550912C0560912D0570912E0508
:100E80000CE310E021E08FE491E00E94FE0E68E6A2
:100E900070E08FE491E00E947C0F60910D017091F1
:100EA0000E0180910F01909110016459774C8E4F83
:100EB0009F4F0E94171B2DEC3CE445E053E40E9439
:100EC0007C1A20E030EE4EE254E40E94131A0E9495
:100ED000E41AAB01BC0100E2C02E82E0E82EF12C46
:100EE00008E010E02CE430E08FE491E00E94060E70
:100EF00040900D0150900E0160900F017090100114
:100F0000FCE64F0EF8E35F1EF1E06F1E711C60916E
:100F10001C0570911D0580911E0590911F0522E012
:100F200030E040E050E00E94681C421A530A640A14
:100F3000750AC301B2010E94171B2DEC3CE445E089
:100F400053E40E947C1A20E030EE4EE254E40E940A
:100F5000131A0E94E41AAB01BC0109E110E02CE471
:100F600030E08FE491E00E94060E60910D017091D7
:100F70000E0180910F01909110016459774C8E4FB2
:100F80009F4F00911C0510911D0520911E05309169
:100F90001F05601B710B820B930B0E94171B2DEC1E
:100FA0003CE445E053E40E947C1A20E030EE4EE23F
:100FB00054E40E94131A0E94E41AAB01BC010AE235
:100FC00010E02CE430E08FE491E00E94060E70C245
:100FD00080910C01882309F46BC220912905822E8F
:100FE000912CD401AA0FBB1FAA59BC4F8D919C9183
:100FF000A0E0B0E08093240590932505A0932605FA
:10100000B09327058093200590932105A093220596
:10101000B09323052834E8F41092280500912805A0
:1010200010E08091240590912505A0912605B091AE
:10103000270540912005509121056091220570916E
:101040002305E401CC0FDD1FCA59DC4F20E030E05E
:101050001EC0285420932805E1CF7901EE0CFF1C17
:10106000EC0EFD1EF70140805180612C712C48165A
:1010700059066A067B0614F4D301C20144155505CE
:101080006605770514F4B301A201215031097901F5
:10109000E80CF91C0E151F0504F3809324059093AA
:1010A0002505A0932605B09327054093200550936E
:1010B00021056093220570932305481B590B6A0B89
:1010C0007B0B40931C0550931D0560931E05709388
:1010D0001F058FE491E00E94E40B68E670E08FE466
:1010E00091E00E947C0F8DE48093650380911C0544
:1010F00090911D05A0911E05B0911F0518161906A7
:101100001A061B06B4F120E030E040E050E067E151
:1011100071E08FE491E00E94A50D6091200570912F
:10112000210580912205909123056459774C8E4FBB
:101130009F4F0E94171B2DEC3CE445E053E40E94B6
:101140007C1AAB01BC0180E2882EA12CB12C9EE25E
:10115000C92EE12CF12C04E110E022E08FE491E0B3
:101160000E94FE0E20E030E04FE057E26CE171E0BB
:101170000CC180902905912C7401EE0CFF1CC70155
:101180008A599C4F7C01C0E0D0E08091280590E016
:101190009E01280D391D821793070CF0B4CFFE0174
:1011A000EE0FFF1FEE0DFF1D808191812091200524
:1011B000309121054091220550912305281B390BC0
:1011C00041095109A4E2B0E00E94871C20911C054E
:1011D00030911D0540911E0550911F050E94681C0D
:1011E0002A5F2093640380916503022F112707FD76
:1011F00010958D3441F4A8016DE470E08FE491E026
:101200000E946E0C12C0282F332727FD3095409185
:101210006203552747FD509560916303772767FD6B
:1012200070958FE491E00E94F80F809165038093A0
:1012300063039091640390936203815080936503EC
:101240002197A3CF80910C01882309F431C1C0916B
:101250002905EC2EF12CF701EE0FFF1FEA59FC4F88
:1012600080819181A0E0B0E0AC01BD0120E030E0E0
:1012700089010E0D1F1D10161106DCF48901000FE7
:10128000111F0E0F1F1FE80148805980612C712C1F
:10129000481659066A067B0614F4D301C2014415A8
:1012A00055056605770514F4B301A20123503109F1
:1012B000DFCF8093240590932505A0932605B09356
:1012C00027054093200550932105609322057093D4
:1012D0002305481B590B6A0B7B0B40931C0550934D
:1012E0001D0560931E0570931F058FE491E00E9419
:1012F000E40B68E670E08FE491E00E947C0F8DE4DF
:101300008093650380911C0590911D05A0911E0599
:10131000B0911F05181619061A061B060CF462C0B8
:1013200020E030E040E050E067E171E08FE491E0E0
:101330000E94A50D609120057091210580912205E4
:10134000909123056459774C8E4F9F4F0E94171B35
:101350002DEC3CE445E053E40E947C1AAB01BC0157
:10136000D0E28D2EA12CB12C1EE2C12EE12CF12C4D
:1013700004E110E022E08FE491E00E94FE0E20E004
:1013800030E04FE057E269E271E08FE491E00E94C3
:10139000A50D2AE230E040E050E064E271E08FE425
:1013A00091E00E94A50D6091240570912505809122
:1013B0002605909127056459774C8E4F9F4F0E94C8
:1013C000171B2DEC3CE445E053E40E947C1AAB0172
:1013D000BC01CAE2EC2EF12C22E08FE491E00E94E5
:1013E000FE0E66C080902905912C7401EE0CFF1C46
:1013F000F701EA59FC4F7F01C0E0D0E0CE01880D33
:10140000991D181619060CF08BCFFE01EE0FFF1F69
:10141000EE0DFF1D808191812091200530912105E5
:101420004091220550912305281B390B4109510990
:10143000A4E2B0E00E94871C20911C0530911D059C
:1014400040911E0550911F050E94681C2A5F209341
:10145000640380916503022F112707FD10958D34D9
:1014600041F4A8016DE470E08FE491E00E946E0CFD
:1014700012C0282F332727FD30954091620355274E
:1014800047FD509560916303772767FD70958FE462
:1014900091E00E94F80F809165038093630390911F
:1014A0006403909362038150809365032397A6CFD2
:1014B00080910C01882331F08FE491E00E94BA0BF7
:1014C00010920C0140E050E068EC73E080E00E9474
:1014D000A91720E030E040E050E068E070E08AE0EA
:1014E00096E00E94481780914D01811106C08091BD
:1014F0004B018F5F80934B010AC010924D011092F7
:1015000046011092470110924801109249018091C2
:101510004B018F30D0F080914A018F5F80934A0158
:101520008091460190914701A0914801B0914901F5
:101530000196A11DB11D8093460190934701A09390
:101540004801B093490110924B01DF91CF911F9157
:101550000F91FF90EF90DF90CF90BF90AF909F9052
:101560008F907F906F905F904F903F900895EF9293
:10157000FF920F931F9383E395E00E94511487E03D
:10158000E82EF12C06E010E025E030E044E050E0E9
:1015900063E070E08FE491E00E94D30A1F910F9105
:1015A000FF90EF900895AF92BF92DF92EF92FF927B
:1015B0000F931F93CF93DF9300D0CDB7DEB75C01BD
:1015C000D62E862F972FFC01EB5EF94FE491F0E0C9
:1015D000EE0FFF1FE75DF94F65917491F50171837F
:1015E0006083FC01EF5FF94F8491F5018287FA0176
:1015F000EB5EF94FE491F0E0EE0FFF1FE75DF94F6E
:1016000065917491F50173836283FA01EF5FF94F7D
:101610008491F5018387F901EB5EF94FE491F0E0E5
:10162000EE0FFF1FE75DF94F85919491F5019583CA
:101630008483F901EF5FF94F6491F5016487F80144
:10164000EB5EF94FE491F0E0EE0FFF1FE75DF94F1D
:1016500085919491F50197838683F801EF5FF94FA7
:101660006491F5016587F701EB5EF94FE491F0E0D5
:10167000EE0FFF1FE75DF94F85919491F50191877A
:101680008087F701EF5FF94FA491F501A68761E02C
:101690008D2D2A8349830E944C1961E04981842F52
:1016A0000E944C1961E02A81822F0E944C1961E04E
:1016B000802F0E944C1961E08E2D0E944C19F5017B
:1016C000D786008B0F900F90DF91CF911F910F91D4
:1016D000FF90EF90DF90BF90AF900895FC012685BA
:1016E000A085B1858C9190E030E0209530958223E3
:1016F00093238C93A481B581411109C024858C91D9
:1017000090E030E0209530958223932303C09485A8
:101710008C91892B8C9348E0A281B38167FF04C030
:1017200093858C91892B08C023858C9190E030E0C3
:1017300020953095822393238C93660F2285A08178
:10174000B1818C9190E030E02095309582239323F5
:101750008C9300009285A081B1818C91892B8C9310
:101760004150D1F696850084F185E02D8081892B4A
:10177000808308950F931F93CF93DF93EC01FC01B7
:10178000E05FFD4F808181111AC040E060E4CE012E
:101790000E946E0B40E060E8CE010E946E0B00E0FC
:1017A00010E0FE01E00FF11F41E0608DCE010E94CC
:1017B0006E0B0F5F1F4F083F81E0180791F7DF9115
:1017C000CF911F910F91089520E030E0FC01E20FCE
:1017D000F31F108E2F5F3F4F283F41E03407B1F7D2
:1017E00008950F931F93CF93DF93EC018B01603823
:1017F00071052CF477FF05C000E010E002C00FE790
:1018000010E09C85EC81FD818081892B80839B8504
:10181000EA81FB818081892B80839A85E881F98127
:101820008081892B80839E85E885F9858081892B3D
:1018300080832D85EE81FF81808190E030E02095CE
:1018400030958223932380836AE070E080E090E00B
:101850000E94A0189D85EE81FF818081892B808365
:1018600040E061E2CE010E946E0B602F606840E0B4
:10187000CE010E946E0B40E066E0CE010E946E0B2E
:1018800040E063E1CE010E946E0B40E060E2CE01D9
:101890000E946E0B40E060E4CE010E946E0B40E0BF
:1018A00060E8CE010E946E0B40E06CE0CE010E9429
:1018B0006E0BCE010E94E40BCE010E94BA0B1A8A75
:1018C000198AFE01E05FFD4F1082CF5EDD4F198364
:1018D0000883DF91CF911F910F91089564357105B1
:1018E000F8F440335105E0F49A01E3E0369527958A
:1018F000EA95E1F7A4E5A29FF001A39FF00D112462
:10190000E60FF71FE80FF91F4770552781E090E0B9
:10191000042E01C0880F0A94EAF7908D982B908FBF
:1019200008956435710500F540335105E8F49A01D6
:10193000F3E036952795FA95E1F7A4E5A29FF0012B
:10194000A39FF00D1124E60FF71FE80FF91F477052
:10195000552781E090E0042E01C0880F0A94EAF731
:101960008095908D9823908F08954F925F926F92FB
:101970007F928F929F92AF92BF92CF92DF92EF921F
:10198000FF920F931F93CF93DF93EC016A0129011C
:101990008C89382F37709B8970E02D89311165C093
:1019A000869586958695621B7109989FC0011124C2
:1019B000689F3001699F700C789F700C112484E03F
:1019C000680E711C4201A12CB12C8C8986958695DC
:1019D000869590E0A816B9060CF0A6C023018601F2
:1019E0008B8990E098012C193D0928173907B4F527
:1019F000E12CF12C2B892A9DC0012B9D900D1124E7
:101A0000840D951DE989FA89E80FF91FE491F0E04A
:101A10000E2C02C0F595E7950A94E2F78F89A7018D
:101A2000480D591DB801E0FF03C0811103C006C075
:101A3000811104C0CE010E94910C03C0CE010E940E
:101A40006E0C8FEFE81AF80A88E0E816F10491F6B8
:101A50000F5F1F4F8FEF481A580AC2CF8FEFA81A97
:101A6000B80A88E0880E911CB0CF621B7109989F5C
:101A7000C001112413E0959587951A95E1F7689FA9
:101A80005001699FB00C789FB00C112484E0A80E1F
:101A9000B11CE989FA89EA0DFB1D6490712C7A0169
:101AA00007E0802E912C8B8990E097012C193D093D
:101AB00028173907CCF582018C8990E09801241908
:101AC00035092817390764F52F89C301082C02C08E
:101AD000959587950A94E2F7A801B70180FF04C0A5
:101AE000CE01211104C006C0CE01211103C00E9405
:101AF000910C02C00E946E0C81E0881A910897FE3A
:101B00000CC08FEFA81AB80AE989FA89EA0DFB1D03
:101B10006490712CB7E08B2E912C0F5F1F4FCCCFB0
:101B20008FEFE81AF80ABFCFDF91CF911F910F9185
:101B3000FF90EF90DF90CF90BF90AF909F908F90ED
:101B40007F906F905F904F9008958F929F92AF9289
:101B5000BF92CF92DF92EF92FF920F931F93CF939A
:101B6000DF937C018A015901EB0109900020E9F71C
:101B70002197C61BD70B4F3087E2580759F4F7015E
:101B800023892C9FC0012D9F900D112404E510E0A6
:101B9000081B190B0E30F7E21F0789F4F7012389A0
:101BA0002C9FC0012D9F900D112404E510E0081B0F
:101BB000190B17FF02C00F5F1F4F159507954B01BB
:101BC000C12CD12CCC16DD06A4F4F40161914F0197
:101BD000F70183898C9DA0018D9D500D1124400F2C
:101BE000511F9501C7010E94B50CFFEFCF1ADF0A04
:101BF000E9CFDF91CF911F910F91FF90EF90DF9090
:101C0000CF90BF90AF909F908F9008952F923F926A
:101C10004F925F926F927F928F929F92AF92BF92FC
:101C2000CF92DF92EF92FF920F931F93CF93DF93A8
:101C3000CDB7DEB7EA970FB6F894DEBF0FBECDBFC3
:101C40009EAB8DAB4A015B0138AF2FAB1AAF09AF2A
:101C5000411551056105710509F5E114F104D1F053
:101C6000FE01319680E090E03E2F2F2F41E0E41AF4
:101C7000F1088E159F051CF4C1920196FACFE32F4F
:101C8000F22FE80FF91F20E32083FE01E80FF91F70
:101C9000128290C080E389831A828CC077FF0BC0C8
:101CA000B094A09490948094811C911CA11CB11CB0
:101CB000DD24D39401C0D12C8E01045E1F4F380166
:101CC0009AE0292E312C412C512CC80186199709F4
:101CD00081149104A104B104D1F0C501B401A201A1
:101CE00091010E94681C20E3260FD8012D938D01DD
:101CF000A5019401261B370B480B590BCA01B901EA
:101D0000A20191010E94681C49015A01DECFF30132
:101D1000E80FF91F1082DD2011F02DE229836D2DCF
:101D200070E0FC01E60FF71FEE15FF05C4F420E09C
:101D300030E0E81AF90AE61AF70A41E050E04C0FE1
:101D40005D1F460F571F2E153F053CF4DA01A20F09
:101D5000B31FCC922F5F3F4FF6CFF7FE02C0E12CAE
:101D6000F12C40E050E020E030E06E0D7F1DA1E05E
:101D7000B0E0AC0FBD1F6A0F7B1F680E791E41508B
:101D80005109281739076CF46B01C20ED31E830169
:101D9000040F151FD8011C91D6011C932F5F3F4FD4
:101DA000EECFA1E0B0E0AC0FBD1FAE0DBF1DAE0F7A
:101DB000BF1F1C9229AD3AAD4FA958ADBE016F5F50
:101DC0007F4F8DA99EA90E94A50DEA960FB6F894A3
:101DD000DEBF0FBECDBFDF91CF911F910F91FF905E
:101DE000EF90DF90CF90BF90AF909F908F907F90BB
:101DF0006F905F904F903F902F9008952F923F9259
:101E00004F925F926F927F928F92AF92CF92EF92AA
:101E1000FF920F931F93CF93DF93CDB7DEB76D97EC
:101E20000FB6F894DEBF0FBECDBF3C011A012B01E7
:101E30001D8F0C8F4A2D8E010F5F1F4FC201B10104
:101E40000E94AF1C8EE2C81204C080E2881234C027
:101E500014C0FE013196CE014C96E817F907A9F39C
:101E600020812E3209F4C0823196F7CF8DE289832A
:101E7000FE013296E217F30771F597014C8D5D8DE7
:101E8000BE016F5F7F4FC3010E94A50D6D960FB617
:101E9000F894DEBF0FBECDBFDF91CF911F910F91A0
:101EA000FF90EF90CF90AF908F907F906F905F906A
:101EB0004F903F902F90089520E030E0A901C2019B
:101EC000B1010E94781A9E01245E3F4F87FDCECF5C
:101ED000FE0131960DC08081803211F08D3209F4FF
:101EE00080823196C7CF8081803209F4808231961A
:101EF000E217F307C1F7C1CFDC0152967C936E93D2
:101F00005197FB01849153968C9353973196E491AA
:101F10005496EC935497FB013296E4915596EC93CA
:101F20005597FB013396649156966C935697579646
:101F30001C920895CF936435710558F540335105CF
:101F400040F5DA01E3E0B595A795EA95E1F7C4E538
:101F5000CA9FF001CB9FF00D1124E60FF71F4770C9
:101F6000552761E001C0660F4A95EAF740E050E06E
:101F7000E80FF91F4217530764F4DF01A40FB51FE0
:101F800058968C915897862B58968C934F5F5F4F3D
:101F9000F1CFCF910895AF92BF92CF92DF92EF929F
:101FA000FF920F931F93CF93DF936C018B017A0104
:101FB00059016435710588F44033510570F4C0E06F
:101FC000D0E0CA15DB054CF4AE014E0D5F1DB80123
:101FD000C6010E946E0C2196F4CFDF91CF911F9124
:101FE0000F91FF90EF90DF90CF90BF90AF9008954A
:101FF0002F923F924F925F926F927F928F929F9219
:10200000AF92BF92CF92DF92EF92FF920F931F9306
:10201000CF93DF93CDB7DEB72A970FB6F894DEBF24
:102020000FBECDBF9A8389831B017A016901C90163
:10203000861B970B97FF08C08F2D7801042F182F50
:10204000832D1901C62ED82EC8018E199F0997FF1E
:102050000AC09E2D8F2D7801092F182F922D832DC8
:102060001601C92ED82EE016F10649F5C214D30484
:102070002CF4922D832D1601C92ED82E96012219EB
:102080003309A701B10189819A812A960FB6F89484
:10209000DEBF0FBECDBFDF91CF911F910F91FF909B
:1020A000EF90DF90CF90BF90AF909F908F907F90F8
:1020B0006F905F904F903F902F900C949A0F2C143C
:1020C0003D0449F50E151F052CF49E2D8F2D78012A
:1020D000092F182F98012E193F09A701B1018981F5
:1020E0009A812A960FB6F894DEBF0FBECDBFDF915E
:1020F000CF911F910F91FF90EF90DF90CF90BF9005
:10210000AF909F908F907F906F905F904F903F9097
:102110002F900C94CB0F36016218730848018E186B
:102120009F08930177FE04C0222733272619370919
:10213000C40197FE04C08827992788199909821736
:1021400093070CF062C0B401882777FD8095982F23
:102150000E94171B4B015C01B301882777FD809516
:10216000982F0E94171B9B01AC01C501B4010E946E
:102170007C1A2B013C01B701882777FD8095982FA9
:102180000E94171B4B015C01C214D304FCF420E035
:1021900030E040E05FE3C501B4010E94141A0E94E0
:1021A000E41AAB01B10189819A810E946E0CA301EE
:1021B0009201C501B4010E94131A4B015C0181E038
:1021C000281A31082C143D0414F770C020E030E0C8
:1021D00040E05FE3C501B4010E94141A0E94E41AB2
:1021E000AB01B10189819A810E946E0CA301920119
:1021F000C501B4010E94141A4B015C019FEF291A1A
:10220000390AC214D30414F751C00E151F050CF47B
:102210004DC0B101882777FD8095982F0E94171B2C
:102220001B012C01C301AA2797FDA095BA2F8B8310
:102230009C83AD83BE83C401AA2797FDA095BA2FC6
:102240008F839887A987BA870E151F057CF120E038
:1022500030E040E05FE3C201B1010E94141A0E9425
:10226000E41AA70189819A810E946E0C6B817C819E
:102270008D819E810E94171B3B014C016F817885E7
:1022800089859A850E94171B9B01AC01C401B3018B
:102290000E947C1A9B01AC01C201B1010E94141A78
:1022A0001B012C019FEFE91AF90ACECF2A960FB62F
:1022B000F894DEBF0FBECDBFDF91CF911F910F917C
:1022C000FF90EF90DF90CF90BF90AF909F908F9056
:1022D0007F906F905F904F903F902F9008958091E6
:1022E0007A0590E020917B05821B91090895209149
:1022F0007B0580917A05281750F4E22FF0E0E4582E
:10230000FA4F808190E02F5F20937B0508958FEF37
:102310009FEF0895E0917B0580917A05E81730F4EE
:10232000F0E0E458FA4F808190E008958FEF9FEF3E
:1023300008950895CF92DF92EF92FF920F931F932B
:10234000CF93DF937C01CB018A0120915605222394
:1023500089F0EB016B01C40ED51ECC15DD0569F0CB
:102360006991D701ED91FC910190F081E02DC701B9
:102370000995F3CF642F0E94FB12C801DF91CF9122
:102380001F910F91FF90EF90DF90CF900895CF9322
:10239000DF931F92CDB7DEB76983209156052223C4
:1023A000D1F020915705203240F021E030E0FC01CF
:1023B0003383228380E090E015C080915805E82F98
:1023C000F0E0E75AFA4F998190838F5F8093580528
:1023D0008093570505C061E0CE0101960E94FB1273
:1023E00081E090E00F90DF91CF910895FC0113827E
:1023F000128248EE53E060E070E0448355836683C8
:1024000077838AE391E091838083089510927B051E
:1024100010927A0510925805109257050C944612A6
:10242000862F413208F040E26CE775E00E946412AA
:1024300010927B0580937A05089521E00C94101288
:1024400081E08093560560937905109258051092AB
:10245000570508950C9420120F93062F21E0409108
:10246000570569E575E0809179050E94A8121092E0
:10247000580510925705109256050F91089561E086
:102480000C942C128AE495E00C94F6111092090633
:1024900081E0809307061092060661E082E10E94C7
:1024A000851961E083E10E948519E9EBF0E0808104
:1024B0008E7F808380818D7F808380E28093B800CF
:1024C00085E48093BC000895413208F03FC09091AC
:1024D00009069111FCCF91E090930906209307061D
:1024E0002FEF20939C051092E105240F2093E00527
:1024F0009093080690910806880F892B8093080610
:1025000080910606813041F41092060680910806FB
:102510008093BB0085EC01C085EE8093BC00809168
:1025200009068130E1F38091E105841710F44091B0
:10253000E10522EE35E0FB01D9018A2F821B8417C9
:1025400018F48D918193F9CF842F089580E0089538
:102550000F93413208F046C0909109069111FCCFCB
:1025600092E090930906009307069FEF90939C05D5
:102570001092E1054093E005FB0162EE75E0DB019E
:102580009A2F961B941718F491919D93F9CF10925E
:10259000080690910806880F892B80930806809181
:1025A0000606813041F41092060680910806809359
:1025B000BB0085EC01C085EE8093BC00222321F096
:1025C000809109068230E1F380919C058F3F61F094
:1025D00080919C05803251F080919C05803341F4BC
:1025E00083E007C081E005C080E003C082E001C055
:1025F00084E00F910895613298F420910906243007
:1026000089F46093BE05FC0180EC95E0DC012A2F83
:10261000281B261718F421912D93F9CF80E00895F7
:1026200081E0089582E0089585ED8093BC0080915B
:10263000BC0084FDFCCF10920906089585EC8093C0
:10264000BC001092090608951F920F920FB60F92C8
:1026500011242F933F934F935F936F937F938F93A7
:102660009F93AF93BF93EF93FF938091B900887FBF
:10267000803609F49CC068F5883209F45BC090F498
:10268000803109F454C038F4882309F4F5C0883047
:1026900009F44DC0F5C0883109F44CC0803209F40A
:1026A0005DC0EEC0803409F468C048F4803309F49A
:1026B00055C0883309F0E4C080939C05A8C08035DC
:1026C00009F44FC0883509F45DC0883409F0D8C0DA
:1026D000D5C0883909F4C6C0A8F4883709F467C0A2
:1026E00038F4883609F463C0803709F460C0C8C084
:1026F000883809F4B7C0803909F45FC0803809F020
:10270000BFC05BC0803B09F485C038F4803A09F44F
:1027100066C0883A09F47EC0B3C0803C09F4A6C004
:10272000883C09F4A3C0883B09F489C0A9C0809102
:10273000080610C09091E1058091E005981770F5AA
:10274000E091E10581E08E0F8093E105F0E0EE512C
:10275000FA4F80818093BB0085EC85C080939C05F7
:102760008DC0E091E10581E08E0F8093E1058091BD
:10277000BB00F0E0EE51FA4F80839091E10580912B
:10278000E0056DC0E091E10581E08E0F8093E105E9
:102790008091BB00F0E0EE51FA4F808380910706F4
:1027A00081116CC081E08093060684EA60C083E0FA
:1027B0008093090610929D05CFCF80919D058032B0
:1027C00008F050C0E0919D0581E08E0F80939D053B
:1027D0008091BB00F0E0E256FA4F8083BDCF80913C
:1027E0009D05803230F4E0919D05F0E0E256FA4F0D
:1027F00010820E94141360919D0570E0E091020622
:10280000F09103068EE995E0099510929D050E94CE
:102810001E1336C084E0809309061092BF05109203
:10282000BE05E0910406F091050609958091BE056C
:10283000811105C081E08093BE051092C005E09132
:10284000BF0581E08E0F8093BF05F0E0E054FA4FA2
:1028500080818093BB009091BF058091BE05981741
:1028600008F47ACF85E88093BC000AC085EC809399
:10287000BC001092090604C010929C050E9414131B
:10288000FF91EF91BF91AF919F918F917F916F9148
:102890005F914F913F912F910F900FBE0F901F901E
:1028A00018950895CF92DF92EF92FF92FC018589EF
:1028B0009689481B590B61097109A389B4899A014A
:1028C000AB010E94871C6B017C018FE0F594E794BB
:1028D000D794C7948A95D1F765857685882777FD43
:1028E0008095982F2BE0660F771F881F991F2A95D8
:1028F000D1F727853089442737FD4095542F2C0D7B
:102900003D1D4E1D5F1D0E94681C2C0D3D1D4E1D62
:102910005F1DCA01B901FF90EF90DF90CF9008953D
:102920001F93CF93DF931F92CDB7DEB7162F67E7C4
:1029300070E08AE495E049830E942A12612F8AE4BC
:1029400095E00E94C7114981642F8AE495E00E94B6
:10295000C7118AE495E00F90DF91CF911F910C94FD
:102960003F12CF93C62F67E770E08AE495E00E949C
:102970002A126C2F8AE495E00E94C7118AE495E040
:102980000E943F1267E770E08AE495E00E942A12F5
:1029900041E050E067E770E08AE495E00E941D1294
:1029A0008AE495E00E947711C82F8AE495E00E949E
:1029B0003F128C2FCF910895CF93DF93C62F67E7F7
:1029C00070E08AE495E00E942A126C2F8AE495E078
:1029D0000E94C7118AE495E00E943F1267E770E009
:1029E0008AE495E00E942A1242E050E067E770E036
:1029F0008AE495E00E941D128AE495E00E94771116
:102A0000D82F80E0C82F8AE495E00E947711C82B68
:102A1000D92B8AE495E00E943F12CE01DF91CF913D
:102A20000895CF93DF93EC01643008F063E068838E
:102A30008AE495E00E94061260EDCE010E94B11476
:102A4000853509F044C06AEACE010E94DC149A83FD
:102A500089836CEACE010E94DC149C838B836EEA2E
:102A6000CE010E94DC149E838D8360EBCE010E9418
:102A7000DC149A8B898B62EBCE010E94DC149C8B58
:102A80008B8B64EBCE010E94DC149E8B8D8B66EBEE
:102A9000CE010E94DC1498878F8368EBCE010E94E0
:102AA000DC149A8789876AEBCE010E94DC149C872C
:102AB0008B876CEBCE010E94DC149E878D876EEBBA
:102AC000CE010E94DC14988B8F8781E001C080E0EA
:102AD000DF91CF910895CF93DF93EC014EE264EF45
:102AE0000E94901465E070E080E090E00E94A018E1
:102AF00066EFCE01DF91CF910C94DC14CF93DF937E
:102B0000EC010E946B15AC0160E070E0CE010E9408
:102B10005214685F7F4F8F4F9F4F34E09595879594
:102B2000779567953A95D1F70E94171B20E030E022
:102B300040E251E40E947C1ADF91CF910895CF9238
:102B4000DF92EF92FF92CF93DF93EC0148814295A1
:102B5000440F440F407C4C5C64EF0E9490148881C9
:102B6000811105C065E070E080E090E012C0813026
:102B700029F468E070E080E090E00BC0823029F436
:102B80006EE070E080E090E004C06AE170E080E018
:102B900090E00E94A01866EFCE010E94DC146C0148
:102BA000E12CF12CFE2CED2CDC2CCC2468EFCE019A
:102BB0000E94B114A7019601282BCA01B9014881CE
:102BC00028E030E0241B310904C09695879577955D
:102BD00067952A95D2F7DF91CF91FF90EF90DF9024
:102BE000CF9008952F923F924F925F926F927F9273
:102BF0008F929F92AF92BF92CF92DF92EF92FF920D
:102C00000F931F93CF93DF93CDB7DEB72A970FB6FD
:102C1000F894DEBF0FBECDBF9A8789870E946B15DF
:102C20008C0189859A850E949F156D837E838F8391
:102C30009887A80160E070E089859A850E94521407
:102C40004B015C0180EA881A8FE0980AA108B1085C
:102C5000A5019401C501B4010E942A1C2B013C016D
:102C60000CE075946794579447940A95D1F7A98519
:102C7000BA8511962D903C9012971C9115960D9047
:102C8000BC91A02D0E94921C6B017C018DE0F594FB
:102C9000E794D794C7948A95D1F7E985FA85A781F7
:102CA000B085A30192010E94921CBB2797FDB095AD
:102CB000AB2FC80ED91EEA1EFB1EF2E0CF0ED11CB0
:102CC000E11CF11C32E0F594E794D794C7943A954F
:102CD000D1F780E8D80EE11CF11CE985FA85A189BD
:102CE000B289A70196010E94871CDC01CB014FE04D
:102CF000B695A795979587954A95D1F789839A8335
:102D0000AB83BC836101EE24D7FCE094FE2C52E03F
:102D1000CC0CDD1CEE1CFF1C5A95D1F7A185B285A9
:102D2000A30192010E94921C2B013C016BE075945F
:102D30006794579447946A95D1F7A381B481A5010C
:102D400094010E94921CEBE0959587957795679585
:102D5000EA95D1F7460E571E681E791EC40CD51C85
:102D6000E61CF71C012E04C0CC0CDD1CEE1CFF1C65
:102D70000A94D2F792E0C90ED11CE11CF11CC701E4
:102D8000B60124E030E040E050E00E94681C8D81F4
:102D90009E81AF81B885821B930BA40BB50B9C0160
:102DA000AD0160E573EC80E090E004C096958795F6
:102DB000779567951A95D2F70E942A1C97FD0DC04A
:102DC000660F771F881F991F29813A814B815C818B
:102DD0000E94461C49015A010CC029813A814B814D
:102DE0005C810E94461C49015A01880C991CAA1C4E
:102DF000BB1C9927B7FC9A958B2D7A2D692D9B01C9
:102E0000AC010E942A1C9B01AC01AEEDBBE00E940C
:102E1000871C6C01FF24D7FCF094EF2CA3E4B3EEE5
:102E2000A50194010E94951CBB2797FDB095AB2F7F
:102E3000C80ED91EEA1EFB1E9FECC90E9EE0D91ECD
:102E4000E11CF11CA4E0F594E794D794C794AA95EB
:102E5000D1F7C80CD91CEA1CFB1CC701B6012A9685
:102E60000FB6F894DEBF0FBECDBFDF91CF911F919B
:102E70000F91FF90EF90DF90CF90BF90AF909F9019
:102E80008F907F906F905F904F903F902F9008951C
:102E90004115510529F4EAE7F0E080818F778083BE
:102EA0006A307105B1F063FF02C088E201C088E0BA
:102EB0006770682B88E190E00FB6F894A89580932E
:102EC00060000FBE60936000E0E6F0E08081806407
:102ED0008083232BA1F483B7817F846083BFF89420
:102EE00083B7816083BF85B7806685BF8F7D85BFCF
:102EF0007894889583B78E7F83BF78940EC083B70C
:102F0000817F846083BFF89483B7816083BF7894A6
:102F1000889583B78E7F83BF7894452B29F4EAE7A1
:102F2000F0E080818068808308951F920F920FB631
:102F30000F9211248F9388E10FB6F894809360006C
:102F4000109260000FBE8F910F900FBE0F901F90D8
:102F500018958230E8F4E82FF0E0EE0FFF1FE55FF0
:102F6000F94F71836083813041F0809169008C7FDB
:102F7000842B80936900E89A089580916900440F3A
:102F8000551F440F551F837F842B80936900E99A56
:102F90000895823068F4813011F0E89801C0E99812
:102FA000E82FF0E0EE0FFF1FE55FF94F118210826E
:102FB00008951F920F920FB60F9211242F933F93F3
:102FC0004F935F936F937F938F939F93AF93BF9331
:102FD000EF93FF9380910B0690910C06892B29F0BB
:102FE000E0910B06F0910C060995FF91EF91BF91CE
:102FF000AF919F918F917F916F915F914F913F9191
:103000002F910F900FBE0F901F9018951F920F9247
:103010000FB60F9211242F933F934F935F936F93AB
:103020007F938F939F93AF93BF93EF93FF93809181
:103030000D0690910E06892B29F0E0910D06F09176
:103040000E060995FF91EF91BF91AF919F918F91DE
:103050007F916F915F914F913F912F910F900FBE94
:103060000F901F9018951F920F920FB60F92112478
:103070002F933F938F939F93AF93BF9380911006AD
:1030800090911106A0911206B091130630910F068F
:1030900026E0230F2D3720F40296A11DB11D05C097
:1030A00029E8230F0396A11DB11D20930F068093DD
:1030B000100690931106A0931206B0931306809108
:1030C000140690911506A0911606B0911706019668
:1030D000A11DB11D8093140690931506A0931606AA
:1030E000B0931706BF91AF919F918F913F912F9110
:1030F0000F900FBE0F901F9018953FB7F8948091D6
:10310000140690911506A0911606B091170626B5E3
:10311000A89B05C02F3F19F00196A11DB11D3FBF0F
:103120006627782F892F9A2F620F711D811D911D9F
:1031300043E0660F771F881F991F4A95D1F70895BE
:10314000CF92DF92EF92FF92CF93DF936B017C01DE
:103150000E947D18EB01C114D104E104F10489F04F
:103160000E94121A0E947D186C1B7D0B683E7340F2
:1031700090F381E0C81AD108E108F108C851DC4F8A
:10318000EACFDF91CF91FF90EF90DF90CF9008953D
:10319000789484B5826084BD84B5816084BD85B532
:1031A000826085BD85B5816085BDEEE6F0E08081F9
:1031B00081608083E1E8F0E010828081826080831A
:1031C000808181608083E0E8F0E08081816080839D
:1031D000E1EBF0E0808184608083E0EBF0E08081CF
:1031E00081608083EAE7F0E0808184608083808171
:1031F0008260808380818E7F8083808180688083ED
:103200001092C10008958093110108958E3008F046
:103210008E5087702091110190E4299F9001112414
:10322000822B80937C0080917A00806480937A0066
:1032300080917A0086FDFCCF809178002091790002
:1032400090E0922B0895833081F028F4813099F03A
:103250008230A1F008958730A9F08830B9F0843029
:10326000D1F4809180008F7D03C0809180008F77A2
:1032700080938000089584B58F7702C084B58F7DD8
:1032800084BD08958091B0008F7703C08091B00015
:103290008F7D8093B0000895CF93DF9390E0FC0181
:1032A000EF5FF94F2491FC01EB5EF94F8491882385
:1032B00049F190E0880F991FFC01ED5CF94FA59151
:1032C000B491875D994FFC01C591D4919FB761116D
:1032D00008C0F8948C91209582238C938881822356
:1032E0000AC0623051F4F8948C91322F30958323C8
:1032F0008C938881822B888304C0F8948C91822BD4
:103300008C939FBFDF91CF9108950F931F93CF931D
:10331000DF931F92CDB7DEB7282F30E0F901E351DC
:10332000FA4F8491F901EF5FF94F1491F901EB5EC7
:10333000F94F04910023C9F0882321F069830E948A
:1033400023196981E02FF0E0EE0FFF1FE75DF94FD1
:10335000A591B4919FB7F8948C91611103C0109519
:10336000812301C0812B8C939FBF0F90DF91CF9160
:103370001F910F91089508950E94C8180E94BB19CB
:103380000E94FD03C0E0D0E00E9457042097E1F3C3
:103390000E940000F9CF4F925F926F927F92AF929E
:1033A000BF92CF92DF92EF92FF920F931F93CF9332
:1033B000DF93CDB7DEB729013A01621B730B840B93
:1033C000950B29893A894B895C892A193B094C0953
:1033D0005D09298B3A8B4B8B5C8B9B01AC01698916
:1033E0007A898B899C890E942A1CE418F5080609B1
:1033F0001709A80197010E94681C2A0D3B1D4C1D4E
:103400005D1DCA01B901DF91CF911F910F91FF900E
:10341000EF90DF90CF90BF90AF907F906F905F90D4
:103420004F90089508955058BB27AA270ED075C114
:1034300066D130F06BD120F031F49F3F11F41EF4CF
:103440005BC10EF4E095E7FB51C1E92F77D180F322
:10345000BA17620773078407950718F071F49EF591
:103460008FC10EF4E0950B2EBA2FA02D0B01B901E0
:1034700090010C01CA01A0011124FF27591B99F0EA
:10348000593F50F4503E68F11A16F040A22F232FF6
:10349000342F4427585FF3CF469537952795A79546
:1034A000F0405395C9F77EF41F16BA0B620B730BED
:1034B000840BBAF09150A1F0FF0FBB1F661F771F5E
:1034C000881FC2F70EC0BA0F621F731F841F48F413
:1034D000879577956795B795F7959E3F08F0B3CF99
:1034E0009395880F08F09927EE0F97958795089583
:1034F000D9D008F481E008950CD00FC107D140F075
:10350000FED030F021F45F3F19F0F0C0511139C105
:10351000F3C014D198F39923C9F35523B1F3951B44
:10352000550BBB27AA2762177307840738F09F5FE4
:103530005F4F220F331F441FAA1FA9F333D00E2E53
:103540003AF0E0E830D091505040E695001CCAF7C0
:1035500029D0FE2F27D0660F771F881FBB1F261785
:1035600037074807AB07B0E809F0BB0B802DBF0158
:10357000FF2793585F4F2AF09E3F510568F0B6C071
:1035800000C15F3FECF3983EDCF386957795679535
:10359000B795F7959F5FC9F7880F911D9695879509
:1035A00097F90895E1E0660F771F881FBB1F621728
:1035B00073078407BA0720F0621B730B840BBA0BE6
:1035C000EE1F88F7E095089504D06894B111D9C032
:1035D0000895BCD088F09F5790F0B92F9927B75124
:1035E000A0F0D1F0660F771F881F991F1AF0BA95C7
:1035F000C9F712C0B13081F0C3D0B1E00895C0C0A6
:10360000672F782F8827B85F39F0B93FCCF38695BC
:1036100077956795B395D9F73EF490958095709519
:1036200061957F4F8F4F9F4F0895E89409C097FB96
:103630003EF490958095709561957F4F8F4F9F4F89
:103640009923A9F0F92F96E9BB279395F6958795CD
:1036500077956795B795F111F8CFFAF4BB0F11F490
:1036600060FF1BC06F5F7F4F8F4F9F4F16C0882337
:1036700011F096E911C0772321F09EE8872F762F6D
:1036800005C0662371F096E8862F70E060E02AF0AE
:103690009A95660F771F881FDAF7880F969587959A
:1036A00097F90895990F0008550FAA0BE0E8FEEF6F
:1036B00016161706E807F907C0F012161306E407F6
:1036C000F50798F0621B730B840B950B39F40A26EF
:1036D00061F0232B242B252B21F408950A2609F4CD
:1036E000A140A6958FEF811D811D089597F99F67D1
:1036F00080E870E060E008959FEF80EC089500247A
:103700000A941616170618060906089500240A9446
:1037100012161306140605060895092E0394000CCC
:1037200011F4882352F0BB0F40F4BF2B11F460FF5B
:1037300004C06F5F7F4F8F4F9F4F089557FD905884
:10374000440F551F59F05F3F71F04795880F97FB65
:10375000991F61F09F3F79F087950895121613061F
:103760001406551FF2CF4695F1DF08C0161617064E
:103770001806991FF1CF8695710561050894089583
:10378000E894BB2766277727CB0197F908950BD0DC
:10379000C4CFB5DF28F0BADF18F0952309F0A6CF23
:1037A000ABCF1124EECFCADFA0F3959FD1F3950FD5
:1037B00050E0551F629FF001729FBB27F00DB11DB5
:1037C000639FAA27F00DB11DAA1F649F6627B00D45
:1037D000A11D661F829F2227B00DA11D621F739F2E
:1037E000B00DA11D621F839FA00D611D221F749F3C
:1037F0003327A00D611D231F849F600D211D822F83
:10380000762F6A2F11249F5750408AF0E1F08823C9
:103810004AF0EE0FFF1FBB1F661F771F881F9150D6
:103820005040A9F79E3F510570F060CFAACF5F3F8F
:10383000ECF3983EDCF3869577956795B795F79509
:10384000E7959F5FC1F7FE2B880F911D9695879591
:1038500097F90895DB018F939F930E94871CBF9176
:10386000AF91A29F800D911DA39F900DB29F900DCF
:1038700011240895991B79E004C0991F961708F048
:10388000961B881F7A95C9F780950895A1E21A2E94
:10389000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FF4
:1038A000A217B307E407F50720F0A21BB30BE40B44
:1038B000F50B661F771F881F991F1A9469F760958B
:1038C0007095809590959B01AC01BD01CF01089545
:1038D000052E97FB1EF400940E947F1C57FD07D015
:1038E0000E94461C07FC03D04EF40C947F1C50959C
:1038F0004095309521953F4F4F4F5F4F08959095DC
:103900008095709561957F4F8F4F9F4F08950E94CE
:10391000A01CA59F900DB49F900DA49F800D911D9C
:1039200011240895B7FF0C94871C0E94871C821BEA
:10393000930B0895EE0FFF1F0590F491E02D09946D
:10394000A29FB001B39FC001A39F700D811D1124E0
:10395000911DB29F700D811D1124911D0895EF924C
:103960000F931F93CF93DF93E80147FF02C034E129
:1039700001C034E0E42FFF27E7FDF095F7FF03C017
:10398000F195E195F109E32E022F2E2FAE010E9451
:10399000D01CCE01DF91CF911F910F91EF90089530
:1039A0006F927F929F92AF92BF92CF92DF92EF92EF
:1039B000FF920F931F93CF93DF93CDB7DEB7299775
:1039C0000FB6F894DEBF0FBECDBF6A01B22E102F26
:1039D0000C3320F4FF24F394F00E02C04CE3F42ED9
:1039E0000F2D27E0AE014F5F5F4F0E944E1E798181
:1039F000272F2970213031F0E1FC06C0E0FC06C021
:103A000060E005C06DE203C06BE201C060E2AE2D74
:103A1000A07173FF36C0662311F084E001C083E01B
:103A20008B1510F4B81A01C0B12CA1110BC0F6010E
:103A30008B2D90E2882319F091938150FBCFCB0C12
:103A4000D11CB12C662331F0F601608396012F5F03
:103A50003F4F6901C6010396E2FE05C02EE4F60160
:103A6000208331E404C02EE6F601208331E6318361
:103A70002283FC012B2D30E22223F1F131932150DE
:103A8000FBCF72FF40C0662311F084E001C083E0E9
:103A90008B1510F4B81A01C0B12CA1110BC0F6019E
:103AA0008B2D90E2882319F091938150FBCFCB0CA2
:103AB000D11CB12C662331F0F601608396012F5F93
:103AC0003F4F6901C6010396E2FE07C029E4F601F3
:103AD00020832EE4218326E406C029E6F601208314
:103AE0002EE6218326E62283FC012B2D30E22223C1
:103AF00019F031932150FBCFFC01EB0DF11D108229
:103B00008EEF9FEFB7C0B1E0611101C0B0E04B2F65
:103B100050E01816190624F49C012F5F3F4F02C095
:103B200021E030E0240F351F112329F0412F50E010
:103B30004F5F5F4F02C040E050E0420F531F2B2DFC
:103B400030E04217530714F4B41A01C0B12C2E2DE3
:103B5000287159F4F6012B2D30E2222319F031930C
:103B60002150FBCFCB0CD11CB12CBB2331F0F60183
:103B7000608396012F5F3F4F6901A1110BC0F601D1
:103B80002B2D30E3222319F031932150FBCFCB0CA6
:103B9000D11CB12CF80E0A81372F3071A32E74FF7F
:103BA00003C0013309F4FA941F142CF42F2D29308B
:103BB00018F028E001C021E0682F392F97FF02C0DC
:103BC00060E030E0462F532F612C712C3EE2932EA3
:103BD000BC01621B71099B01DC01A41BB50BE1E078
:103BE000F0E0EC0FFD1FAE0FBF1FE12EF12CF194A2
:103BF000E194F1084F3FFFEF5F0731F4F601908247
:103C0000B6016F5F7F4F6B01841795074CF0241747
:103C1000350734F4BD01660D771DFB01118101C02C
:103C200010E341505109FFEF6F1A7F0AB6016F5F31
:103C30007F4F4E155F0524F0F60110836B01DACF3C
:103C40004817590739F4063320F4053319F4A11045
:103C500001C011E3F6011083FB018B2D90E2882354
:103C600019F091938150FBCFFB01EB0DF11D1082F8
:103C700080E090E029960FB6F894DEBF0FBECDBF6E
:103C8000DF91CF911F910F91FF90EF90DF90CF9038
:103C9000BF90AF909F907F906F900895283008F06C
:103CA00027E03327DA01990F311D87FD91600096D7
:103CB0006105710539F432602E5F3D9330E32A953A
:103CC000E1F708959F3F30F080387105610509F0F4
:103CD0003C5F3C5F3D93913008F08068911DDF931D
:103CE000CF931F930F93FF92EF92192F987F969582
:103CF000E92F96959695E90FFF27E956F94F9927F1
:103D00003327EE24FF24A701E701059008940794C8
:103D100028F4360FE71EF81E491F511D660F771F46
:103D2000881F991F0694A1F70590079428F4E70EC1
:103D3000F81E491F561FC11D770F881F991F661F48
:103D40000694A1F70590079428F4F80E491F561F12
:103D5000C71FD11D880F991F661F771F0694A1F7F3
:103D60000590079420F4490F561FC71FD81F990FBD
:103D7000661F771F881F0694A9F784911095177006
:103D800041F0D695C79557954795F794E7941A95BE
:103D9000C1F7EDE3F6E068941590159135916591C2
:103DA000959105907FE27395E118F10A430B560B4C
:103DB000C90BD009C0F7E10CF11E431F561FC91FE4
:103DC000D01D7EF4703311F48A95E6CFE89401504B
:103DD00030F0080F0AF40027021708F4202F23956B
:103DE000022F7A3328F079E37D932A95E9F710C002
:103DF0007D932A9589F6069497956795379517953B
:103E00001794E118F10A430B560BC90BD00998F02F
:103E100023957E9173957A3308F070E37C93201399
:103E2000B8F77E9170617D9330F0839571E37D9357
:103E300070E32A95E1F71124EF90FF900F911F9105
:103E4000CF91DF91992787FD90950895F894FFCF42
:103E500000001806800001000000040101EA55007E
:103E600000012E00743D004D61783A003234205A32
:103E70006F6F6D004D696E3A003732205A6F6F6D6B
:103E8000004261743A0000000000C7119A116F11DE
:063E900077118A1199115F
:00000001FF

Кекс для 16Mhz:

:100000000C949E030C94D9170C9406180C94C603F8
:100010000C94C6030C94C6030C9495170C94C60359
:100020000C94C6030C94C6030C94C6030C94C6032C
:100030000C94C6030C94C6030C94C6030C94C6031C
:100040000C9433180C94C6030C94C6030C94C6038A
:100050000C94C6030C94C6030C94C6030C94C603FC
:100060000C9424130C94C6030406205F00000003C4
:10007000A000C00C00F94F806BEB00988C8052A55B
:100080008003000001C88089C00050850021C200A3
:10009000084000208200002000188C00FA2F804BBE
:1000A000E0805A66808AA500E08F80EAAB0072A9E2
:1000B000009A8C00FAAF804AA70001400009400076
:1000C00021488051450089420042660072A6807A2C
:1000D0008780FAA500722500FA2700FAA880FA881E
:1000E00000722B00F88F808BE8808BE800F88D8001
:1000F000F82080F90F80F9CF80722700FA8400720F
:100100002740FA85804AA90083E800F02F00E06EBE
:1001100000F0EF00D88D80C0EC009AAC8003E8803E
:10012000C081808BE000420400082080020400317E
:100130002380F92300312480312F8031628023EA2B
:1001400000255380F9038002E00006E000F84280B9
:1001500003E0007987803903803123007D2300315B
:1001600027C078840029400043E4007027006066BF
:100170000070670048C48074578059E68023E88087
:100180000360008BE200610C000E182D0D000000D2
:1001900000000000000000000000000000103838DF
:1001A00038383838383810000000000000000000EF
:1001B000000000000000000000000000000000003F
:1001C000000000000000000000000000000000002F
:1001D000000000000000000040E0E04000000000DF
:1001E00000000002060E0E0E0E0E0E0602000000AB
:1001F000001038383838383838381000000000809F
:10020000C0E0E0E0E0E0E0C080000000FCFAF60EB4
:100210000E0E0E0E0EF6FAFC0000EFC78300000073
:1002200000000083C7EF00007FBFDFE0E0E0E0E018
:10023000E0DFBF7F0000000000000000000000F0D1
:10024000F8FC000000000000000000000083C7EF81
:1002500000000000000000000000001F3F7F0000C1
:100260000002060E0E0E0E0E0EF6FAFC0000E0D096
:10027000B83838383838383B170F00007FBFDFE018
:10028000E0E0E0E0E0C0800000000002060E0E0E9C
:100290000E0E0EF6FAFC00000010383838383838E8
:1002A00038BBD7EF00000080C0E0E0E0E0E0E0DF36
:1002B000BF7F0000FCF8F0000000000000F0F8FC38
:1002C00000000F173B383838383838BBD7EF0000FC
:1002D0000000000000000000001F3F7F0000FCFA4B
:1002E000F60E0E0E0E0E0E06020000000F173B3823
:1002F0003838383838B8D0E000000080C0E0E0E09E
:10030000E0E0E0DFBF7F0000FCFAF60E0E0E0E0EFE
:100310000E0602000000EFD7BB383838383838B83E
:10032000D0E000007FBFDFE0E0E0E0E0E0DFBF7FA3
:1003300000000002060E0E0E0E0E0EF6FAFC000075
:1003400000000000000000000083C7EF0000000074
:10035000000000000000001F3F7F0000FCFAF60EC6
:100360000E0E0E0E0EF6FAFC0000EFD7BB38383832
:10037000383838BBD7EF00007FBFDFE0E0E0E0E0D7
:10038000E0DFBF7F0000FCFAF60E0E0E0E0E0EF63A
:10039000FAFC00000F173B383838383838BBD7EF35
:1003A00000000080C0E0E0E0E0E0E0DFBF7F0006AA
:1003B00008205F0000000000000000002F00000087
:1003C000000700070000147F147F1400242A7F2AEE
:1003D00012002313086462003649552250000005BC
:1003E00003000000001C224100000041221C00000C
:1003F00014083E08140008083E0808000000A06029
:1004000000000808080808000060600000002010D4
:10041000080402003E5149453E0000427F40000072
:100420004261514946002141454B31001814127F69
:1004300010002745454539003C4A494930000171C3
:1004400009050300364949493600064949291E0075
:100450000036360000000056360000000814224125
:1004600000001414141414000041221408000201A6
:1004700051090600324959513E007C1211127C008C
:100480007F49494936003E41414122007F41412296
:100490001C007F49494941007F09090901003E418B
:1004A00049497A007F0808087F0000417F41000029
:1004B0002040413F01007F08142241007F4040401E
:1004C00040007F020C027F007F0408107F003E4145
:1004D00041413E007F09090906003E4151215E006D
:1004E0007F091929460046494949310001017F0128
:1004F00001003F4040403F001F2040201F003F4080
:1005000038403F00631408146300070870080700B0
:10051000615149454300007F414100AA55AA55AAAF
:1005200055000041417F00000402010204004040E8
:10053000404040000003050000002054545478005F
:100540007F484444380038444444200038444448F8
:100550007F00385454541800087E0901020018A482
:10056000A4A47C007F080404780000447D400000BF
:100570004080847D00007F102844000000417F40BF
:1005800000007C04180478007C08040478003844D7
:1005900044443800FC242424180018242418FC00A7
:1005A0007C0804040800485454542000043F44408C
:1005B00020003C4040207C001C2040201C003C408F
:1005C00030403C004428102844001CA0A0A07C001F
:1005D0004464544C440000107C8200000000FF0082
:1005E000000000827C1000000006090906000000DF
:1005F00008000201000003040700000000000000E2
:1006000000010204081020408001020408102001AB
:100610000204081020040404040404040402020276
:100620000202020303030303030000000025002865
:10063000002B0000000000240027002A0000407A60
:1006400010F35A00A0724E18090010A5D4E800005B
:10065000E87648170000E40B54020000CA9A3B00F9
:100660000000E1F505000080969800000040420F70
:10067000000000A08601000000102700000000E834
:1006800003000000006400000000000A00000000F9
:10069000000100000000002C76D888DC674F08239A
:1006A000DFC1DFAE59E1B1B796E5E3E453C63AE600
:1006B00051997696E8E6C28426EB898C9B62ED40E0
:1006C0007C6FFCEFBC9C9F40F2BAA56FA5F490052F
:1006D0005A2AF75C936B6CF9676DC11BFCE0E40D63
:1006E00047FEF520E6B500D0ED902E030094357757
:1006F000050080841E080000204E0A000000C80C7F
:10070000333333330F986E12831141EF8D211489E7
:100710003BE65516CFFEE6DB18D1844B381BF77C41
:100720001D901DA4BBE424203284725E228100C986
:10073000F124ECA1E53D2700B70A421211241FBEA7
:10074000CFEFD8E0DEBFCDBF11E0A0E0B1E0E0E543
:10075000FEE302C005900D92A634B107D9F726E05A
:10076000A6E4B1E001C01D92A831B207E1F717E09D
:10077000CCE3D7E004C02297FE010E949C1CC83342
:10078000D107C9F70E94BC190C94261F0C940000D5
:1007900080914C01811130C081E080934C0180E058
:1007A0000E94C91780910A0118162CF480914E01FD
:1007B0008F5F80934E0182E080930A0181E08093F5
:1007C0000C0180934D0180914E01853014F0109200
:1007D0004E0120E030E040E050E065E070E08AE06B
:1007E00096E00E94481740E050E068EC73E080E03B
:1007F0000E94A91710924C01089566E470E08FE4FE
:1008000091E00E94F10B6FEA73E08FE491E00E94A7
:100810007C0F8AE495E00E94061283E00E9403198F
:1008200060E080E00E944C1920E030E040E050E0C1
:1008300066E070E08AE096E00E94481762E083E399
:1008400095E00E94111560E082E00E944C1961E081
:1008500082E00E94851961E08BE00E944C1961E002
:100860008CE00E944C1983E395E00E94F21560939E
:100870002F05709330058093310590933205DC018C
:10088000CB018C569843A140B109809318059093F1
:100890001905A0931A05B0931B05E0912905F0E016
:1008A000EE0FFF1FEA59FC4F9183808308953F921A
:1008B0004F925F926F927F928F929F92AF92BF9270
:1008C000CF92DF92EF92FF920F931F93CF93DF931C
:1008D00060914601709147018091480190914901D2
:1008E000653071058105910578F025E030E040E044
:1008F00050E00E94461C672B682B692B09F0E2C56B
:1009000080914B018111DEC580E00E94C91783E30D
:1009100095E00E94F21560932F0570933005809347
:1009200031059093320583E395E00E947E15609334
:100930002B0570932C0580932D0590932E0540E098
:1009400050E068EC73E080E00E94A91780910A01F2
:10095000181674F461E08BE00E94851960E08CE069
:100960000E94851980910A01815080930A0108C074
:1009700060E08BE00E94851961E08CE00E9485199F
:1009800040912F05509130056091310570913205ED
:100990004D3188E3580781E068077105F0F0DB010D
:1009A000CA018C569843A140B109009118051091D5
:1009B000190520911A0530911B05800F911FA21F68
:1009C000B31FB695A7959795879580931805909333
:1009D0001905A0931A05B0931B0580914A01843133
:1009E000B8F181E080930C0180912905883D59F48C
:1009F000E6E6F3E0828193818193919395E0E6317D
:100A0000F907C1F703C08F5F80932905E09129059D
:100A1000F0E0EE0FFF1FEA59FC4F8091180590910E
:100A20001905918380834D36C8E35C07C1E06C07EC
:100A3000710560F04C5658436140710940931805A8
:100A40005093190560931A0570931B0510924A0183
:100A500080910B01882309F435C580914E018230C5
:100A600009F4B6C23CF4882309F444C0813009F487
:100A7000EFC01EC5833009F4E5C3843009F018C502
:100A800081E080930C018FE491E00E94E40B6FEA17
:100A900073E08FE491E00E947C0F2FE030E040E0B3
:100AA00050E061E371E08FE491E00E94A50D80E0E9
:100AB0000E940619BC01882777FD8095982F0E9417
:100AC000171B2AE939E940E353E40E947C1AAB0181
:100AD000BC0130E2832EA12CB12CEEE2CE2EFFE041
:100AE000EF2EF12C08E110E022E08FE491E00E946B
:100AF000FE0EDEC481E080930C018FE491E00E9441
:100B0000E40B69E871E08FE491E00E947C0F609152
:100B10002F057091300580913105909132050E942A
:100B2000151B2DEC3CE445E053E40E947C1A0E9426
:100B3000E41AAB01BC01E0E2CE2EF3E0EF2EF12C83
:100B400005E010E02FE030E08FE491E00E94060E17
:100B50006FEA73E08FE491E00E947C0F26E130E0C1
:100B60004CE350E062E171E08FE491E00E94A50D5A
:100B700060912F057091300580913105909132057B
:100B80000E94151B2DEC3CE445E053E40E947C1AC6
:100B90002B013C010E94E41A882777FD8095982F4D
:100BA0000E94171B9B01AC01C301B2010E94131AE2
:100BB00020E030E048EC52E40E94C71B0E94E91A92
:100BC000862F60932A05CAE06C2F0E943A1C482F9A
:100BD00050E060E070E0EE24E394F12C06E110E0D8
:100BE00022E430E08FE491E00E94060E80912A0515
:100BF0006C2F0E943A1C492F50E060E070E028E41E
:100C000030E08FE491E00E94060E23E230E044E100
:100C100050E064E171E08FE491E00E94A50D409105
:100C20002B0550912C0560912D0570912E05B0E299
:100C30008B2EA12CB12CCEE2CC2ED3E2ED2EF12CBA
:100C400000E210E021E08FE491E00E94FE0E30C44B
:100C500080910C01882309F42BC4009129050834E4
:100C600018F41092280504C088EB800F80932805A3
:100C700085E395E0A0E0B0E080931C0590931D050E
:100C8000A0931E05B0931F05C091280580910D010A
:100C900090910E01A0910F01B0911001EC2EF12C5A
:100CA000F701EE0FFF1FEA59FC4F20E030E010E0A3
:100CB000A9014E0D5F1D401751073CF5A901440FD6
:100CC000551F4E0F5F1FEA014881598160E070E0B7
:100CD00084179507A607B70724F486569D4FAF4F94
:100CE000BF4F2C013D01D5E34D1AD5E05D0A6108E7
:100CF0007108441555056605770524F48A59924014
:100D0000A109B1092F5F3F4FD3CF80930D0190937D
:100D10000E01A0930F01B0931001809320059093D2
:100D20002105A0932205B093230585539540A10981
:100D3000B1098093240590932505A0932605B093CF
:100D400027058FE491E00E94E40B6FEA73E08FE4E3
:100D500091E00E947C0F88E48093650360902905F0
:100D6000712C4301880C991CF401EA59FC4F4F0186
:100D7000C0E0D0E0A0E33A2EB8E04B2E1FE2512EA7
:100D80008091280590E09E01260D371D821793075C
:100D90000CF04DC0E0902405F0902505009126054B
:100DA00010912705209120053091210540912205C1
:100DB00050912305FE01EE0FFF1FE80DF91D608124
:100DC000718180E090E01F921F921F923F92E8E0B5
:100DD000AE2EB12CC12CD12C0E94CB190F900F90AC
:100DE0000F900F9068301CF06093640302C0409233
:100DF000640380916403803314F050926403609123
:100E00006503772767FD709540916403552747FD7B
:100E100050950FE210E09B018FE491E00E94F80FE3
:100E2000809165038150809365032197A9CF6091DC
:100E30002F057091300580913105909132050E9407
:100E4000151B2DEC3CE445E053E40E947C1AAB01F9
:100E5000BC01D0E28D2EA12CB12C1EE2C12EE12CC2
:100E6000F12C05E010E022E08FE491E00E94FE0EFC
:100E700040912B0550912C0560912D0570912E0508
:100E80000CE310E021E08FE491E00E94FE0E68E6A2
:100E900070E08FE491E00E947C0F60910D017091F1
:100EA0000E0180910F01909110016459774C8E4F83
:100EB0009F4F0E94171B2DEC3CE445E053E40E9439
:100EC0007C1A20E030EE4EE254E40E94131A0E9495
:100ED000E41AAB01BC0100E2C02E82E0E82EF12C46
:100EE00008E010E02CE430E08FE491E00E94060E70
:100EF00040900D0150900E0160900F017090100114
:100F0000FCE64F0EF8E35F1EF1E06F1E711C60916E
:100F10001C0570911D0580911E0590911F0522E012
:100F200030E040E050E00E94681C421A530A640A14
:100F3000750AC301B2010E94171B2DEC3CE445E089
:100F400053E40E947C1A20E030EE4EE254E40E940A
:100F5000131A0E94E41AAB01BC0109E110E02CE471
:100F600030E08FE491E00E94060E60910D017091D7
:100F70000E0180910F01909110016459774C8E4FB2
:100F80009F4F00911C0510911D0520911E05309169
:100F90001F05601B710B820B930B0E94171B2DEC1E
:100FA0003CE445E053E40E947C1A20E030EE4EE23F
:100FB00054E40E94131A0E94E41AAB01BC010AE235
:100FC00010E02CE430E08FE491E00E94060E70C245
:100FD00080910C01882309F46BC220912905822E8F
:100FE000912CD401AA0FBB1FAA59BC4F8D919C9183
:100FF000A0E0B0E08093240590932505A0932605FA
:10100000B09327058093200590932105A093220596
:10101000B09323052834E8F41092280500912805A0
:1010200010E08091240590912505A0912605B091AE
:10103000270540912005509121056091220570916E
:101040002305E401CC0FDD1FCA59DC4F20E030E05E
:101050001EC0285420932805E1CF7901EE0CFF1C17
:10106000EC0EFD1EF70140805180612C712C48165A
:1010700059066A067B0614F4D301C20144155505CE
:101080006605770514F4B301A201215031097901F5
:10109000E80CF91C0E151F0504F3809324059093AA
:1010A0002505A0932605B09327054093200550936E
:1010B00021056093220570932305481B590B6A0B89
:1010C0007B0B40931C0550931D0560931E05709388
:1010D0001F058FE491E00E94E40B68E670E08FE466
:1010E00091E00E947C0F8DE48093650380911C0544
:1010F00090911D05A0911E05B0911F0518161906A7
:101100001A061B06B4F120E030E040E050E067E151
:1011100071E08FE491E00E94A50D6091200570912F
:10112000210580912205909123056459774C8E4FBB
:101130009F4F0E94171B2DEC3CE445E053E40E94B6
:101140007C1AAB01BC0180E2882EA12CB12C9EE25E
:10115000C92EE12CF12C04E110E022E08FE491E0B3
:101160000E94FE0E20E030E04FE057E26CE171E0BB
:101170000CC180902905912C7401EE0CFF1CC70155
:101180008A599C4F7C01C0E0D0E08091280590E016
:101190009E01280D391D821793070CF0B4CFFE0174
:1011A000EE0FFF1FEE0DFF1D808191812091200524
:1011B000309121054091220550912305281B390BC0
:1011C00041095109A4E2B0E00E94871C20911C054E
:1011D00030911D0540911E0550911F050E94681C0D
:1011E0002A5F2093640380916503022F112707FD76
:1011F00010958D3441F4A8016DE470E08FE491E026
:101200000E946E0C12C0282F332727FD3095409185
:101210006203552747FD509560916303772767FD6B
:1012200070958FE491E00E94F80F809165038093A0
:1012300063039091640390936203815080936503EC
:101240002197A3CF80910C01882309F431C1C0916B
:101250002905EC2EF12CF701EE0FFF1FEA59FC4F88
:1012600080819181A0E0B0E0AC01BD0120E030E0E0
:1012700089010E0D1F1D10161106DCF48901000FE7
:10128000111F0E0F1F1FE80148805980612C712C1F
:10129000481659066A067B0614F4D301C2014415A8
:1012A00055056605770514F4B301A20123503109F1
:1012B000DFCF8093240590932505A0932605B09356
:1012C00027054093200550932105609322057093D4
:1012D0002305481B590B6A0B7B0B40931C0550934D
:1012E0001D0560931E0570931F058FE491E00E9419
:1012F000E40B68E670E08FE491E00E947C0F8DE4DF
:101300008093650380911C0590911D05A0911E0599
:10131000B0911F05181619061A061B060CF462C0B8
:1013200020E030E040E050E067E171E08FE491E0E0
:101330000E94A50D609120057091210580912205E4
:10134000909123056459774C8E4F9F4F0E94171B35
:101350002DEC3CE445E053E40E947C1AAB01BC0157
:10136000D0E28D2EA12CB12C1EE2C12EE12CF12C4D
:1013700004E110E022E08FE491E00E94FE0E20E004
:1013800030E04FE057E269E271E08FE491E00E94C3
:10139000A50D2AE230E040E050E064E271E08FE425
:1013A00091E00E94A50D6091240570912505809122
:1013B0002605909127056459774C8E4F9F4F0E94C8
:1013C000171B2DEC3CE445E053E40E947C1AAB0172
:1013D000BC01CAE2EC2EF12C22E08FE491E00E94E5
:1013E000FE0E66C080902905912C7401EE0CFF1C46
:1013F000F701EA59FC4F7F01C0E0D0E0CE01880D33
:10140000991D181619060CF08BCFFE01EE0FFF1F69
:10141000EE0DFF1D808191812091200530912105E5
:101420004091220550912305281B390B4109510990
:10143000A4E2B0E00E94871C20911C0530911D059C
:1014400040911E0550911F050E94681C2A5F209341
:10145000640380916503022F112707FD10958D34D9
:1014600041F4A8016DE470E08FE491E00E946E0CFD
:1014700012C0282F332727FD30954091620355274E
:1014800047FD509560916303772767FD70958FE462
:1014900091E00E94F80F809165038093630390911F
:1014A0006403909362038150809365032397A6CFD2
:1014B00080910C01882331F08FE491E00E94BA0BF7
:1014C00010920C0140E050E068EC73E080E00E9474
:1014D000A91720E030E040E050E068E070E08AE0EA
:1014E00096E00E94481780914D01811106C08091BD
:1014F0004B018F5F80934B010AC010924D011092F7
:1015000046011092470110924801109249018091C2
:101510004B018F30D0F080914A018F5F80934A0158
:101520008091460190914701A0914801B0914901F5
:101530000196A11DB11D8093460190934701A09390
:101540004801B093490110924B01DF91CF911F9157
:101550000F91FF90EF90DF90CF90BF90AF909F9052
:101560008F907F906F905F904F903F900895EF9293
:10157000FF920F931F9383E395E00E94511487E03D
:10158000E82EF12C06E010E025E030E044E050E0E9
:1015900063E070E08FE491E00E94D30A1F910F9105
:1015A000FF90EF900895AF92BF92DF92EF92FF927B
:1015B0000F931F93CF93DF9300D0CDB7DEB75C01BD
:1015C000D62E862F972FFC01EB5EF94FE491F0E0C9
:1015D000EE0FFF1FE75DF94F65917491F50171837F
:1015E0006083FC01EF5FF94F8491F5018287FA0176
:1015F000EB5EF94FE491F0E0EE0FFF1FE75DF94F6E
:1016000065917491F50173836283FA01EF5FF94F7D
:101610008491F5018387F901EB5EF94FE491F0E0E5
:10162000EE0FFF1FE75DF94F85919491F5019583CA
:101630008483F901EF5FF94F6491F5016487F80144
:10164000EB5EF94FE491F0E0EE0FFF1FE75DF94F1D
:1016500085919491F50197838683F801EF5FF94FA7
:101660006491F5016587F701EB5EF94FE491F0E0D5
:10167000EE0FFF1FE75DF94F85919491F50191877A
:101680008087F701EF5FF94FA491F501A68761E02C
:101690008D2D2A8349830E944C1961E04981842F52
:1016A0000E944C1961E02A81822F0E944C1961E04E
:1016B000802F0E944C1961E08E2D0E944C19F5017B
:1016C000D786008B0F900F90DF91CF911F910F91D4
:1016D000FF90EF90DF90BF90AF900895FC012685BA
:1016E000A085B1858C9190E030E0209530958223E3
:1016F00093238C93A481B581411109C024858C91D9
:1017000090E030E0209530958223932303C09485A8
:101710008C91892B8C9348E0A281B38167FF04C030
:1017200093858C91892B08C023858C9190E030E0C3
:1017300020953095822393238C93660F2285A08178
:10174000B1818C9190E030E02095309582239323F5
:101750008C9300009285A081B1818C91892B8C9310
:101760004150D1F696850084F185E02D8081892B4A
:10177000808308950F931F93CF93DF93EC01FC01B7
:10178000E05FFD4F808181111AC040E060E4CE012E
:101790000E946E0B40E060E8CE010E946E0B00E0FC
:1017A00010E0FE01E00FF11F41E0608DCE010E94CC
:1017B0006E0B0F5F1F4F083F81E0180791F7DF9115
:1017C000CF911F910F91089520E030E0FC01E20FCE
:1017D000F31F108E2F5F3F4F283F41E03407B1F7D2
:1017E00008950F931F93CF93DF93EC018B01603823
:1017F00071052CF477FF05C000E010E002C00FE790
:1018000010E09C85EC81FD818081892B80839B8504
:10181000EA81FB818081892B80839A85E881F98127
:101820008081892B80839E85E885F9858081892B3D
:1018300080832D85EE81FF81808190E030E02095CE
:1018400030958223932380836AE070E080E090E00B
:101850000E94A0189D85EE81FF818081892B808365
:1018600040E061E2CE010E946E0B602F606840E0B4
:10187000CE010E946E0B40E066E0CE010E946E0B2E
:1018800040E063E1CE010E946E0B40E060E2CE01D9
:101890000E946E0B40E060E4CE010E946E0B40E0BF
:1018A00060E8CE010E946E0B40E06CE0CE010E9429
:1018B0006E0BCE010E94E40BCE010E94BA0B1A8A75
:1018C000198AFE01E05FFD4F1082CF5EDD4F198364
:1018D0000883DF91CF911F910F91089564357105B1
:1018E000F8F440335105E0F49A01E3E0369527958A
:1018F000EA95E1F7A4E5A29FF001A39FF00D112462
:10190000E60FF71FE80FF91F4770552781E090E0B9
:10191000042E01C0880F0A94EAF7908D982B908FBF
:1019200008956435710500F540335105E8F49A01D6
:10193000F3E036952795FA95E1F7A4E5A29FF0012B
:10194000A39FF00D1124E60FF71FE80FF91F477052
:10195000552781E090E0042E01C0880F0A94EAF731
:101960008095908D9823908F08954F925F926F92FB
:101970007F928F929F92AF92BF92CF92DF92EF921F
:10198000FF920F931F93CF93DF93EC016A0129011C
:101990008C89382F37709B8970E02D89311165C093
:1019A000869586958695621B7109989FC0011124C2
:1019B000689F3001699F700C789F700C112484E03F
:1019C000680E711C4201A12CB12C8C8986958695DC
:1019D000869590E0A816B9060CF0A6C023018601F2
:1019E0008B8990E098012C193D0928173907B4F527
:1019F000E12CF12C2B892A9DC0012B9D900D1124E7
:101A0000840D951DE989FA89E80FF91FE491F0E04A
:101A10000E2C02C0F595E7950A94E2F78F89A7018D
:101A2000480D591DB801E0FF03C0811103C006C075
:101A3000811104C0CE010E94910C03C0CE010E940E
:101A40006E0C8FEFE81AF80A88E0E816F10491F6B8
:101A50000F5F1F4F8FEF481A580AC2CF8FEFA81A97
:101A6000B80A88E0880E911CB0CF621B7109989F5C
:101A7000C001112413E0959587951A95E1F7689FA9
:101A80005001699FB00C789FB00C112484E0A80E1F
:101A9000B11CE989FA89EA0DFB1D6490712C7A0169
:101AA00007E0802E912C8B8990E097012C193D093D
:101AB00028173907CCF582018C8990E09801241908
:101AC00035092817390764F52F89C301082C02C08E
:101AD000959587950A94E2F7A801B70180FF04C0A5
:101AE000CE01211104C006C0CE01211103C00E9405
:101AF000910C02C00E946E0C81E0881A910897FE3A
:101B00000CC08FEFA81AB80AE989FA89EA0DFB1D03
:101B10006490712CB7E08B2E912C0F5F1F4FCCCFB0
:101B20008FEFE81AF80ABFCFDF91CF911F910F9185
:101B3000FF90EF90DF90CF90BF90AF909F908F90ED
:101B40007F906F905F904F9008958F929F92AF9289
:101B5000BF92CF92DF92EF92FF920F931F93CF939A
:101B6000DF937C018A015901EB0109900020E9F71C
:101B70002197C61BD70B4F3087E2580759F4F7015E
:101B800023892C9FC0012D9F900D112404E510E0A6
:101B9000081B190B0E30F7E21F0789F4F7012389A0
:101BA0002C9FC0012D9F900D112404E510E0081B0F
:101BB000190B17FF02C00F5F1F4F159507954B01BB
:101BC000C12CD12CCC16DD06A4F4F40161914F0197
:101BD000F70183898C9DA0018D9D500D1124400F2C
:101BE000511F9501C7010E94B50CFFEFCF1ADF0A04
:101BF000E9CFDF91CF911F910F91FF90EF90DF9090
:101C0000CF90BF90AF909F908F9008952F923F926A
:101C10004F925F926F927F928F929F92AF92BF92FC
:101C2000CF92DF92EF92FF920F931F93CF93DF93A8
:101C3000CDB7DEB7EA970FB6F894DEBF0FBECDBFC3
:101C40009EAB8DAB4A015B0138AF2FAB1AAF09AF2A
:101C5000411551056105710509F5E114F104D1F053
:101C6000FE01319680E090E03E2F2F2F41E0E41AF4
:101C7000F1088E159F051CF4C1920196FACFE32F4F
:101C8000F22FE80FF91F20E32083FE01E80FF91F70
:101C9000128290C080E389831A828CC077FF0BC0C8
:101CA000B094A09490948094811C911CA11CB11CB0
:101CB000DD24D39401C0D12C8E01045E1F4F380166
:101CC0009AE0292E312C412C512CC80186199709F4
:101CD00081149104A104B104D1F0C501B401A201A1
:101CE00091010E94681C20E3260FD8012D938D01DD
:101CF000A5019401261B370B480B590BCA01B901EA
:101D0000A20191010E94681C49015A01DECFF30132
:101D1000E80FF91F1082DD2011F02DE229836D2DCF
:101D200070E0FC01E60FF71FEE15FF05C4F420E09C
:101D300030E0E81AF90AE61AF70A41E050E04C0FE1
:101D40005D1F460F571F2E153F053CF4DA01A20F09
:101D5000B31FCC922F5F3F4FF6CFF7FE02C0E12CAE
:101D6000F12C40E050E020E030E06E0D7F1DA1E05E
:101D7000B0E0AC0FBD1F6A0F7B1F680E791E41508B
:101D80005109281739076CF46B01C20ED31E830169
:101D9000040F151FD8011C91D6011C932F5F3F4FD4
:101DA000EECFA1E0B0E0AC0FBD1FAE0DBF1DAE0F7A
:101DB000BF1F1C9229AD3AAD4FA958ADBE016F5F50
:101DC0007F4F8DA99EA90E94A50DEA960FB6F894A3
:101DD000DEBF0FBECDBFDF91CF911F910F91FF905E
:101DE000EF90DF90CF90BF90AF909F908F907F90BB
:101DF0006F905F904F903F902F9008952F923F9259
:101E00004F925F926F927F928F92AF92CF92EF92AA
:101E1000FF920F931F93CF93DF93CDB7DEB76D97EC
:101E20000FB6F894DEBF0FBECDBF3C011A012B01E7
:101E30001D8F0C8F4A2D8E010F5F1F4FC201B10104
:101E40000E94AF1C8EE2C81204C080E2881234C027
:101E500014C0FE013196CE014C96E817F907A9F39C
:101E600020812E3209F4C0823196F7CF8DE289832A
:101E7000FE013296E217F30771F597014C8D5D8DE7
:101E8000BE016F5F7F4FC3010E94A50D6D960FB617
:101E9000F894DEBF0FBECDBFDF91CF911F910F91A0
:101EA000FF90EF90CF90AF908F907F906F905F906A
:101EB0004F903F902F90089520E030E0A901C2019B
:101EC000B1010E94781A9E01245E3F4F87FDCECF5C
:101ED000FE0131960DC08081803211F08D3209F4FF
:101EE00080823196C7CF8081803209F4808231961A
:101EF000E217F307C1F7C1CFDC0152967C936E93D2
:101F00005197FB01849153968C9353973196E491AA
:101F10005496EC935497FB013296E4915596EC93CA
:101F20005597FB013396649156966C935697579646
:101F30001C920895CF936435710558F540335105CF
:101F400040F5DA01E3E0B595A795EA95E1F7C4E538
:101F5000CA9FF001CB9FF00D1124E60FF71F4770C9
:101F6000552761E001C0660F4A95EAF740E050E06E
:101F7000E80FF91F4217530764F4DF01A40FB51FE0
:101F800058968C915897862B58968C934F5F5F4F3D
:101F9000F1CFCF910895AF92BF92CF92DF92EF929F
:101FA000FF920F931F93CF93DF936C018B017A0104
:101FB00059016435710588F44033510570F4C0E06F
:101FC000D0E0CA15DB054CF4AE014E0D5F1DB80123
:101FD000C6010E946E0C2196F4CFDF91CF911F9124
:101FE0000F91FF90EF90DF90CF90BF90AF9008954A
:101FF0002F923F924F925F926F927F928F929F9219
:10200000AF92BF92CF92DF92EF92FF920F931F9306
:10201000CF93DF93CDB7DEB72A970FB6F894DEBF24
:102020000FBECDBF9A8389831B017A016901C90163
:10203000861B970B97FF08C08F2D7801042F182F50
:10204000832D1901C62ED82EC8018E199F0997FF1E
:102050000AC09E2D8F2D7801092F182F922D832DC8
:102060001601C92ED82EE016F10649F5C214D30484
:102070002CF4922D832D1601C92ED82E96012219EB
:102080003309A701B10189819A812A960FB6F89484
:10209000DEBF0FBECDBFDF91CF911F910F91FF909B
:1020A000EF90DF90CF90BF90AF909F908F907F90F8
:1020B0006F905F904F903F902F900C949A0F2C143C
:1020C0003D0449F50E151F052CF49E2D8F2D78012A
:1020D000092F182F98012E193F09A701B1018981F5
:1020E0009A812A960FB6F894DEBF0FBECDBFDF915E
:1020F000CF911F910F91FF90EF90DF90CF90BF9005
:10210000AF909F908F907F906F905F904F903F9097
:102110002F900C94CB0F36016218730848018E186B
:102120009F08930177FE04C0222733272619370919
:10213000C40197FE04C08827992788199909821736
:1021400093070CF062C0B401882777FD8095982F23
:102150000E94171B4B015C01B301882777FD809516
:10216000982F0E94171B9B01AC01C501B4010E946E
:102170007C1A2B013C01B701882777FD8095982FA9
:102180000E94171B4B015C01C214D304FCF420E035
:1021900030E040E05FE3C501B4010E94141A0E94E0
:1021A000E41AAB01B10189819A810E946E0CA301EE
:1021B0009201C501B4010E94131A4B015C0181E038
:1021C000281A31082C143D0414F770C020E030E0C8
:1021D00040E05FE3C501B4010E94141A0E94E41AB2
:1021E000AB01B10189819A810E946E0CA301920119
:1021F000C501B4010E94141A4B015C019FEF291A1A
:10220000390AC214D30414F751C00E151F050CF47B
:102210004DC0B101882777FD8095982F0E94171B2C
:102220001B012C01C301AA2797FDA095BA2F8B8310
:102230009C83AD83BE83C401AA2797FDA095BA2FC6
:102240008F839887A987BA870E151F057CF120E038
:1022500030E040E05FE3C201B1010E94141A0E9425
:10226000E41AA70189819A810E946E0C6B817C819E
:102270008D819E810E94171B3B014C016F817885E7
:1022800089859A850E94171B9B01AC01C401B3018B
:102290000E947C1A9B01AC01C201B1010E94141A78
:1022A0001B012C019FEFE91AF90ACECF2A960FB62F
:1022B000F894DEBF0FBECDBFDF91CF911F910F917C
:1022C000FF90EF90DF90CF90BF90AF909F908F9056
:1022D0007F906F905F904F903F902F9008958091E6
:1022E0007A0590E020917B05821B91090895209149
:1022F0007B0580917A05281750F4E22FF0E0E4582E
:10230000FA4F808190E02F5F20937B0508958FEF37
:102310009FEF0895E0917B0580917A05E81730F4EE
:10232000F0E0E458FA4F808190E008958FEF9FEF3E
:1023300008950895CF92DF92EF92FF920F931F932B
:10234000CF93DF937C01CB018A0120915605222394
:1023500089F0EB016B01C40ED51ECC15DD0569F0CB
:102360006991D701ED91FC910190F081E02DC701B9
:102370000995F3CF642F0E94FB12C801DF91CF9122
:102380001F910F91FF90EF90DF90CF900895CF9322
:10239000DF931F92CDB7DEB76983209156052223C4
:1023A000D1F020915705203240F021E030E0FC01CF
:1023B0003383228380E090E015C080915805E82F98
:1023C000F0E0E75AFA4F998190838F5F8093580528
:1023D0008093570505C061E0CE0101960E94FB1273
:1023E00081E090E00F90DF91CF910895FC0113827E
:1023F000128248EE53E060E070E0448355836683C8
:1024000077838AE391E091838083089510927B051E
:1024100010927A0510925805109257050C944612A6
:10242000862F413208F040E26CE775E00E946412AA
:1024300010927B0580937A05089521E00C94101288
:1024400081E08093560560937905109258051092AB
:10245000570508950C9420120F93062F21E0409108
:10246000570569E575E0809179050E94A8121092E0
:10247000580510925705109256050F91089561E086
:102480000C942C128AE495E00C94F6111092090633
:1024900081E0809307061092060661E082E10E94C7
:1024A000851961E083E10E948519E9EBF0E0808104
:1024B0008E7F808380818D7F808388E48093B800C5
:1024C00085E48093BC000895413208F03FC09091AC
:1024D00009069111FCCF91E090930906209307061D
:1024E0002FEF20939C051092E105240F2093E00527
:1024F0009093080690910806880F892B8093080610
:1025000080910606813041F41092060680910806FB
:102510008093BB0085EC01C085EE8093BC00809168
:1025200009068130E1F38091E105841710F44091B0
:10253000E10522EE35E0FB01D9018A2F821B8417C9
:1025400018F48D918193F9CF842F089580E0089538
:102550000F93413208F046C0909109069111FCCFCB
:1025600092E090930906009307069FEF90939C05D5
:102570001092E1054093E005FB0162EE75E0DB019E
:102580009A2F961B941718F491919D93F9CF10925E
:10259000080690910806880F892B80930806809181
:1025A0000606813041F41092060680910806809359
:1025B000BB0085EC01C085EE8093BC00222321F096
:1025C000809109068230E1F380919C058F3F61F094
:1025D00080919C05803251F080919C05803341F4BC
:1025E00083E007C081E005C080E003C082E001C055
:1025F00084E00F910895613298F420910906243007
:1026000089F46093BE05FC0180EC95E0DC012A2F83
:10261000281B261718F421912D93F9CF80E00895F7
:1026200081E0089582E0089585ED8093BC0080915B
:10263000BC0084FDFCCF10920906089585EC8093C0
:10264000BC001092090608951F920F920FB60F92C8
:1026500011242F933F934F935F936F937F938F93A7
:102660009F93AF93BF93EF93FF938091B900887FBF
:10267000803609F49CC068F5883209F45BC090F498
:10268000803109F454C038F4882309F4F5C0883047
:1026900009F44DC0F5C0883109F44CC0803209F40A
:1026A0005DC0EEC0803409F468C048F4803309F49A
:1026B00055C0883309F0E4C080939C05A8C08035DC
:1026C00009F44FC0883509F45DC0883409F0D8C0DA
:1026D000D5C0883909F4C6C0A8F4883709F467C0A2
:1026E00038F4883609F463C0803709F460C0C8C084
:1026F000883809F4B7C0803909F45FC0803809F020
:10270000BFC05BC0803B09F485C038F4803A09F44F
:1027100066C0883A09F47EC0B3C0803C09F4A6C004
:10272000883C09F4A3C0883B09F489C0A9C0809102
:10273000080610C09091E1058091E005981770F5AA
:10274000E091E10581E08E0F8093E105F0E0EE512C
:10275000FA4F80818093BB0085EC85C080939C05F7
:102760008DC0E091E10581E08E0F8093E1058091BD
:10277000BB00F0E0EE51FA4F80839091E10580912B
:10278000E0056DC0E091E10581E08E0F8093E105E9
:102790008091BB00F0E0EE51FA4F808380910706F4
:1027A00081116CC081E08093060684EA60C083E0FA
:1027B0008093090610929D05CFCF80919D058032B0
:1027C00008F050C0E0919D0581E08E0F80939D053B
:1027D0008091BB00F0E0E256FA4F8083BDCF80913C
:1027E0009D05803230F4E0919D05F0E0E256FA4F0D
:1027F00010820E94141360919D0570E0E091020622
:10280000F09103068EE995E0099510929D050E94CE
:102810001E1336C084E0809309061092BF05109203
:10282000BE05E0910406F091050609958091BE056C
:10283000811105C081E08093BE051092C005E09132
:10284000BF0581E08E0F8093BF05F0E0E054FA4FA2
:1028500080818093BB009091BF058091BE05981741
:1028600008F47ACF85E88093BC000AC085EC809399
:10287000BC001092090604C010929C050E9414131B
:10288000FF91EF91BF91AF919F918F917F916F9148
:102890005F914F913F912F910F900FBE0F901F901E
:1028A00018950895CF92DF92EF92FF92FC018589EF
:1028B0009689481B590B61097109A389B4899A014A
:1028C000AB010E94871C6B017C018FE0F594E794BB
:1028D000D794C7948A95D1F765857685882777FD43
:1028E0008095982F2BE0660F771F881F991F2A95D8
:1028F000D1F727853089442737FD4095542F2C0D7B
:102900003D1D4E1D5F1D0E94681C2C0D3D1D4E1D62
:102910005F1DCA01B901FF90EF90DF90CF9008953D
:102920001F93CF93DF931F92CDB7DEB7162F67E7C4
:1029300070E08AE495E049830E942A12612F8AE4BC
:1029400095E00E94C7114981642F8AE495E00E94B6
:10295000C7118AE495E00F90DF91CF911F910C94FD
:102960003F12CF93C62F67E770E08AE495E00E949C
:102970002A126C2F8AE495E00E94C7118AE495E040
:102980000E943F1267E770E08AE495E00E942A12F5
:1029900041E050E067E770E08AE495E00E941D1294
:1029A0008AE495E00E947711C82F8AE495E00E949E
:1029B0003F128C2FCF910895CF93DF93C62F67E7F7
:1029C00070E08AE495E00E942A126C2F8AE495E078
:1029D0000E94C7118AE495E00E943F1267E770E009
:1029E0008AE495E00E942A1242E050E067E770E036
:1029F0008AE495E00E941D128AE495E00E94771116
:102A0000D82F80E0C82F8AE495E00E947711C82B68
:102A1000D92B8AE495E00E943F12CE01DF91CF913D
:102A20000895CF93DF93EC01643008F063E068838E
:102A30008AE495E00E94061260EDCE010E94B11476
:102A4000853509F044C06AEACE010E94DC149A83FD
:102A500089836CEACE010E94DC149C838B836EEA2E
:102A6000CE010E94DC149E838D8360EBCE010E9418
:102A7000DC149A8B898B62EBCE010E94DC149C8B58
:102A80008B8B64EBCE010E94DC149E8B8D8B66EBEE
:102A9000CE010E94DC1498878F8368EBCE010E94E0
:102AA000DC149A8789876AEBCE010E94DC149C872C
:102AB0008B876CEBCE010E94DC149E878D876EEBBA
:102AC000CE010E94DC14988B8F8781E001C080E0EA
:102AD000DF91CF910895CF93DF93EC014EE264EF45
:102AE0000E94901465E070E080E090E00E94A018E1
:102AF00066EFCE01DF91CF910C94DC14CF93DF937E
:102B0000EC010E946B15AC0160E070E0CE010E9408
:102B10005214685F7F4F8F4F9F4F34E09595879594
:102B2000779567953A95D1F70E94171B20E030E022
:102B300040E251E40E947C1ADF91CF910895CF9238
:102B4000DF92EF92FF92CF93DF93EC0148814295A1
:102B5000440F440F407C4C5C64EF0E9490148881C9
:102B6000811105C065E070E080E090E012C0813026
:102B700029F468E070E080E090E00BC0823029F436
:102B80006EE070E080E090E004C06AE170E080E018
:102B900090E00E94A01866EFCE010E94DC146C0148
:102BA000E12CF12CFE2CED2CDC2CCC2468EFCE019A
:102BB0000E94B114A7019601282BCA01B9014881CE
:102BC00028E030E0241B310904C09695879577955D
:102BD00067952A95D2F7DF91CF91FF90EF90DF9024
:102BE000CF9008952F923F924F925F926F927F9273
:102BF0008F929F92AF92BF92CF92DF92EF92FF920D
:102C00000F931F93CF93DF93CDB7DEB72A970FB6FD
:102C1000F894DEBF0FBECDBF9A8789870E946B15DF
:102C20008C0189859A850E949F156D837E838F8391
:102C30009887A80160E070E089859A850E94521407
:102C40004B015C0180EA881A8FE0980AA108B1085C
:102C5000A5019401C501B4010E942A1C2B013C016D
:102C60000CE075946794579447940A95D1F7A98519
:102C7000BA8511962D903C9012971C9115960D9047
:102C8000BC91A02D0E94921C6B017C018DE0F594FB
:102C9000E794D794C7948A95D1F7E985FA85A781F7
:102CA000B085A30192010E94921CBB2797FDB095AD
:102CB000AB2FC80ED91EEA1EFB1EF2E0CF0ED11CB0
:102CC000E11CF11C32E0F594E794D794C7943A954F
:102CD000D1F780E8D80EE11CF11CE985FA85A189BD
:102CE000B289A70196010E94871CDC01CB014FE04D
:102CF000B695A795979587954A95D1F789839A8335
:102D0000AB83BC836101EE24D7FCE094FE2C52E03F
:102D1000CC0CDD1CEE1CFF1C5A95D1F7A185B285A9
:102D2000A30192010E94921C2B013C016BE075945F
:102D30006794579447946A95D1F7A381B481A5010C
:102D400094010E94921CEBE0959587957795679585
:102D5000EA95D1F7460E571E681E791EC40CD51C85
:102D6000E61CF71C012E04C0CC0CDD1CEE1CFF1C65
:102D70000A94D2F792E0C90ED11CE11CF11CC701E4
:102D8000B60124E030E040E050E00E94681C8D81F4
:102D90009E81AF81B885821B930BA40BB50B9C0160
:102DA000AD0160E573EC80E090E004C096958795F6
:102DB000779567951A95D2F70E942A1C97FD0DC04A
:102DC000660F771F881F991F29813A814B815C818B
:102DD0000E94461C49015A010CC029813A814B814D
:102DE0005C810E94461C49015A01880C991CAA1C4E
:102DF000BB1C9927B7FC9A958B2D7A2D692D9B01C9
:102E0000AC010E942A1C9B01AC01AEEDBBE00E940C
:102E1000871C6C01FF24D7FCF094EF2CA3E4B3EEE5
:102E2000A50194010E94951CBB2797FDB095AB2F7F
:102E3000C80ED91EEA1EFB1E9FECC90E9EE0D91ECD
:102E4000E11CF11CA4E0F594E794D794C794AA95EB
:102E5000D1F7C80CD91CEA1CFB1CC701B6012A9685
:102E60000FB6F894DEBF0FBECDBFDF91CF911F919B
:102E70000F91FF90EF90DF90CF90BF90AF909F9019
:102E80008F907F906F905F904F903F902F9008951C
:102E90004115510529F4EAE7F0E080818F778083BE
:102EA0006A307105B1F063FF02C088E201C088E0BA
:102EB0006770682B88E190E00FB6F894A89580932E
:102EC00060000FBE60936000E0E6F0E08081806407
:102ED0008083232BA1F483B7817F846083BFF89420
:102EE00083B7816083BF85B7806685BF8F7D85BFCF
:102EF0007894889583B78E7F83BF78940EC083B70C
:102F0000817F846083BFF89483B7816083BF7894A6
:102F1000889583B78E7F83BF7894452B29F4EAE7A1
:102F2000F0E080818068808308951F920F920FB631
:102F30000F9211248F9388E10FB6F894809360006C
:102F4000109260000FBE8F910F900FBE0F901F90D8
:102F500018958230E8F4E82FF0E0EE0FFF1FE55FF0
:102F6000F94F71836083813041F0809169008C7FDB
:102F7000842B80936900E89A089580916900440F3A
:102F8000551F440F551F837F842B80936900E99A56
:102F90000895823068F4813011F0E89801C0E99812
:102FA000E82FF0E0EE0FFF1FE55FF94F118210826E
:102FB00008951F920F920FB60F9211242F933F93F3
:102FC0004F935F936F937F938F939F93AF93BF9331
:102FD000EF93FF9380910B0690910C06892B29F0BB
:102FE000E0910B06F0910C060995FF91EF91BF91CE
:102FF000AF919F918F917F916F915F914F913F9191
:103000002F910F900FBE0F901F9018951F920F9247
:103010000FB60F9211242F933F934F935F936F93AB
:103020007F938F939F93AF93BF93EF93FF93809181
:103030000D0690910E06892B29F0E0910D06F09176
:103040000E060995FF91EF91BF91AF919F918F91DE
:103050007F916F915F914F913F912F910F900FBE94
:103060000F901F9018951F920F920FB60F92112478
:103070002F933F938F939F93AF93BF9380911006AD
:1030800090911106A0911206B091130630910F068F
:1030900023E0230F2D3720F40196A11DB11D05C09B
:1030A00026E8230F0296A11DB11D20930F068093E1
:1030B000100690931106A0931206B0931306809108
:1030C000140690911506A0911606B0911706019668
:1030D000A11DB11D8093140690931506A0931606AA
:1030E000B0931706BF91AF919F918F913F912F9110
:1030F0000F900FBE0F901F9018953FB7F8948091D6
:10310000140690911506A0911606B091170626B5E3
:10311000A89B05C02F3F19F00196A11DB11D3FBF0F
:103120006627782F892F9A2F620F711D811D911D9F
:1031300042E0660F771F881F991F4A95D1F70895BF
:10314000CF92DF92EF92FF92CF93DF936B017C01DE
:103150000E947D18EB01C114D104E104F10489F04F
:103160000E94121A0E947D186C1B7D0B683E7340F2
:1031700090F381E0C81AD108E108F108C851DC4F8A
:10318000EACFDF91CF91FF90EF90DF90CF9008953D
:10319000789484B5826084BD84B5816084BD85B532
:1031A000826085BD85B5816085BDEEE6F0E08081F9
:1031B00081608083E1E8F0E010828081826080831A
:1031C000808181608083E0E8F0E08081816080839D
:1031D000E1EBF0E0808184608083E0EBF0E08081CF
:1031E00081608083EAE7F0E0808184608083808171
:1031F0008260808380818160808380818068808319
:103200001092C10008958093110108958E3008F046
:103210008E5087702091110190E4299F9001112414
:10322000822B80937C0080917A00806480937A0066
:1032300080917A0086FDFCCF809178002091790002
:1032400090E0922B0895833081F028F4813099F03A
:103250008230A1F008958730A9F08830B9F0843029
:10326000D1F4809180008F7D03C0809180008F77A2
:1032700080938000089584B58F7702C084B58F7DD8
:1032800084BD08958091B0008F7703C08091B00015
:103290008F7D8093B0000895CF93DF9390E0FC0181
:1032A000EF5FF94F2491FC01EB5EF94F8491882385
:1032B00049F190E0880F991FFC01ED5CF94FA59151
:1032C000B491875D994FFC01C591D4919FB761116D
:1032D00008C0F8948C91209582238C938881822356
:1032E0000AC0623051F4F8948C91322F30958323C8
:1032F0008C938881822B888304C0F8948C91822BD4
:103300008C939FBFDF91CF9108950F931F93CF931D
:10331000DF931F92CDB7DEB7282F30E0F901E351DC
:10332000FA4F8491F901EF5FF94F1491F901EB5EC7
:10333000F94F04910023C9F0882321F069830E948A
:1033400023196981E02FF0E0EE0FFF1FE75DF94FD1
:10335000A591B4919FB7F8948C91611103C0109519
:10336000812301C0812B8C939FBF0F90DF91CF9160
:103370001F910F91089508950E94C8180E94BB19CB
:103380000E94FD03C0E0D0E00E9457042097E1F3C3
:103390000E940000F9CF4F925F926F927F92AF929E
:1033A000BF92CF92DF92EF92FF920F931F93CF9332
:1033B000DF93CDB7DEB729013A01621B730B840B93
:1033C000950B29893A894B895C892A193B094C0953
:1033D0005D09298B3A8B4B8B5C8B9B01AC01698916
:1033E0007A898B899C890E942A1CE418F5080609B1
:1033F0001709A80197010E94681C2A0D3B1D4C1D4E
:103400005D1DCA01B901DF91CF911F910F91FF900E
:10341000EF90DF90CF90BF90AF907F906F905F90D4
:103420004F90089508955058BB27AA270ED075C114
:1034300066D130F06BD120F031F49F3F11F41EF4CF
:103440005BC10EF4E095E7FB51C1E92F77D180F322
:10345000BA17620773078407950718F071F49EF591
:103460008FC10EF4E0950B2EBA2FA02D0B01B901E0
:1034700090010C01CA01A0011124FF27591B99F0EA
:10348000593F50F4503E68F11A16F040A22F232FF6
:10349000342F4427585FF3CF469537952795A79546
:1034A000F0405395C9F77EF41F16BA0B620B730BED
:1034B000840BBAF09150A1F0FF0FBB1F661F771F5E
:1034C000881FC2F70EC0BA0F621F731F841F48F413
:1034D000879577956795B795F7959E3F08F0B3CF99
:1034E0009395880F08F09927EE0F97958795089583
:1034F000D9D008F481E008950CD00FC107D140F075
:10350000FED030F021F45F3F19F0F0C0511139C105
:10351000F3C014D198F39923C9F35523B1F3951B44
:10352000550BBB27AA2762177307840738F09F5FE4
:103530005F4F220F331F441FAA1FA9F333D00E2E53
:103540003AF0E0E830D091505040E695001CCAF7C0
:1035500029D0FE2F27D0660F771F881FBB1F261785
:1035600037074807AB07B0E809F0BB0B802DBF0158
:10357000FF2793585F4F2AF09E3F510568F0B6C071
:1035800000C15F3FECF3983EDCF386957795679535
:10359000B795F7959F5FC9F7880F911D9695879509
:1035A00097F90895E1E0660F771F881FBB1F621728
:1035B00073078407BA0720F0621B730B840BBA0BE6
:1035C000EE1F88F7E095089504D06894B111D9C032
:1035D0000895BCD088F09F5790F0B92F9927B75124
:1035E000A0F0D1F0660F771F881F991F1AF0BA95C7
:1035F000C9F712C0B13081F0C3D0B1E00895C0C0A6
:10360000672F782F8827B85F39F0B93FCCF38695BC
:1036100077956795B395D9F73EF490958095709519
:1036200061957F4F8F4F9F4F0895E89409C097FB96
:103630003EF490958095709561957F4F8F4F9F4F89
:103640009923A9F0F92F96E9BB279395F6958795CD
:1036500077956795B795F111F8CFFAF4BB0F11F490
:1036600060FF1BC06F5F7F4F8F4F9F4F16C0882337
:1036700011F096E911C0772321F09EE8872F762F6D
:1036800005C0662371F096E8862F70E060E02AF0AE
:103690009A95660F771F881FDAF7880F969587959A
:1036A00097F90895990F0008550FAA0BE0E8FEEF6F
:1036B00016161706E807F907C0F012161306E407F6
:1036C000F50798F0621B730B840B950B39F40A26EF
:1036D00061F0232B242B252B21F408950A2609F4CD
:1036E000A140A6958FEF811D811D089597F99F67D1
:1036F00080E870E060E008959FEF80EC089500247A
:103700000A941616170618060906089500240A9446
:1037100012161306140605060895092E0394000CCC
:1037200011F4882352F0BB0F40F4BF2B11F460FF5B
:1037300004C06F5F7F4F8F4F9F4F089557FD905884
:10374000440F551F59F05F3F71F04795880F97FB65
:10375000991F61F09F3F79F087950895121613061F
:103760001406551FF2CF4695F1DF08C0161617064E
:103770001806991FF1CF8695710561050894089583
:10378000E894BB2766277727CB0197F908950BD0DC
:10379000C4CFB5DF28F0BADF18F0952309F0A6CF23
:1037A000ABCF1124EECFCADFA0F3959FD1F3950FD5
:1037B00050E0551F629FF001729FBB27F00DB11DB5
:1037C000639FAA27F00DB11DAA1F649F6627B00D45
:1037D000A11D661F829F2227B00DA11D621F739F2E
:1037E000B00DA11D621F839FA00D611D221F749F3C
:1037F0003327A00D611D231F849F600D211D822F83
:10380000762F6A2F11249F5750408AF0E1F08823C9
:103810004AF0EE0FFF1FBB1F661F771F881F9150D6
:103820005040A9F79E3F510570F060CFAACF5F3F8F
:10383000ECF3983EDCF3869577956795B795F79509
:10384000E7959F5FC1F7FE2B880F911D9695879591
:1038500097F90895DB018F939F930E94871CBF9176
:10386000AF91A29F800D911DA39F900DB29F900DCF
:1038700011240895991B79E004C0991F961708F048
:10388000961B881F7A95C9F780950895A1E21A2E94
:10389000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FF4
:1038A000A217B307E407F50720F0A21BB30BE40B44
:1038B000F50B661F771F881F991F1A9469F760958B
:1038C0007095809590959B01AC01BD01CF01089545
:1038D000052E97FB1EF400940E947F1C57FD07D015
:1038E0000E94461C07FC03D04EF40C947F1C50959C
:1038F0004095309521953F4F4F4F5F4F08959095DC
:103900008095709561957F4F8F4F9F4F08950E94CE
:10391000A01CA59F900DB49F900DA49F800D911D9C
:1039200011240895B7FF0C94871C0E94871C821BEA
:10393000930B0895EE0FFF1F0590F491E02D09946D
:10394000A29FB001B39FC001A39F700D811D1124E0
:10395000911DB29F700D811D1124911D0895EF924C
:103960000F931F93CF93DF93E80147FF02C034E129
:1039700001C034E0E42FFF27E7FDF095F7FF03C017
:10398000F195E195F109E32E022F2E2FAE010E9451
:10399000D01CCE01DF91CF911F910F91EF90089530
:1039A0006F927F929F92AF92BF92CF92DF92EF92EF
:1039B000FF920F931F93CF93DF93CDB7DEB7299775
:1039C0000FB6F894DEBF0FBECDBF6A01B22E102F26
:1039D0000C3320F4FF24F394F00E02C04CE3F42ED9
:1039E0000F2D27E0AE014F5F5F4F0E944E1E798181
:1039F000272F2970213031F0E1FC06C0E0FC06C021
:103A000060E005C06DE203C06BE201C060E2AE2D74
:103A1000A07173FF36C0662311F084E001C083E01B
:103A20008B1510F4B81A01C0B12CA1110BC0F6010E
:103A30008B2D90E2882319F091938150FBCFCB0C12
:103A4000D11CB12C662331F0F601608396012F5F03
:103A50003F4F6901C6010396E2FE05C02EE4F60160
:103A6000208331E404C02EE6F601208331E6318361
:103A70002283FC012B2D30E22223F1F131932150DE
:103A8000FBCF72FF40C0662311F084E001C083E0E9
:103A90008B1510F4B81A01C0B12CA1110BC0F6019E
:103AA0008B2D90E2882319F091938150FBCFCB0CA2
:103AB000D11CB12C662331F0F601608396012F5F93
:103AC0003F4F6901C6010396E2FE07C029E4F601F3
:103AD00020832EE4218326E406C029E6F601208314
:103AE0002EE6218326E62283FC012B2D30E22223C1
:103AF00019F031932150FBCFFC01EB0DF11D108229
:103B00008EEF9FEFB7C0B1E0611101C0B0E04B2F65
:103B100050E01816190624F49C012F5F3F4F02C095
:103B200021E030E0240F351F112329F0412F50E010
:103B30004F5F5F4F02C040E050E0420F531F2B2DFC
:103B400030E04217530714F4B41A01C0B12C2E2DE3
:103B5000287159F4F6012B2D30E2222319F031930C
:103B60002150FBCFCB0CD11CB12CBB2331F0F60183
:103B7000608396012F5F3F4F6901A1110BC0F601D1
:103B80002B2D30E3222319F031932150FBCFCB0CA6
:103B9000D11CB12CF80E0A81372F3071A32E74FF7F
:103BA00003C0013309F4FA941F142CF42F2D29308B
:103BB00018F028E001C021E0682F392F97FF02C0DC
:103BC00060E030E0462F532F612C712C3EE2932EA3
:103BD000BC01621B71099B01DC01A41BB50BE1E078
:103BE000F0E0EC0FFD1FAE0FBF1FE12EF12CF194A2
:103BF000E194F1084F3FFFEF5F0731F4F601908247
:103C0000B6016F5F7F4F6B01841795074CF0241747
:103C1000350734F4BD01660D771DFB01118101C02C
:103C200010E341505109FFEF6F1A7F0AB6016F5F31
:103C30007F4F4E155F0524F0F60110836B01DACF3C
:103C40004817590739F4063320F4053319F4A11045
:103C500001C011E3F6011083FB018B2D90E2882354
:103C600019F091938150FBCFFB01EB0DF11D1082F8
:103C700080E090E029960FB6F894DEBF0FBECDBF6E
:103C8000DF91CF911F910F91FF90EF90DF90CF9038
:103C9000BF90AF909F907F906F900895283008F06C
:103CA00027E03327DA01990F311D87FD91600096D7
:103CB0006105710539F432602E5F3D9330E32A953A
:103CC000E1F708959F3F30F080387105610509F0F4
:103CD0003C5F3C5F3D93913008F08068911DDF931D
:103CE000CF931F930F93FF92EF92192F987F969582
:103CF000E92F96959695E90FFF27E956F94F9927F1
:103D00003327EE24FF24A701E701059008940794C8
:103D100028F4360FE71EF81E491F511D660F771F46
:103D2000881F991F0694A1F70590079428F4E70EC1
:103D3000F81E491F561FC11D770F881F991F661F48
:103D40000694A1F70590079428F4F80E491F561F12
:103D5000C71FD11D880F991F661F771F0694A1F7F3
:103D60000590079420F4490F561FC71FD81F990FBD
:103D7000661F771F881F0694A9F784911095177006
:103D800041F0D695C79557954795F794E7941A95BE
:103D9000C1F7EDE3F6E068941590159135916591C2
:103DA000959105907FE27395E118F10A430B560B4C
:103DB000C90BD009C0F7E10CF11E431F561FC91FE4
:103DC000D01D7EF4703311F48A95E6CFE89401504B
:103DD00030F0080F0AF40027021708F4202F23956B
:103DE000022F7A3328F079E37D932A95E9F710C002
:103DF0007D932A9589F6069497956795379517953B
:103E00001794E118F10A430B560BC90BD00998F02F
:103E100023957E9173957A3308F070E37C93201399
:103E2000B8F77E9170617D9330F0839571E37D9357
:103E300070E32A95E1F71124EF90FF900F911F9105
:103E4000CF91DF91992787FD90950895F894FFCF42
:103E500000001806800001000000040101EA55007E
:103E600000012E00743D004D61783A003234205A32
:103E70006F6F6D004D696E3A003732205A6F6F6D6B
:103E8000004261743A0000000000C7119A116F11DE
:063E900077118A1199115F
:00000001FF

Ну и фьюзы как у меня стоят для кварца 8Mhz на всякий:

Скетч:

#include <LCD5110_Graph.h>    //  rinkydinkelectronics.com/library.php
#include <Wire.h>
#include <Adafruit_BMP085.h>  //  github.com/adafruit/Adafruit-BMP085-Library
#include <LowPower.h>         //  github.com/rocketscream/Low-Power

Adafruit_BMP085 dps;

// ********** Опции компиляции **************
//#define SeaLevel            // разкоментировать для коррекции на высоту
//#define debug               // для тестирования графиков (ан.вход a1 как задатчик давления)
//#define cont 67             // для изменения раскоментировать эту строку (70 по умолчанию)
#define zapolnen            // Заполнение графика 1
//#define gasim_lcd           // если экономим батарейки гашением LCD


long P_win = 165 * 133.3;    // Верхняя граница абс. графика по умолчанию до сдвига (600 + 165) = 765мм

#if defined (SeaLevel)  // если не включена коррекция, экономим память
float Alt_corr = 32.4;  // Коррекция высоты в метрах.
#endif

uint32_t Pressure; 
float temp;
unsigned char sotki ;    // сотые для давления
unsigned char p_count, p2;
long P_Min, P_Max, P_Dt, P_Mid; 
uint16_t P_Mem[217]; //-79980 = 600мм (3 day 20min memory, 72 per 24 hour) 
signed char x, y, last_x, last_y;
// nokia 5110 connect
// pin d3 - Serial clock out (SCLK)
// pin d4 - Serial data out (DIN)
// pin d5 - Data/Command select (D/C)
// pin d6 - LCD reset (RST)
// pin d7 - LCD chip select (CS)

LCD5110 myGLCD(3, 4, 5, 6, 7);


// bmp180 connect
// sda  - a4
// scl  - a5

// Use pin 2 as wake up pin
const char wakeUpPin = 2; // d2 для кнопки
const char lightPin1 = 11; // d11 подсветка дисплея
const char lightPin2 = 12; // d12 инверсная подсветка дисплея
const char batPin = 0;    // a0 - ан. вход для контроля батареи 220к/51к

volatile char scr_num = 0;          // Номер экрана для отображения
volatile boolean key_pressed = false; // Признак что кнопку жали
volatile boolean in_int = false;      // Признак нахождения в прерывании
volatile boolean Refresh = true;      // Признак что нужно обновить отрисовку (для экономии батарей)
volatile boolean Lcd_On = true;      // Признак что дисплей включен
volatile char light_on = 4;         // длительность подсветки при включении 4*4 = 16с. 

extern unsigned char SmallFont[];  // внешние шрифты
extern unsigned char BigNumbers[];
extern unsigned char TinyFont[];    
unsigned char tik = 0;           // счетчики для времени
unsigned char Count_Minute = 0; 
uint32_t Son_count    = 0;

//******************************** START ***************************************
void setup() {
  
  
  myGLCD.InitLCD();
#if defined (cont)
  myGLCD.setContrast(cont); //регулировка контраста при необходимости
#endif
  myGLCD.setFont(SmallFont);
  Wire.begin();
  
  analogReference(INTERNAL); //1.1v internal op.source
  pinMode(batPin,INPUT);     //Вход для контроля батареи
  
#if defined (debug) 
  pinMode(1,INPUT);  // а1 - задание давления
  analogRead(1);
#endif  
    
  LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);

  //dps.begin(BMP085_ULTRALOWPOWER);
  //dps.begin(BMP085_STANDARD);
  dps.begin(BMP085_HIGHRES);
  //dps.begin(BMP085_ULTRAHIGHRES);
 

  pinMode(wakeUpPin, INPUT);  // Configure wake up pin as input.  
  digitalWrite(wakeUpPin, 1); // pullup
  
  pinMode(lightPin1, OUTPUT);// lcd light pin as output;
  pinMode(lightPin2, OUTPUT);// lcd light inv pin as output;

  
#if defined (SeaLevel)
  Pressure = dps.readSealevelPressure(Alt_corr); // с коррекцией на уровень моря
#else
  Pressure = dps.readPressure();                 // без коррекции к уровню моря
#endif

  P_Mid = Pressure - 79980; // (79980 = 600mm) отсекаем лишнее
  P_Mem[p_count] = P_Mid; // заносим в память первое значение давления для правильной работы усреднения

//  Serial.begin(9600);
//  while (!Serial) ; // wait for Arduino Serial Monitor
//  delay(200); 
}



void loop() {          // ***************************************************************************************************************

  // Allow wake up pin to trigger interrupt on low.
#if defined (debug)
#else
if ((Son_count < 5)||((!(Son_count % 5))&&(tik==0))) {    // через 5 минут активности, не заходим в тело по 5 минут
#endif

//  Serial.print("S=");Serial.print(Son_count);Serial.print(" %=");Serial.println(Son_count % 5);
detachInterrupt(0); // запрет прерываний
#if defined (SeaLevel)
  Pressure = dps.readSealevelPressure(Alt_corr); // с коррекцией на уровень моря
#else
  Pressure = dps.readPressure();                 // без коррекции к уровню моря
#endif
temp = dps.readTemperature();
attachInterrupt(0, wakeUp, LOW); // восстановить прерывания от кнопки

#if defined (debug) 
  Pressure = map(analogRead(1),0,1023,730*133.3,790*133.3);  // для отладки резистор на а1 - задатчик давления
#endif    
 // для экранов с инверсным подсветом использовать lightPin2
  if  (light_on > 0) {
    digitalWrite(lightPin1, 1);digitalWrite(lightPin2, 0);
    light_on--;
  }
  else {digitalWrite(lightPin1, 0);digitalWrite(lightPin2, 1);} // lcd light on/off
  
 


  if (Pressure > 79900){  // 600mm
    P_Mid = (P_Mid + (Pressure - 79980))/2; // усреднение замеров, отбрасываем показания ниже 600мм.(сбоит бывает)
  }
#if defined (debug)
    if (Count_Minute >= 2){ Refresh = true;  // раз в секунду
#else
    if (Count_Minute >= 20){ Refresh = true; // каждые 20 мин. запоминаем усредненное значение в память и обновляем графики
#endif 

 
    if (p_count == 216) {
      for (int i = 0; i < 216; i++) // сдвигаем если буфер полон
      {
        P_Mem[i] = P_Mem[i+1];
      }
    } 
    else {
      p_count++;
    }
    P_Mem[p_count] = P_Mid; 
    if (Pressure > 79980){
      P_Mid = Pressure - 79980; // новый старт усреднения
    }
    Count_Minute = 0;
  }


#if defined (gasim_lcd)
    if ((Son_count < 15)&&(!Lcd_On)) {myGLCD.disableSleep(); Lcd_On = true;}   // Если разрешено, гасим дисплей через 15 мин.
    if ((Son_count >= 15)&&(Lcd_On)) {myGLCD.enableSleep(); Lcd_On = false;}
#endif
//  Отображение экранов
if (Lcd_On) {switch (scr_num)
  {
  case 0:  // summary screen
    Refresh = true;          // Обновить отрисовку каждый цикл
 
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(BigNumbers);

    //Давление с BMP180
    myGLCD.printNumI(Pressure / 133.3, 15, 5, 3); //рассчет атмосферного давления
    myGLCD.setFont(SmallFont);
    myGLCD.print(".", 60, 22);
    sotki = ((Pressure / 133.3)-int(Pressure / 133.3))*100;
    myGLCD.printNumI((sotki / 10), 66, 22, 1);// десятые 
    myGLCD.printNumI((sotki % 10), 72, 22, 1);// сотые
    myGLCD.print("t=", 20, 35);
    myGLCD.printNumF(temp, 1, 32, 35);  //температура
    break;

  case 1:  // график давления c фиксированным масштабом    *****************************************************
     if (Refresh){    // Рисуем если разрешено обновить
     
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }
    P_Dt = 10 * 133.3;  // Размах графика 10мм
    for (int i=p2; i<p_count ; i++) {   // ищем окно графика
      if (P_win < P_Mem[i]) {
        P_win = P_win + P_Dt/2;         // сдвиг графика на половину текущего размера
      } 
      if ((P_win - P_Dt)> P_Mem[i]) {
        P_win = P_win - P_Dt/2;
      } 
    }    
    P_Max = P_win ;
    P_Min = P_Max - P_Dt;
    
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов 
        
    x=72;
   
      for (int i=p_count; i>p2 ; i--) {
        y = map (P_Mem[i],P_Max,P_Min,8,48);
        if (y < 8) {y = 8;}
        if (y > 47) {y = 47;} 
#if defined (zapolnen)        
        myGLCD.drawLine(x, y, x, 47);
#else        
        if (x == 72) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
             
        last_x = x; 
        last_y = y;
#endif        
        x--;
      }
   

    myGLCD.printNumF(Pressure/ 133.3, 2, 5, 0);    
    myGLCD.printNumF(temp, 1, 60, 0);  //температура
    
    myGLCD.setFont(TinyFont);
    myGLCD.printNumI(((P_win + 79980)/133.3)-699.5 , 76, 8, 2);
    myGLCD.printNumI(((P_win + 79980 - P_Dt/2)/133.3)-699.5 , 76, 25, 2);
    myGLCD.printNumI(((P_win + 79980 - P_Dt)/133.3)-699.5 , 76, 42, 2);
//    myGLCD.print("24 Abs", RIGHT, 0);
//    myGLCD.print("Dt:", LEFT, 42); 
//    myGLCD.printNumF(P_Dt / 133.3, 2, 20, 42);  
//    myGLCD.printNumF(Pressure / 133.3, 2, 50, 42); 
 
 
  
    }
    break;

  case 2:  // график давления за сутки с масштабированием
    if (Refresh){    // Рисуем если разрешено обновить
    
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }

    for (int i=p_count; i>p2 ; i--) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 
    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>p2 ; i--) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
    myGLCD.print("24 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
    }
    break;

  case 3:  // график давления за трое суток  
    if (Refresh){    // Рисуем если разрешено обновить
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    for (int i=p_count; i>0 ; i = i - 3) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 

    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>0 ; i = i - 3) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }

        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
    myGLCD.print("72 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
    }
    break;   

  case 4: // напряжение аккумулятора для контроля
    Refresh = true;          // Обновить отрисовку каждый цикл
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов
    myGLCD.print("Bat:", LEFT, 15);    
    myGLCD.printNumF(analogRead(batPin)/176.6, 2, 24, 15);  //напр.батареи (коэфф. подобрать при желании)
    break;
  }

  if (Refresh) {myGLCD.update(); Refresh = false;} // Вывод вместимого буфера на дисплей и сброс признака обновления
} // if (Lcd_On)



#if defined (debug)
#else
    }  // скобка для условия сна в начале цикла в отладке не спим
#endif


  attachInterrupt(0, wakeUp, LOW); // Проснемся от кнопки


  //    Отключить питание на 4с
#if defined (debug)
     LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); 
 #else    
     LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); 
#endif   

   if (!key_pressed) {tik++;} else {key_pressed = false; Son_count = 0;} // в зачёт 4с. если не тыкали кнопку
   
#if defined (debug)
    if (tik >=1) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
#else    
    if (tik >=15) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
#endif   
} // Конец цикла


void wakeUp() // прерывание сна по нажатию кнопки
{             // Just a handler for the pin interrupt.
  if (!in_int){
  in_int = true;  
  detachInterrupt(0); 
  if (light_on > 0) {scr_num++;} // Первый тычок только подсвет
  light_on = 2;            // после нажатия на кнопку подсветка 2*4 = 8с.
  Refresh = true;        // Обновить отрисовку
  key_pressed = true;   // кнопку жали
    if (scr_num > 4) {
      scr_num = 0;
    }

    LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); //задержка антидребезга      
    attachInterrupt(0, wakeUp, LOW); // восстановить прерывания от кнопки
    in_int = false;
} 
}


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

Добрый вечер S13 и всем присутсвующим. Отличный проект. Собрал пост 359 bmp280 s13. Я не программист просто больно понравилась идея! Поскажите пожалуйста как поставить время отрисовки каждого пикселя на первом екране 10минут а не 20 как счас и возможно ли это? Зарание спасибо!.

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

s13 пишет:

Намёк понял, кажись нашел проблему, по крайней мере остервенелое тыкание кнопки в течение получаса зависания не дало :) применил всё что выше писал, и ещё запретил прерывания на время общения с датчиком bmp180. Пробуйте.

Ну до чего приятно иметь дело с умным человеком!!! Хотя должен признаться, что в данном конкретном случае, я писал без задней мысли. Но тем более спасибо.

Залил кекс по варианту для 16 мгц со своими фьюзами (есть по ранее приведенной ссылке на Яндекс диске). Прибор запустился. Если все будет норм, туда же пихну и хекс позже, если не возражаете. Если прибор покажет стабильную и устойчивую работу, то уже можно считать его близким к совершенству. И, полагаю, через годик уже появятся аналоги на Али, подозрительно напоминающие Ваш прибор. Ну да такова селяви, как говаривала одна моя знакомая.

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

Я поставил литий 700-1000 мач (ХЗ, по габаритам подбирал). Если хватит на полгода, то норм.

s13
Offline
Зарегистрирован: 22.05.2016

123vladimir пишет:

Поскажите пожалуйста как поставить время отрисовки каждого пикселя на первом екране 10минут а не 20 как счас и возможно ли это? Зарание спасибо!.

Вообще там один массив на все графики, поэтому отдельно для первого сделать выборку по 10 минут не получится. Если только первый и второй сделать полсуточными, а третий на 36 часов. Для этого в строке 123 заменить 20 на 10 минут. Хотя зачем всё это не понятно.

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

Спасибо за ответ. Зачем? Я делаю Ваш проэкт для рыбалки и должен сказать очень удачный приборчик. Как правило на рыбалке нахожусь не более 10 часов, отсюда и 10мин.  На экранчике буду видеть тенденцию за рание и фактически на время рыбалки максимально подробно, хотя и в Вашем варианте все отлично. 

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

Здравствуйте s13. Позвольте ещё вопрос.  Можно ли в Вашем скетче пост359 использовать милибары вместо мм ртуного столба. Это мне лично привычнее и удобнее да и вовсех приборчиках подобного типа милибары или гектопаскали отсюда и привычка. Если это не очень сложно и трудоемко хотелосьбы, а ели нетто и так превосходно. Ещё раз повторюсь отличный проект. Да ещё один момент иногда после того как выключил включил питание не  начинается отрисовка графика не знаю в чем дело. Быавет поле нажатия начинает рисовать график и в посте 387 у Вас скетч для 180 датчика, в нем есть антидребезг коррекция высоты сон для экрана и отключение при низком питании, есть ли это все для 280 датчика? Спасибо!

s13
Offline
Зарегистрирован: 22.05.2016

Здравствуйте Владимир. Гектопаскали они же миллибары видимо более привычны у европейских соседей. Для смены единиц просто замените все числа 133.3 на 100, возможно ещё придётся немного поправить отображение ( миллибары имеют значения возле 1000, соответственно будет 3 или 4 значащих цифры, скорее всего нужно будет немного поправить координаты для отображения чисел)  возможность гашения есть, строка 13. Проблем со стартом не наблюдал, попробуйте заменить датчик. Раз уж у Вас получилось оттранслировать скетч из поста 359, то внести небольшие коррективы думаю тоже под силу. Возможно такой вариант ещё кому пригодится, будут вопросы задавайте, здесь помогут. Для этого и открывают исходник чтобы можно было поправить под себя, дополнить, улучшить и снова показать.  

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

Спасибо буду пробовать.

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

Здравствуйте s13, с новым годом всего наилучшего в новом году.  Попробовал поменять все 133.3 на 100.0 все работает данные идут цифры на местах, но диапазон графика за пределами (полоска на весь экран) и цифры справа не 45. 50. 55.а 23 25 25 первый экран. Надо наверное ещё чтото менять? Спасибо.

s13
Offline
Зарегистрирован: 22.05.2016

123vladimir пишет:

Надо наверное ещё чтото менять? Спасибо.

Всех с прошедшими праздниками ! 

Вот вариант для Владимира с миллибарами ;)

#include <LCD5110_Graph.h>    // rinkydinkelectronics.com/library.php
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <LowPower.h>         //  github.com/rocketscream/Low-Power

Adafruit_BMP280 bme; // I2C

// ********** Опции компиляции **************
#define cont 67             // для изменения раскоментировать эту строку (70 по умолчанию)
#define zapolnen            // Заполнение графика 1
//#define gasim_lcd           // если экономим батарейки гашением LCD


long P_win = 215 * 100.0;    // Верхняя граница абс. графика по умолчанию до сдвига (800 + 215) = 1015mbar
uint32_t Pressure; 
unsigned char sotki ;    // сотые для давления
unsigned char p_count = 0, p2 = 0;
long P_Min, P_Max, P_Dt, P_Mid; 
uint16_t P_Mem[217]; //-80000 = 800mbar (3 day 20min memory, 72 per 24 hour) 
float Temp; // Температура
signed char x, y, last_x, last_y;
// nokia 5110 connect
// pin d3 - Serial clock out (SCLK)
// pin d4 - Serial data out (DIN)
// pin d5 - Data/Command select (D/C)
// pin d6 - LCD reset (RST)
// pin d7 - LCD chip select (CS)

LCD5110 myGLCD(3, 4, 5, 6, 7);


// bmp280 connect
// sda  - a4
// scl  - a5
// csb  - 3v3

// Use pin 2 as wake up pin
const char wakeUpPin = 2; // d2 для кнопки
const char lightPin1 = 11; // d11 подсветка дисплея
const char lightPin2 = 12; // d12 инверсная подсветка дисплея
const char batPin = 0;    // a0 - ан. вход для контроля батареи 220к/51к

char scr_num = 0;          // Номер экрана для отображения
boolean key_pressed = false; // Признак что кнопку жали
boolean Refresh = true;      // Признак что нужно обновить отрисовку (для экономии батарей)
boolean Lcd_On = true;      // Признак что дисплей включен
char light_on = 4;         // длительность подсветки при включении 4*4 = 16с. 

extern unsigned char SmallFont[];  // внешние шрифты
extern unsigned char BigNumbers[];
extern unsigned char TinyFont[];    
unsigned char tik = 0;           // счетчики для времени
unsigned char Count_Minute = 0; 
uint32_t Son_count    = 0;

//******************************** START ***************************************
void setup() {
  
  
  myGLCD.InitLCD();
#if defined (cont)
  myGLCD.setContrast(cont); //регулировка контраста при необходимости
#endif
  myGLCD.setFont(SmallFont);
  Wire.begin();
  myGLCD.print("START BMP280", 5, 15);
  myGLCD.update();
  while (!bme.begin()){}; // ждём запуска датчика

  
  analogReference(INTERNAL); //1.1v internal op.source
  pinMode(batPin,INPUT);     //Вход для контроля батареи
      
  LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);

  pinMode(wakeUpPin, INPUT);  // Configure wake up pin as input.  
  digitalWrite(wakeUpPin, 1); // pullup
  
  pinMode(lightPin1, OUTPUT);// lcd light pin as output;
  pinMode(lightPin2, OUTPUT);// lcd light inv pin as output;
  

  if (bme.begin()) Pressure = bme.readPressure();                 // считать давление


  P_Mid = Pressure - 80000; // (800mbar) отсекаем лишнее
  P_Mem[p_count] = P_Mid; // заносим в память первое значение давления для правильной работы усреднения

//  Serial.begin(9600);
//  while (!Serial) ; // wait for Arduino Serial Monitor
//  delay(200); 
}



void loop() {          // ***************************************************************************************************************

  // Allow wake up pin to trigger interrupt on low.

if ((Son_count < 5)||((!(Son_count % 5))&&(tik==0))) {    // через 5 минут активности, не заходим в тело по 5 минут


//  Serial.print("S=");Serial.print(Son_count);Serial.print(" %=");Serial.println(Son_count % 5);

  detachInterrupt(0); 
  if (bme.begin()) Pressure = bme.readPressure(); Temp = bme.readTemperature();  // считать давление и температуру
  attachInterrupt(0, wakeUp, LOW); // восстановить прерывания от кнопки
 // для экранов с инверсным подсветом использовать lightPin2
  if  (light_on > 0) {
    digitalWrite(lightPin1, 1);digitalWrite(lightPin2, 0);
    light_on--;
  }
  else {digitalWrite(lightPin1, 0);digitalWrite(lightPin2, 1);} // lcd light on/off
  
 


  if (Pressure > 80000) {
  P_Mid = (P_Mid + (Pressure - 80000))/2;} // усреднение замеров, отбрасываем показания ниже 800мbar.
    if (Count_Minute >= 20){ Refresh = true; // каждые 20 мин. запоминаем усредненное значение в память и обновляем графики


 
    if (p_count == 216) {
      for (int i = 0; i < 216; i++) // сдвигаем если буфер полон
      {
        P_Mem[i] = P_Mem[i+1];
      }
    } 
    else {
      p_count++;
    }
    P_Mem[p_count] = P_Mid; 
    if (Pressure > 80000){
      P_Mid = Pressure - 80000; // новый старт усреднения
    }
    Count_Minute = 0;
  }


#if defined (gasim_lcd)
    if ((Son_count < 15)&&(!Lcd_On)) {myGLCD.disableSleep(); Lcd_On = true;}   // Если разрешено, гасим дисплей через 15 мин.
    if ((Son_count >= 15)&&(Lcd_On)) {myGLCD.enableSleep(); Lcd_On = false;}
#endif
//  Отображение экранов
if (Lcd_On) {switch (scr_num)
  {
  case 0:  // summary screen
    Refresh = true;          // Обновить отрисовку каждый цикл
 
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(BigNumbers);

    //Давление с BMP280
    if (Pressure >= 100000) {myGLCD.printNumI(Pressure / 100.0, 5, 5);} // 4 знака
    else {myGLCD.printNumI(Pressure / 100.0, 15, 5);} // 3 знака
    myGLCD.setFont(SmallFont);
    myGLCD.print(".", 60, 22);
    sotki = ((Pressure / 100.0)-int(Pressure / 100.0))*100;
    myGLCD.printNumI((sotki / 10), 66, 22, 1);// десятые 
    myGLCD.printNumI((sotki % 10), 72, 22, 1);// сотые
    myGLCD.print("t=", 20, 35);
    myGLCD.printNumF(Temp, 2, 32, 35);  //температура
    break;

  case 1:  // график давления c фиксированным масштабом    *****************************************************
     if (Refresh){    // Рисуем если разрешено обновить
     
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }
    P_Dt = 10 * 100.0;  // Размах графика 10мbar
    for (int i=p2; i<=p_count ; i++) {   // ищем окно графика
      if (P_win < P_Mem[i]) {
        P_win = P_win + P_Dt/2;         // сдвиг графика на половину текущего размера
      } 
      if ((P_win - P_Dt)> P_Mem[i]) {
        P_win = P_win - P_Dt/2;
      } 
    }    
    P_Max = P_win ;
    P_Min = P_Max - P_Dt;
    
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов 
        
    x=72;
   
      for (int i=p_count; i>p2 ; i--) {
        y = map (P_Mem[i],P_Max,P_Min,8,48);
        if (y < 8) {y = 8;}
        if (y > 47) {y = 47;} 
#if defined (zapolnen)        
        myGLCD.drawLine(x, y, x, 47);
#else        
        if (x == 72) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
             
        last_x = x; 
        last_y = y;
#endif        
        x--;
      }
   

    myGLCD.printNumF(Pressure/ 100.0, 2, 5, 0);  
    myGLCD.printNumF(Temp, 1, 60, 0);  //температура
    
    myGLCD.setFont(TinyFont);
    myGLCD.printNumI(int((P_win + 80000)/100.0)  % 100 , 76, 8, 2);
    myGLCD.printNumI(int((P_win + 80000-P_Dt/2)/100.0) % 100 , 76, 25, 2);
    myGLCD.printNumI(int((P_win + 80000-P_Dt)/100.0) % 100 , 76, 42, 2);

    }
    break;

  case 2:  // график давления за сутки с масштабированием
    if (Refresh){    // Рисуем если разрешено обновить
    
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }

    for (int i=p_count; i>p2 ; i--) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 
    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>p2 ; i--) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +80000)/ 100.0, 2, 20, 0);
    myGLCD.print("24 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+80000) / 100.0, 2, 20, 42);
    }
    break;

  case 3:  // график давления за трое суток  
    if (Refresh){    // Рисуем если разрешено обновить
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    for (int i=p_count; i>0 ; i = i - 3) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 

    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>0 ; i = i - 3) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }

        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +80000)/ 100.0, 2, 20, 0);
    myGLCD.print("72 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+80000) / 100.0, 2, 20, 42);
    }
    break;   

  case 4: // напряжение аккумулятора для контроля
    Refresh = true;          // Обновить отрисовку каждый цикл
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов
    myGLCD.print("Bat:", LEFT, 15);    
    myGLCD.printNumF(analogRead(batPin)/176.6, 2, 24, 15);  //напр.батареи (коэфф. подобрать при желании)
    break;
  }

  if (Refresh) {myGLCD.update(); Refresh = false;} // Вывод вместимого буфера на дисплей и сброс признака обновления
} // if (Lcd_On)

    }  // скобка для условия сна в начале цикла в отладке не спим



  attachInterrupt(0, wakeUp, LOW); // Проснемся от кнопки


  //    Отключить питание на 4с
 
     LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); 
 

   if (!key_pressed) {tik++;} else {key_pressed = false; Son_count = 0;} // в зачёт 4с. если не тыкали кнопку
 
    if (tik >=15) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
 
} // Конец цикла


void wakeUp() // прерывание сна по нажатию кнопки
{
  // Just a handler for the pin interrupt.
  detachInterrupt(0); 
  if (light_on > 0) {scr_num++;} // Первый тычок только подсвет
  light_on = 2;            // после нажатия на кнопку подсветка 2*4 = 8с.
  Refresh = true;        // Обновить отрисовку
  key_pressed = true;   // кнопку жали
    if (scr_num > 4) {
      scr_num = 0;
    }
    LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); //антидребезг
    attachInterrupt(0, wakeUp, LOW); // восстановить прерывания от кнопки
} 





 

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

Ну Вы Чеееловек! Спасибо большое! Все работает!

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

 Можно ещё немного обнаглеть вопросом? Вернее значение графика 800+215 1015mbar. Это означает если высше показывать не будет?  Если да то можно поменять например на 225? Просмотрел архив по своей местности максимальное было 1021 три раза за год. И второй можно ли корректировать давление. Мой датчик показывает на 3.3 mbar больше. Извините за назойливость. Я правда не программист, чтобы Ваш скетч оттранслировать и прошить трое суток в гугле просидел. Спасибо.

s13
Offline
Зарегистрирован: 22.05.2016

Выше будет, это просто стартовое значение окна. Если ниже или выше окно сместится. Поправить показания на 3.3мбар можно если в строке 85 и 108 где идёт опрос датчика вычесть 330, bme.readPressure()-330;

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

 long P_win = 215 * 100.0;    // Верхняя граница абс. графика по умолчанию до сдвига (800 + 215) = 1015mbar

 Я имел в виду верхнюю границу графика 1015mbar. Если давление выше будет рисовать? Корректирровку ввёл показывает теперь точно. Извините если вопрос глупый просто пытаюсь разобраться. Да и ещё забываю спросить делитель на вход от акка расчитан под литий 3.2в до 4.2в или нет? Спасибо.