Проблема с BMP-280?

Петрович
Offline
Зарегистрирован: 17.03.2016

Нет, пока есть пара проблем в железе и огромная проблема со временем - внук у меня родился. Много времени уходит на помощь дочери (в поликлиннику свозить, документы оформить, прописать в квартире и т.д.) А с железом вот какая проблема. Было все собрано на DIP ATMega 328, на макетке. В нее сразу залил загрузчик с Ардуины 3-х вольтовой и потом скетч. Сначала все работало нормально, потом изображение на индикаторе пропало. Ресет не помог. Выключил - оставил так. Через пару часов включил, все работает. Потом снова все отключается. Закономерности по времени никакой нет, может и трое суток проработать, может через час выключиться. И на включение похожая ситуация, может сразу включиться, а может только через сутки. Не пойму. Хотя есть догадка - кварц на меге поставил тот который был - на 12 МГц, а нужен на 8. Может по этому через время срывается генерация...? 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Я для narodmon.ru буду делать на Wemos D1, жду датчики, едут два BMP-280, DS18B20 у меня россыпью штук 50 есть, еще едут DS3231 и еще какие-то, на HMC5883L хотел флюгер сделать, но думаю проще будет на энкодере 360 градусов, но он по цене кусается 1500= )))
Я поколдую с твоим скетчем, запущу под I2C, скину здесь

Вот болванка под I2C, датчики не ставил, дисплей работает )))
Компилировал под 1.6.12 но некоторые библиотеки из под старых версий ставят систему в позу, подправил пути для файлов библиотек

Ты BMP-280 к чему и как подключаешь?
У меня он не заработал, видимо брак, ни по I2C - ни по SPI-SOFT

Viacon
Offline
Зарегистрирован: 28.11.2016

Это заработавший скетч на библиотеке "SparkFun_BME280" - сокращёный пример, но есть несколько "но".

#include "SparkFunBME280.h"
#include "Wire.h"
BME280 mySensor;
 
void setup() {
mySensor.settings.commInterface = I2C_MODE;
mySensor.settings.I2CAddress = 0x76;
mySensor.settings.runMode = 3; //Normal mode
mySensor.settings.tStandby = 0;
mySensor.settings.filter = 0;
mySensor.settings.tempOverSample = 1;
mySensor.settings.pressOverSample = 1;
mySensor.settings.humidOverSample = 1;
 
Serial.begin(57600);
delay(10);
Serial.println(mySensor.begin(), HEX);
}
 
void loop() {
Serial.print("Temperature: ");
Serial.print(mySensor.readTempC(), 2);
Serial.println("*C");
 
Serial.print("Temperature: ");
Serial.print(mySensor.readTempF(), 2);
Serial.println("F");
 
Serial.print("Pressure: ");
Serial.print(mySensor.readFloatPressure(), 2);
Serial.println("Pa");
 
  Serial.print("Pressure: ");
  Serial.print((mySensor.readFloatPressure(), 2)/133.3333);
  Serial.println("mmHg");
  
Serial.print("Altitude: ");
Serial.print(mySensor.readFloatAltitudeMeters(), 2);
Serial.println("m");
 
Serial.print("Altitude: ");
Serial.print(mySensor.readFloatAltitudeFeet(), 2);
Serial.println("ft");
 
Serial.print("%RH: ");
Serial.print(mySensor.readFloatHumidity(), 2);
Serial.println("%");
Serial.println();
 
delay(5000);
}
- скетч получается аж 10 644 байт (34%) - есть мысли как запустить на библиотеке "Grove_BME280-master", мне кажется размер будет гораздо меньше.
- не удалось вычислить давление в мм ртутн. столба - перепробовал несколько вариантов - есть что подсказать?
- без строки "Serial.println(mySensor.begin(), HEX);" не выводится параметр "Pressure" - Давление, а с этой строкой также в начале выводится цифра 58 - ну и как это победить?
ra6fnq
ra6fnq аватар
Offline
Зарегистрирован: 26.10.2011

ua6em пишет:
Ты BMP-280 к чему и как подключаешь?
У меня он не заработал, видимо брак, ни по I2C - ни по SPI-SOFT

паяю smd-шный 1117 прям на датчик давления, SCL-13, SDA-11, CSB-10, SD0-12, по IIC надо менять адрес в библиотеке, на 076

не знаю как тут вставлять картинки.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Viacon пишет:

- не удалось вычислить давление в мм ртутн. столба - перепробовал несколько вариантов - есть что подсказать?
- без строки "Serial.println(mySensor.begin(), HEX);" не выводится параметр "Pressure" - Давление, а с этой строкой также в начале выводится цифра 58 - ну и как это победить?

1. умножить на коэффициент (ртуть в 13 с гаком раз тяжелее воды к примеру) или напрямую к примеру 1000 гектопаскалей это 750 мм ртутного столба

2. А через String?

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

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Genri5 пишет:

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

Отсюда?

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

Да.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ra6fnq пишет:

ua6em пишет:
Ты BMP-280 к чему и как подключаешь?
У меня он не заработал, видимо брак, ни по I2C - ни по SPI-SOFT

паяю smd-шный 1117 прям на датчик давления, SCL-13, SDA-11, CSB-10, SD0-12, по IIC надо менять адрес в библиотеке, на 076

не знаю как тут вставлять картинки.

Картинки вставлять просто, нажимаешь кнопку изображение, далее кнопку выбор на сервере, потом загрузить, потом вставить и всё

Sherzod
Offline
Зарегистрирован: 17.04.2016

Получил китайский BMP-280, но настроить пока не получается. 
Распиновка:
SCL - 13
SDA - 11
CSB - 10
SDO - 12

Запустил Adafruit'овский тестовый скетч. Библиотека естественно от Adafruit, но в архиве не было файла Adafruit_Sensor.h. Докачал откуда то, тоже вроде с github. 

Температура в комнате где тестировался датчик примерно 25 градусов
Давление у нас по данным гидрометеостанций примерно 767 мм рт. ст.
А высота примерно 495 м над уровнем моря.
 
Сначала не стал паять ножки к плате датчика, а просто воткнул и соединил кабелями. Результаты были разные когда датчик просто лежал (результат №1) и когда прижимал кабели плотнее к датчику для лучшего соединения (результат №2):
Temp = 25.43 *C
Pressure = 562.72 mm.rt.st
~Height = 2465.58 m
 
Temp = 42.82 *C
Pressure = 728.79 mm.rt.st
~Height = 336.41 m

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

Потом запаял ножки к датчику и тогда получаю только результаты ближе к №2.
Temp = 41.76 *C
Pressure = 723.45 mm.rt.st
~Height = 415.29 m

Temp = 41.73 *C
Pressure = 723.46 mm.rt.st
~Height = 415.07 m
 
Как получить правильные данные? А именно:
1. Температуру
2. Давление и высоту. Вроде надо поменять значение 1013.25 на другое. Так вот на какое? Из какой формулы рассчитать для моей местности эту значению? Или же надо копать в другую сторону?
gulin176
Offline
Зарегистрирован: 03.09.2016

если датчик меняет значения адекватно, то просто в скетче сделайте вот так 

1lcd.print((uint32_t)mySensor.readFloatPressure() / 100 + 15); lcd.print("Pa "); //+15 korrekcija

это я подогнал показания bme280 под показания домашней метеостанции орегон. а вы можете в своей местности посмотреть на народмон и также подкорректировать показания

_zerabot_
Offline
Зарегистрирован: 26.05.2017

Всем привет, вчера закончил программу для своей погодной станции. Пока гуглил по датчику BMP280 натыкался на эту ветку форума.

У меня возникло одно замечание, для всех ваших скетчей, вы слишком часто опрашиваете датчики, у меня, когда я опрашиваю чаще чем 5-10 секунд, медленно но заметно начинает повышатся температура DHT3231 и DS18D20. За BMP280 такой беды не замеченно, но на всякий случай я опрашиваю датчики 1 раз в минуту.

Я собрал станцию (пока на макетке) на часах DHT3231, внешнем датчике температуры DS18D20, барометр BMP280, экран 20*4 I2C, гигрометр DHT-11 (знаю, гадость, но у нас из-за боевых действий другие купить проблематично) и 7 сегментный дисплей на TM1637 чтобы было издалека видно время.

Погодная станция прогнозирует изменение погоды по алгоритму Zambretti, основываясь на динамике изменения давления за последние 3 часа. Может строить график изменения давления, температуры внутри и снаружи за последние 20 часов. Запоминает время достижения минимального и максимального значения 2 температур, влажности и давления за эти сутки. Выводит основные показатели на COM порт. Возможность выставлять время, дату и день недели кнопками. На остальное не хватило памяти. Скорее всего, как разбогатею, куплю еще 1 микроконтроллер, на него повешу опрос всех датчиков и экраны и буду передавать через COM порт на 2-й МК, в котором будут обрабатываться данные, и прочие плюшки =)

 

Комменты на английском, мне так легче, ненавижу язык переключать =)

001//lcd
002#include <LiquidCrystal_PCF8574.h>
003LiquidCrystal_PCF8574 lcd(0x27);
004 
005//Clock
006#include <Wire.h>
007#include "Sodaq_DS3231.h"
008#include <DallasTemperature.h>
009char weekDay[][4] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
010 
011 
012 
013//barometr
014#include <BME280I2C.h>
015BME280I2C bme;
016float hPa = 0;
017float Altitude = 0;
018float MaxPressure = 0, MinPressure = 65000;
019float MaxTempO = -200, MinTempO = 200, MaxTempIn = -200, MinTempIn = 200;
020DateTime MaxPressureT, MinPressureT;
021DateTime MaxTempOT, MinTempOT, MaxTempInT, MinTempInT, TempTime;
022float Pres = 0;
023float InT, OutT;
024 
025 
026 
027 
028//LedDisplay
029#include "TM1637.h" // Подключаем библиотеку
030#define CLK 13 // К этому пину подключаем CLK
031#define DIO 12 // К этому пину подключаем DIO
032TM1637 tm1637(CLK, DIO);
033 
034//humidity
035#include <SimpleDHT.h>
036int pinDHT11 = 9;
037SimpleDHT11 dht11;
038byte Hum = 0;
039byte DHT11temperature = 0;
040byte MaxHum = 0, MinHum = 101;
041DateTime MaxHumT, MinHumT;
042 
043 
044 
045//buttons
046#define BTN 6
047#define BTNUP 5
048#define BTNDOWN 4
049 
050 
051 
052//int LCDled = 3;           // the PWM pin the LED is attached to
053 
054//Main Display mode 1- show main screen,2 shov max and min time... etc..
055int DisplayMode = 0;
056 
057int  _m, _s, _mon, _day, _week;
058int _h, _year;
059 
060 
061 
062 
063 
064//unsigned long RefreshLCD;
065unsigned long TimeReturn;
066DateTime now;
067DateTime PowerOn;
068byte LastRead, ResetVals;
069unsigned long old_ts = 0;
070 
071 
072 
073 
074float PressureHistory [20] = {
075  700, 700, 700, 700, 700,
076  700, 700, 700, 700, 700,
077  700, 700, 700, 700, 700,
078  700, 700, 700, 700, 700
079};
080 
081float TempHistoryIn [20] = {
082  -127, -127, -127, -127, -127,
083  -127, -127, -127, -127, -127,
084  -127, -127, -127, -127, -127,
085  -127, -127, -127, -127, -127
086};
087float TempHistoryOut [20] = {
088  30, 40, 42, 39, 38,
089  10, 40, 42, 39, 38,
090  -1, 40, 42, 39, 38,
091  30, 40, 42, 39, 38
092};
093 
094 
095//OutTemp
096#define ONE_WIRE_BUS 8
097OneWire oneWire(ONE_WIRE_BUS);
098DallasTemperature sensors(&oneWire);
099 
100 
101//Chars for graph
102byte ArrCharIndex[9] = {
103  254, 2, 95, 3, 4, 176, 5, 6, 7
104};
105 
106//Zambretty array
107byte Zarr[32] =
108{ 0,//a
109  0,//b
110  0,//d
111  1,//h
112  5,//o
113  5,//r
114  5,//u
115  5,//v
116  5,//x
117  0,//a
118  0,//b
119  1,//e
120  2,//k
121  4,//n
122  5,//p
123  5,//s
124  5,//w
125  5,//x
126  8,//z
127  0,//a
128  0,//b
129  0,//c
130  0,//f
131  1,//g
132  2,//i
133  3,//j
134  3,//l
135  3,//m
136  6,//q
137  6,//t
138  7,//y
139  8//z
140};
141 
142String ForecastText[] =
143{
144  "Will fine",//0
145  "Fine>shower",//1
146  "Shower>imp.",//2
147  "Changeable>imp.",//3
148  "Showery/bright",//4
149  "Rain",//5
150  "Unsettled",//6
151  "Storm",//7
152  "Storm>rain"//8
153};
154 
155//hum icon
156byte HumCHR[8] = {
157  B00100,
158  B00100,
159  B01010,
160  B01010,
161  B10001,
162  B10001,
163  B10001,
164  B01110
165};
166//temp icon
167byte Temp[8] = {
168  B00100,
169  B01010,
170  B01010,
171  B01110,
172  B01110,
173  B11111,
174  B11111,
175  B01110
176};
177 
178//graph char 1/8
179byte ch1[8] = {
180  B00000,
181  B00000,
182  B00000,
183  B00000,
184  B00000,
185  B00000,
186  B00000,
187  B11111
188};
189//graph char 2/8 is _ char
190 
191//graph char 3/8
192byte ch3[8] = {
193  B00000,
194  B00000,
195  B00000,
196  B00000,
197  B00000,
198  B11111,
199  B00000,
200  B00000
201};
202//graph chars 4/8
203byte ch4[8] = {
204  B00000,
205  B00000,
206  B00000,
207  B00000,
208  B11111,
209  B00000,
210  B00000,
211  B00000
212};
213 
214//graph char 5/8 is - char
215 
216//graph chars 6/8
217byte ch6[8] = {
218  B00000,
219  B00000,
220  B11111,
221  B00000,
222  B00000,
223  B00000,
224  B00000,
225  B00000
226};
227 
228//graph char 7/8
229byte ch7[8] = {
230  B00000,
231  B11111,
232  B00000,
233  B00000,
234  B00000,
235  B00000,
236  B00000
237};
238 
239//graph char 8/8
240byte ch8[8] = {
241  B11111,
242  B00000,
243  B00000,
244  B00000,
245  B00000,
246  B00000,
247  B00000
248};
249void setup ()
250{
251 
252  pinMode(BTN, INPUT_PULLUP);
253  pinMode(BTNUP, INPUT_PULLUP);
254  pinMode(BTNDOWN, INPUT_PULLUP);
255 
256 
257 
258 
259 
260 
261  Wire.begin();
262  Wire.beginTransmission(0x27);
263 
264  lcd.begin(20, 4); // initialize the lcd
265  //load custom chars
266  lcd.createChar (0, Temp);
267  lcd.createChar (1, HumCHR);
268  lcd.createChar (2, ch1);
269  lcd.createChar (3, ch3);
270  lcd.createChar (4, ch4);
271  lcd.createChar (5, ch6);
272  lcd.createChar (6, ch7);
273  lcd.createChar (7, ch8);
274 
275  //must be called after loading chars
276  lcd.home();
277  lcd.clear();
278  lcd.print("Wait");
279 
280  while (!bme.begin()) {
281    lcd.clear();
282    lcd.print("PrSensorError");
283  }
284  while (!rtc.begin()) {
285    lcd.clear();
286    lcd.print("ClockError");
287  }
288  lcd.setBacklight(255);
289 
290  // SetBrightness(brightness);
291  tm1637.init();
292  tm1637.set(7);
293 
294  //just read data from sensors ds18d20 sometimes in first read return 85.0C
295  readSensors(rtc.now(), true, false);
296 
297  PowerOn = rtc.now();
298  LastRead = rtc.now().hour();
299  ResetVals = rtc.now().date();
300  //store first values  from sensors to limit values
301  readSensors(rtc.now(), true, true);
302  //save current values from the sensors to history
303  //for normal graph view in first 20 hours of work
304  for (int tt = 0; tt < 20; tt++)
305  {
306    PressureHistory[tt] = Pres;
307    TempHistoryIn[tt] = InT;
308    TempHistoryOut[tt] = OutT;
309 
310  }
311  //show main screen by default
312  DisplayMode = 1;
313  //try to forecast =)
314  Forecast(now.month());
315  Serial.begin(9600);
316}
317 
318 
319 
320void loop ()
321{
322  //return to main screen from any other mode in 10 sec inactivity
323  if ( millis() - TimeReturn > 10000) {
324    if (DisplayMode != 1) {
325      lcd.clear();
326      lcd.home();
327      DisplayMode = 1;
328    }
329    TimeReturn = millis();
330  }
331  //main screen
332  if (DisplayMode == 1 ) {
333    now = rtc.now(); //get the current date-time
334    uint32_t ts = now.getEpoch();
335    //check second changed or not
336    if (old_ts != ts) {
337      old_ts = ts;
338      //Write time  on tm1367
339      tm1637.display(0, now.hour() / 10);
340      tm1637.display(1, now.hour() % 10);
341      tm1637.display(2, now.minute() / 10);
342      tm1637.display(3, now.minute() % 10);
343      //blink dot
344      tm1637.point(ts % 2 == 0 ? POINT_OFF : POINT_ON);
345      //write current time and date on 20*4
346      WriteTimeDT(now, 0, 0);
347      WriteDateDT(now, 6, 0);
348      //if hour changes store current sensor values to history
349      if (LastRead != now.hour())
350      {
351        LastRead = now.hour();
352        readSensors(rtc.now(), truetrue);
353        for (byte i = 0; i < 19; i++) {
354          PressureHistory[i] = PressureHistory[i + 1];
355          TempHistoryIn[i] = TempHistoryIn[i + 1];
356          TempHistoryOut[i] = TempHistoryOut[i + 1];
357 
358        }
359        TempHistoryIn[19] = InT;
360        TempHistoryOut[19] = OutT;
361        PressureHistory[19] = Pres;
362        //if date changes reset limit values
363        if ( ResetVals != now.date()) {
364          ResetVals = now.date();
365          MaxTempO = -200;
366          MinTempO = 200;
367          MaxTempIn = -200;
368          MinTempIn = 200;
369          MaxPressure = 0;
370          MinPressure = 65000;
371          MaxHum = 0;
372          MinHum = 101;
373          readSensors(rtc.now(), true, true);
374        }
375      }
376      //read sensors values
377      //each sensor interrogated 1 time per 60 seconds
378      //and 20 seconds delay between different sensors
379      if (now.second() % 10 == 0 &&  now.second() > 0)
380      {
381        readSensors(now, false, true);
382        lcd.setCursor(0, 3);
383        lcd.print("               ");
384        lcd.setCursor(0, 3);
385        //try to forecast
386        //this function wrute on 4 line forecast
387        lcd.print(Forecast(now.month()));
388        //serial write some data
389        Serial.print("<h");
390        Serial.print(now.hour());
391        Serial.print("m");
392        Serial.print(now.minute());
393        Serial.print("s");
394        Serial.print(now.second());
395        Serial.print("D");
396        Serial.print(now.date());
397        Serial.print("M");
398        Serial.print(now.month());
399        Serial.print("Y");
400        Serial.print(now.year());
401        Serial.print("d");
402        Serial.print(weekDay[now.dayOfWeek() - 1]);
403        Serial.print("InT");
404        Serial.print(InT);
405        Serial.print("Out");
406        Serial.print(OutT);
407        Serial.print("Hum");
408        Serial.print(Hum);
409        Serial.print("Pres");
410        Serial.print(Pres);
411        Serial.print("F-t");
412        Serial.print(Forecast(now.month()));
413        Serial.println(">");
414      }
415    }
416 
417    //2 line
418    lcd.setCursor(0, 1);
419    //write in temp
420    lcd.print("In");
421    //write custom temp char
422    lcd.print(char(0));
423    lcd.print(InT);
424    //write out temp
425    lcd.print(" Out");
426    //write custom temp char
427    lcd.print(char(0));
428    lcd.print(OutT);
429    //3 line
430    lcd.setCursor(0, 2);
431    //write custom humidity char
432    lcd.print(char(1));
433    //write humidity
434    lcd.print(Hum);
435    lcd.print("% ");
436    lcd.print(Pres);
437    lcd.print("mmHg ");
438  }
439 
440  //show limit waluea for out temp
441  if (DisplayMode == 2)
442  {
443    lcd.setCursor(0, 0);
444    lcd.print("Max out t");
445    WriteTimeDT(MaxTempOT, 0, 13);
446    lcd.setCursor(0, 1);
447    lcd.print(MaxTempO);
448    lcd.setCursor(0, 2);
449    lcd.print("Min out t");
450    WriteTimeDT(MinTempOT, 2, 13);
451    lcd.setCursor(0, 3);
452    lcd.print(MinTempO);
453  }
454  //draw graph for out temp
455  if (DisplayMode == 3)
456  {
457    lcd.setCursor(0, 0);
458    lcd.print("Out t hist");
459    drawGraphFullScreen(TempHistoryOut);
460  }
461  //show limit walues for in temp
462  if (DisplayMode == 4)
463  {
464    lcd.setCursor(0, 0);
465    lcd.print("Max in t");
466    WriteTimeDT(MaxTempInT, 0, 13);
467    lcd.setCursor(0, 1);
468    lcd.print(MaxTempIn);
469    lcd.setCursor(0, 2);
470    lcd.print("Min in t");
471    WriteTimeDT(MinTempInT, 2, 13);
472    lcd.setCursor(0, 3);
473    lcd.print(MinTempIn);
474  }
475  //draw graph for in temp
476  if (DisplayMode == 5)
477  {
478    lcd.setCursor(0, 0);
479    lcd.print("In t hist");
480    drawGraphFullScreen(TempHistoryIn);
481  }
482  //show limit walues for pressure
483  if (DisplayMode == 6)
484  {
485    lcd.setCursor(0, 0);
486    lcd.print("Max pressure");
487    WriteTimeDT(MaxPressureT, 0, 13);
488    lcd.setCursor(0, 1);
489    lcd.print(MaxPressure);
490    lcd.setCursor(0, 2);
491    lcd.print("Min pressure");
492    WriteTimeDT(MinPressureT, 2, 13);
493    lcd.setCursor(0, 3);
494    lcd.print(MinPressure);
495  }
496  //draw graph for pressure
497  if (DisplayMode == 7)
498  {
499    lcd.setCursor(0, 0);
500    lcd.print("Pressure hist");
501    drawGraphFullScreen(PressureHistory);
502  }
503  //show limit walues for humidity
504  if (DisplayMode == 8)
505  {
506    lcd.setCursor(0, 0);
507    lcd.print("Max humidity");
508    WriteTimeDT(MaxHumT, 0, 13);
509    lcd.setCursor(0, 1);
510    lcd.print(MaxHum);
511    lcd.setCursor(0, 2);
512    lcd.print("Min humidity");
513    WriteTimeDT(MinHumT, 2, 13);
514    lcd.setCursor(0, 3);
515    lcd.print(MinHum);
516  }
517 
518  //show Altitude, uptime and (c)
519  if (DisplayMode == 9)
520  {
521    lcd.setCursor(0, 0);
522    lcd.print("Altitude ");
523    lcd.print(Altitude);
524    lcd.print("m ");
525 
526    lcd.setCursor(0, 1);
527    lcd.print("PowerOn");
528    WriteTimeDT(PowerOn, 2, 0);
529    WriteDateDT(PowerOn, 6, 2);
530    lcd.setCursor(0, 3);
531    lcd.print("(c)IvanchenkoAV 2017");
532  }
533 
534  //if button up pressed
535  if (!digitalRead(BTNUP) && DisplayMode < 100)
536  {
537    DisplayMode++;
538    lcd.clear();
539 
540  }
541  //if button down pressed
542  if (!digitalRead(BTNDOWN) && DisplayMode < 100)
543  {
544    DisplayMode--;
545    lcd.clear();
546 
547  }
548  //display menu limits
549  if (DisplayMode == 10)
550  {
551    DisplayMode = 1;
552  }
553  //display menu limits
554  if (DisplayMode == 0)
555  {
556    DisplayMode = 9;
557  }
558 
559  //set button pressed
560  if (!digitalRead(BTN)) {
561    TimeReturn = millis();
562    //if set button pressed in main screen mode
563    if (DisplayMode < 100)
564    {
565      DisplayMode = 100;
566      //save current time to temp values
567      TempTime = rtc.now();
568      _h = TempTime.hour();
569      _m = TempTime.minute();
570      _day = TempTime.date();
571      _mon = TempTime.month();
572      _year = TempTime.year();
573      _week = TempTime.dayOfWeek();
574    }
575    else
576      //if button pressed in set mode
577      DisplayMode++;
578    //menu limit
579    if (DisplayMode == 107) {
580      lcd.setCursor(0, 1);
581      lcd.print("Cancel");
582      delay(3000);
583      DisplayMode = 1;
584      lcd.clear();
585    }
586    //delay(300);
587 
588  }
589  delay(200);
590  //disp.set(brightness / 64 + 1);
591 
592  //reset time return if any buton pressed
593  if (!digitalRead(BTNUP) || !digitalRead(BTNDOWN)) {
594    TimeReturn = millis();
595  }
596  //temp hour set
597  if (DisplayMode == 100)
598  {
599    if (!digitalRead(BTNUP))
600      _h++;
601    if (!digitalRead(BTNDOWN))
602      _h--;
603 
604    if (_h > 23)
605      _h = 0;
606    if (_h < 0)
607      _h = 23;
608    lcd.clear();
609    lcd.home();
610    lcd.print("Hour ");
611    lcd.print(_h);
612  }
613  //temp minute set
614  if (DisplayMode == 101)
615  {
616 
617    if (!digitalRead(BTNUP))
618      _m++;
619    if (!digitalRead(BTNDOWN))
620      _m--;
621 
622    if (_m >= 60)
623      _m = 0;
624    if (_m < 0)
625      _m = 59;
626    lcd.clear();
627    lcd.home();
628    lcd.print("Minute ");
629    lcd.print(_m);
630  }
631  //temp date set
632  if (DisplayMode == 102)
633  {
634 
635    if (!digitalRead(BTNUP))
636      _day++;
637    if (!digitalRead(BTNDOWN))
638      _day--;
639 
640    if (_day > 31)
641      _day = 1;
642    if (_day < 1)
643      _day = 31;
644    lcd.clear();
645    lcd.home();
646    lcd.print("Day ");
647    lcd.print(_day);
648  }
649  //temp month set
650  if (DisplayMode == 103)
651  {
652    if (!digitalRead(BTNUP))
653      _mon++;
654    if (!digitalRead(BTNDOWN))
655      _mon--;
656 
657    if (_mon > 12)
658      _mon = 1;
659    if (_mon < 1)
660      _mon = 12;
661    lcd.clear();
662    lcd.home();
663    lcd.print("Month ");
664    lcd.print(_mon);
665  }
666  //temp year set
667  if (DisplayMode == 104)
668  {
669 
670    if (!digitalRead(BTNUP))
671      _year++;
672    if (!digitalRead(BTNDOWN))
673      _year--;
674 
675    if (_year > 3000)
676      _year = 1;
677    if (_year < 1)
678      _year = 3000;
679 
680    lcd.clear();
681    lcd.home();
682    lcd.print("Year ");
683    lcd.print(_year);
684  }
685  //temp weekday set
686  if (DisplayMode == 105)
687  {
688    if (!digitalRead(BTNUP))
689      _week++;
690    if (!digitalRead(BTNDOWN))
691      _week--;
692 
693    if (_week > 7)
694      _week = 1;
695    if (_week < 1)
696      _week = 7;
697 
698 
699    lcd.clear();
700    lcd.home();
701    lcd.print("WeekDay ");
702    lcd.print(weekDay[_week - 1]);
703  }
704  // set new time?
705  if (DisplayMode == 106)
706  {
707    lcd.clear();
708    lcd.home();
709    lcd.print("Save Y/N?");
710 
711    //if button up pressed save new time
712    if (!digitalRead(BTNUP))
713    {
714      DateTime dt(_year, _mon, _day, _h, _m, 0, _week);
715      rtc.setDateTime(dt);
716      lcd.setCursor(0, 1);
717      lcd.print("Ok");
718      delay(3000);
719      DisplayMode = 1;
720      lcd.clear();
721    }
722    //if button down pressed - exit to main screen
723    if (!digitalRead(BTNDOWN)) {
724      lcd.setCursor(0, 1);
725      lcd.print("Cancel");
726      delay(3000);
727      DisplayMode = 1;
728      lcd.clear();
729    }
730  }
731}
732//write time in x,y of lcd
733void WriteTimeDT(DateTime Time, byte y, byte x) {
734  lcd.setCursor(x, y);
735  if (Time.hour() < 10)
736    lcd.print('0');
737  lcd.print(Time.hour());
738  lcd.print(Time.second() % 2 == 0 ? ':' : ' ');
739  if (Time.minute() < 10)
740    lcd.print('0');
741  lcd.print(Time.minute());
742}
743//write date in x,y of lcd
744void WriteDateDT(DateTime Time, int x, int y) {
745  lcd.setCursor(x, y);
746  if (Time.date() < 10)
747    lcd.print('0');
748  lcd.print(Time.date());
749  lcd.print('/');
750  if (Time.month() < 10)
751    lcd.print('0');
752  lcd.print(Time.month());
753  lcd.print('/');
754  lcd.print(Time.year());
755  lcd.print(' ');
756  lcd.print(weekDay[Time.dayOfWeek() - 1]);
757}
758 
759 
760 
761//draw graph
762void drawGraphFullScreen(float x[20]) {
763  //
764  float maxp = -30000, minp = 30000;
765  float divider;
766  byte curVal;
767  //saerch max and min values in history
768  for (byte i = 0; i < 20; i++)
769  {
770    if ( x[i] > maxp)
771      maxp =  x[i];
772    if ( x[i] < minp)
773      minp =  x[i];
774  }
775  //graph draw in 3 lines, so we have 24 pixels height graph
776  //Do not deny yourself anything =)
777  //  divider - value of division of 1 pixel +0.01 to prevert division by 0
778  divider = (maxp - minp) / 24 + 0.01;
779  //write value of division
780  lcd.setCursor(14, 0);
781  lcd.print(divider);
782 
783  for (byte i = 0; i < 20; i++)
784  {
785 
786    //draw 4 line, bottom of graph
787    curVal = byte((x[i] - minp) / divider);
788    lcd.setCursor(i, 3);
789    //if current value of graph catch in value 0 to 8*divider
790    //we draw chart
791    if (curVal <= 8)
792    {
793      //seach appropriate char in array of custom chars
794      if (curVal > 0)
795        lcd.print(char(ArrCharIndex[curVal]));
796      else
797        //if current val = min
798        lcd.print(char(2));
799    }
800    else
801      //if chart line upper than current line print blank char
802      lcd.print(char(ArrCharIndex[0]));
803    //draw 3 line - middle of graph
804    lcd.setCursor(i, 2);
805    if (curVal <= 16 && curVal > 8)
806      //if current value of graph catch in value  8*divider to 16*divider
807      //we draw chart
808      //seach appropriate char in array of custom chars
809      lcd.print(char(ArrCharIndex[curVal - 8]));
810    else
811      //if chart line upper or lover than current line print blank char
812      lcd.print(char(ArrCharIndex[0]));
813 
814    lcd.setCursor(i, 1);
815    //draw 4 line, bottom of graph
816    if (curVal <= 24 && curVal > 16)
817      //if current value of graph catch in value  16*divider to 24*divider
818      lcd.print(char(ArrCharIndex[curVal - 16]));
819    else
820      //if chart line lover than current line print blank char
821      lcd.print(char(ArrCharIndex[0]));
822  }
823}
824 
825//read data from sensors depending on currend second
826//bool Now means read all data immideatly
827//bool store mean save limiting values data or not
828void readSensors (DateTime Time, boolean Now, boolean store)
829{
830  if (!Now) {
831    switch  ( Time.second()) {
832 
833      case 20:
834        //out temp dht18d20
835        sensors.requestTemperatures();
836        OutT = sensors.getTempCByIndex(0);
837        //store limiting values and time when they arrived
838        if (store) {
839          if (OutT > MaxTempO) {
840            MaxTempO = OutT;
841            MaxTempOT = Time;
842          }
843          if (OutT < MinTempO) {
844            MinTempO = OutT;
845            MinTempOT = Time;
846          }
847        }
848 
849        break;
850      case 30:
851 
852        dht11.read(pinDHT11, &DHT11temperature, &Hum, NULL);
853        //store limiting values and time when they arrived
854        if (store) {
855          if (Hum > MaxHum) {
856            MaxHum = Hum;
857            MaxHumT = Time;
858          }
859          if (Hum < MinHum) {
860            MinHum = Hum;
861            MinHumT = Time;
862          }
863 
864        }
865        break;
866      case 40:
867 
868        float  hum(NAN);
869        uint8_t pressureUnit(0);                                           // unit: B000 = Pa, B001 = hPa, B010 = Hg, B011 = atm, B100 = bar, B101 = torr, B110 = N/m^2, B111 = psi
870        bme.read(Pres, InT, hum, true, pressureUnit);
871        hPa = Pres / 100 + Altitude / 9.4;
872        Pres = Pres * 0.00750063755419211;
873        Altitude = bme.alt(true);
874        //store limiting values and time when they arrived
875        if (store) {
876          if (Pres > MaxPressure) {
877            MaxPressure = Pres;
878            MaxPressureT = Time;
879          }
880          if (Pres < MinPressure) {
881            MinPressure = Pres;
882            MinPressureT = Time;
883          }
884 
885          if (InT > MaxTempIn) {
886            MaxTempIn = InT;
887            MaxTempInT = Time;
888          }
889          if (InT < MinTempIn) {
890            MinTempIn = InT;
891            MinTempInT = Time;
892          }
893 
894        }
895        break;
896 
897 
898    }
899  }
900  else {
901 
902    if (store) {
903 
904    }
905    //out temp dht18d20
906    sensors.requestTemperatures();
907    OutT = sensors.getTempCByIndex(0);
908    //read humidity
909    dht11.read(pinDHT11, &DHT11temperature, &Hum, NULL);
910    //reap pressure and temp
911    float  hum(NAN);
912    uint8_t pressureUnit(0);                                           // unit: B000 = Pa, B001 = hPa, B010 = Hg, B011 = atm, B100 = bar, B101 = torr, B110 = N/m^2, B111 = psi
913    bme.read(Pres, InT, hum, true, pressureUnit);
914    hPa = Pres / 100 + Altitude / 9.4;
915    //convert hPa to mmHh
916    Pres = Pres * 0.00750063755419211;
917    Altitude = bme.alt(true);
918    //store limiting values and time when they arrived
919    if (store) {
920      if (Pres > MaxPressure) {
921        MaxPressure = Pres;
922        MaxPressureT = Time;
923      }
924      if (Pres < MinPressure) {
925        MinPressure = Pres;
926        MinPressureT = Time;
927      }
928      if (InT > MaxTempIn) {
929        MaxTempIn = InT;
930        MaxTempInT = Time;
931      }
932      if (InT < MinTempIn) {
933        MinTempIn = InT;
934        MinTempInT = Time;
935      }
936      if (Hum > MaxHum) {
937        MaxHum = Hum;
938        MaxHumT = Time;
939      }
940      if (Hum < MinHum) {
941        MinHum = Hum;
942        MinHumT = Time;
943      }
944      if (OutT > MaxTempO) {
945        MaxTempO = OutT;
946        MaxTempOT = Time;
947      }
948      if (OutT < MinTempO) {
949        MinTempO = OutT;
950        MinTempOT = Time;
951      }
952 
953    }
954 
955 
956  }
957 
958}
959 
960 
961// Select weather index Zambretti
962String Forecast(byte Mon)
963{
964  float z = 0;
965  char a;
966  //Pressure is up
967  if (PressureHistory[19] - PressureHistory[18] > 0.8 && PressureHistory[18] - PressureHistory[17] > 0.8)
968  {
969    z = 179 - 2 * hPa / 12.9;
970    if (Mon >= 5 && Mon <= 9)
971      z -= 2;
972    if (Mon < 5 || Mon > 9)
973      z -= 1;
974    return "_-" + ForecastText[Zarr[int(z)]];
975  }
976  else
977    // Pressure is down
978    if (PressureHistory[19] - PressureHistory[18] < -0.8 && PressureHistory[18] - PressureHistory[17] < -0.8) {
979      z = 130 - hPa / 8.1;
980      return "-_" + ForecastText[Zarr[int(z)]];
981      if (Mon >= 5 && Mon <= 9)
982        z += 2;
983      if (Mon < 5 || Mon > 9)
984        z += 1;
985    } else {
986      //stable pressure
987      z = 147 - 5 * hPa / 37.6;
988      return "--" + ForecastText[Zarr[int(z)]];
989    }
990  //return forecast string
991 
992}

Фото основного экрана

еще фото

/sites/default/files/u29096/img_2017-05-26_123030_hdr.jpg

/sites/default/files/u29096/img_2017-05-26_123033_hdr.jpg

/sites/default/files/u29096/img_2017-05-26_123041_hdr.jpg

/sites/default/files/u29096/img_2017-05-26_123045_hdr.jpg

/sites/default/files/u29096/img_2017-05-26_123051_hdr.jpg

/sites/default/files/u29096/img_2017-05-26_123058_hdr.jpg

/sites/default/files/u29096/img_2017-05-26_123051_hdr_0.jpg

/sites/default/files/u29096/img_2017-05-26_123105_hdr.jpg

/sites/default/files/u29096/img_2017-05-26_123124_hdr.jpg

фоткать меню выставления времени не стал )

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Красиво получилось

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

ua6em пишет:

Красиво получилось

Что красивового то? Красиво - это когда черным по белому и понятным родным языком написано! :-)

Хотя бы вот так - 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Genri5 пишет:

ua6em пишет:

Красиво получилось

Что красивового то? Красиво - это когда черным по белому и понятным родным языком написано! :-)

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

К коду замечания есть? есть - свой код в студию, посозерцаем на ваши шедевры

Лично я лучшей математики в реализации метеостанции не видел, носом ткните если знаете, что такое есть

_zerabot_
Offline
Зарегистрирован: 26.05.2017

Genri5 пишет:

Что красивового то? Красиво - это когда черным по белому и понятным родным языком написано! :-)

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

И как уже говорилось выше, если у вас экран это поддерживает, замените в исходнике текст, дело 5 минут. А тратить драгоценную память переменных под русские буквы, для меня непозволительно. И так думаю уже о объединении 2 МК в одном устройстве, для освобождения ресурсов. Один чисто как хранилище данных использовать. Кстати, в данном виде, если вы проведете русификацию, у вас не загрузится прошивка, не хватит бамяти. В этом коде если использовать еще 42 байта памяти переменных программа начинает работать нестабильно, из-за нехватки памяти. Тут каждая команда выверена и 3 раза оценена именно с точки зрения уменьшения объема кода. Я пробовал разные варианты одного и того же, и выбирал самый легковесный. В планах еще поковырять библиотеки, возможно там есть за счет чего освободить память.

Лично для меня основная фишка прибора - именно прогноз. Я на непосредственно программу потратил от силы 5-6 часов. С подключением устройств и долбежкой с библиотеками. И примерно 20 часов искал в интернете что то вменяемое, что можно запрограммировать.

И второй фишкой является то, что на приборе можно выставлять время без сторонних примочек.

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

Нашел на барахолке, не знаю что это, но явно втыкалось в комп.

Если заработает, я спасен и я смогу сделать еще кучу хотелок.

В планах, если заработает:

*Внести все варианты ветвления прогноза калькулятора Zambretti без обобщений и сокращений, с плавной прокруткой длинных строк, что то типа бегущей строки но 1-й;

*График изменения влажности (не хватило памяти);

*Графики с заполнением, а не черточки как сейчас. И шаг графиков 6 минут, вместо 1 часа,  получается очень красиво красиво, но сейчас не хватает памяти даже для 1 параметра;

*Автоматическая плавная яркость 2 экранов;

*Будильник;

*RGB Подсветка с плавным переходом оттенков в зависимости от внешней t. (холодно - синий, по мере потепления - желтый, зона комфорта - зеленый, жарко - красный;

*Внешние радио датчики температуры, влажности, освещенности и т.п. связуемые через 433мГц передатчик;

*Датчик солнечной радиации;

*Счетчик Гейгера (уже готов, собран на другом МК, но на погодной станции не хватает памяти, чтобы получать данные с него). Планировал подключение через 433мГц пердатчик, чтобы счетчик Гейгера был автономным самсодостаточным устройством, но если окажется включенным в зоне погодной станции, чтобы она автоматом тянула с него показания.

Все это можно сделать за пару часов, но... Где бы мне купить Мегу 256 по цене как на Али, а не за 4700 рублей как у нас. =)

ЗЫ мне отчасти английский даже понятнее, жене - всеравно, мелкому пока вообще всеравно какая погода, время суток и температура)

ЗЫЫ а кто сказал, что для меня русский - родной ;)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AD73360 однозначно вжаренная, шесть 16 битных ацп

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

_zerabot_, не принимайте все близко к сердцу. Извините, если обидел. Главное, Вы достигли цели, Вас это устраевает, а остальное .... .

_zerabot_
Offline
Зарегистрирован: 26.05.2017

>>Genri5 Да какие обиды. Просто у каждого свои вкусы и фломастеры на вкус и цвет разные )

>>ua6em Меня на плате интересует Мега 128, там есть где разгуляться в плане ресурсов. Кстати, сейчас гуглил по вопросу нехватки памяти, возможно я нашел выход. Нашел код, который позволяет хранить строковые данные в области памяти программы. А у меня там около 8 кб свободно еще, такчто возможно живем еще.

Если кто то хочет пострадать с прогнозом погоды http://monatkodenis.blogspot.com/2016/09/zambretti-3.html

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

_zerabot_
Offline
Зарегистрирован: 26.05.2017

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

По сравнению с предыдущим вариантом добавлено:

* Автояркость на основании аналогового фоторезистора

* Меню для пользовательского выставления высоты, вызывается одновременным нажатием кнопок + и -, изменение ими же, сохранение - кнопка Set.

* Реализованны все ветвления калькулятора Zambretti в оригинальном виде без изменений.

* Уменьшенны пороги определения динамики изменения погоды. Теперь считается, что давление падает или растет если изменилось на 0.2 мм за 3 часа или 0.3 мм за 4 часа.

* Исправленна ошибка размерности, при приведении давления к уровню моря в прогнозе прибавлял mmHg к hPa.

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

* Косметические изменения функции вывода времени (на основном экране точки мигают, на остальных экранах всегда отображаются статично)

* Автопрокрутка длинных строк для прогноза.

* Приделан костыль для датчика 18d20, который 50/50 при первых 1-2 замерах показывает температуру 85.0, после работает стабильно неделями. Уже не первый раз сталкиваюсь.

* Почасовой график влажности.

 

 

Qanatoz
Offline
Зарегистрирован: 24.05.2017

Кстати, сейчас на eBay активно продаются аналоги (судя по маркировке) BMP280  и фейковые BME280 с прямоугольным а не квадратным чипом. В конце июня получил свой BMP280 датчик, так не смог заставить его работать ни по SPI ни по I2C. Продавец вернул деньги и только сегодня я заметил, что чип впаян вверх ногами. Сдул и перепаял - работает отлично. Обратите внимание, что отверстие чипа должно быть направлено к резисторам а не к конденсатору. На фото неправильно впаянный чип.

besteugen
Offline
Зарегистрирован: 03.12.2015

у меня получилось вот это...

 

besteugen
Offline
Зарегистрирован: 03.12.2015

kost2003
Offline
Зарегистрирован: 26.05.2017

Всем доброго дня! Товарищи подскажите приобрел BME280 на али подключил по i2c первые показания выдает нормальные но секунд через 5 сваливаеться в крайние значения мин темпиратура -144 макс влажность 100 процентов и давление тож самое в чем может быть проблема?

besteugen
Offline
Зарегистрирован: 03.12.2015

попрубуй посадить cs на 3,3v

sadman41
Offline
Зарегистрирован: 19.10.2016

На али есть BMP280 с level converter + ldo для работы с 5V МК, а есть чисто 3.3v. Вы там не втыкаете в 5V ардуину "облегченный" модуль?

kost2003
Offline
Зарегистрирован: 26.05.2017

В описании модуля в магазине написано "Поставка Напряжение: 1.8-5 В DC" 

Подключено к питанию 3,3V Но пробовал и 5V давать ничего не меняется. Только я к модулю ESP12N подключаю без ардуины но думаю это не важно суть не в этом.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, а такой вариант допустим: модуль с LDO (на что описание намекает), вы его в 3.3V суете, на датчике получаете 2.1, в лучшем случае. Любая просадка напряжения и сенсор клинит. На модуль посмотрите - есть там кроме самого сенсора трехногие и более детальки или нет.

kost2003
Offline
Зарегистрирован: 26.05.2017

Вроде есть. Если не сложно посмотрите детальку.... сылка

sadman41
Offline
Зарегистрирован: 19.10.2016

kost2003 пишет:

Вроде есть. Если не сложно посмотрите детальку.... сылка

У BME, конечно, минимальное напряжение питание 1.2V заявлено, но черт его знает, что там за LDO. Я бы такой подключил к обычной 5V ардуине (и подключал вполне успешно) и посмотрел на поведение. Если будет работать устойчиво - значит, скорее всего, какие-то провалы по питанию при работе с ESP.

kost2003
Offline
Зарегистрирован: 26.05.2017

Спасибо! Попробую так сделать.

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

Пытаюсь скомпилировать скетч - выдает море ошибок. 
Посему вопрос: какие у Вас библиотеки стоят?

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

Не компилируется скетч. Выдает кучу ошибок. Библиотеки качал с Гита. В чем может быть проблема?
 

001In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:1:0:
002 
003D:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:43:30: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
004 
005     operator const uint8_t() const       { return **this; }
006 
007                              ^
008 
009D:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:92:26: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
010 
011     operator const int() const          { return index; }
012 
013                          ^
014 
015C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino: In function 'void setup()':
016 
017C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:330:26: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
018 
019   lcd.createChar (0, Temp);
020 
021                          ^
022 
023In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:3:0:
024 
025D:\Program Files (x86)\Arduino\libraries\LiquidCrystal_PCF8574-master\src/LiquidCrystal_PCF8574.h:89:8: note: initializing argument 2 of 'void LiquidCrystal_PCF8574::createChar(uint8_t, uint8_t*)'
026 
027   void createChar(uint8_t, uint8_t[]);
028 
029        ^
030 
031C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:331:28: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
032 
033   lcd.createChar (1, HumCHR);
034 
035                            ^
036 
037In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:3:0:
038 
039D:\Program Files (x86)\Arduino\libraries\LiquidCrystal_PCF8574-master\src/LiquidCrystal_PCF8574.h:89:8: note: initializing argument 2 of 'void LiquidCrystal_PCF8574::createChar(uint8_t, uint8_t*)'
040 
041   void createChar(uint8_t, uint8_t[]);
042 
043        ^
044 
045C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:332:25: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
046 
047   lcd.createChar (2, ch1);
048 
049                         ^
050 
051In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:3:0:
052 
053D:\Program Files (x86)\Arduino\libraries\LiquidCrystal_PCF8574-master\src/LiquidCrystal_PCF8574.h:89:8: note: initializing argument 2 of 'void LiquidCrystal_PCF8574::createChar(uint8_t, uint8_t*)'
054 
055   void createChar(uint8_t, uint8_t[]);
056 
057        ^
058 
059C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:333:25: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
060 
061   lcd.createChar (3, ch3);
062 
063                         ^
064 
065In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:3:0:
066 
067D:\Program Files (x86)\Arduino\libraries\LiquidCrystal_PCF8574-master\src/LiquidCrystal_PCF8574.h:89:8: note: initializing argument 2 of 'void LiquidCrystal_PCF8574::createChar(uint8_t, uint8_t*)'
068 
069   void createChar(uint8_t, uint8_t[]);
070 
071        ^
072 
073C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:334:25: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
074 
075   lcd.createChar (4, ch4);
076 
077                         ^
078 
079In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:3:0:
080 
081D:\Program Files (x86)\Arduino\libraries\LiquidCrystal_PCF8574-master\src/LiquidCrystal_PCF8574.h:89:8: note: initializing argument 2 of 'void LiquidCrystal_PCF8574::createChar(uint8_t, uint8_t*)'
082 
083   void createChar(uint8_t, uint8_t[]);
084 
085        ^
086 
087C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:335:25: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
088 
089   lcd.createChar (5, ch6);
090 
091                         ^
092 
093In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:3:0:
094 
095D:\Program Files (x86)\Arduino\libraries\LiquidCrystal_PCF8574-master\src/LiquidCrystal_PCF8574.h:89:8: note: initializing argument 2 of 'void LiquidCrystal_PCF8574::createChar(uint8_t, uint8_t*)'
096 
097   void createChar(uint8_t, uint8_t[]);
098 
099        ^
100 
101C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:336:25: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
102 
103   lcd.createChar (6, ch7);
104 
105                         ^
106 
107In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:3:0:
108 
109D:\Program Files (x86)\Arduino\libraries\LiquidCrystal_PCF8574-master\src/LiquidCrystal_PCF8574.h:89:8: note: initializing argument 2 of 'void LiquidCrystal_PCF8574::createChar(uint8_t, uint8_t*)'
110 
111   void createChar(uint8_t, uint8_t[]);
112 
113        ^
114 
115C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:337:25: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
116 
117   lcd.createChar (7, ch8);
118 
119                         ^
120 
121In file included from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:3:0:
122 
123D:\Program Files (x86)\Arduino\libraries\LiquidCrystal_PCF8574-master\src/LiquidCrystal_PCF8574.h:89:8: note: initializing argument 2 of 'void LiquidCrystal_PCF8574::createChar(uint8_t, uint8_t*)'
124 
125   void createChar(uint8_t, uint8_t[]);
126 
127        ^
128 
129C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino: In function 'void readSensors(DateTime, boolean, boolean)':
130 
131weatherstation:994: error: no matching function for call to 'BME280I2C::read(float&, float&, float&, bool, uint8_t&)'
132 
133         bme.read(Pres, InT, hum, true, pressureUnit);
134 
135                                                    ^
136 
137C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:994:52: note: candidate is:
138 
139In file included from D:\Program Files (x86)\Arduino\libraries\BME280-master\src/BME280I2C.h:33:0,
140 
141                 from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:15:
142 
143D:\Program Files (x86)\Arduino\libraries\BME280-master\src/BME280.h:166:11: note: void BME280::read(float&, float&, float&, BME280::TempUnit, BME280::PresUnit)
144 
145    void   read(
146 
147           ^
148 
149D:\Program Files (x86)\Arduino\libraries\BME280-master\src/BME280.h:166:11: note:   no known conversion for argument 4 from 'bool' to 'BME280::TempUnit'
150 
151weatherstation:997: error: 'class BME280I2C' has no member named 'alt'
152 
153         Altitude = bme.alt(true);
154 
155                        ^
156 
157weatherstation:1037: error: no matching function for call to 'BME280I2C::read(float&, float&, float&, bool, uint8_t&)'
158 
159     bme.read(Pres, InT, hum, true, pressureUnit);
160 
161                                                ^
162 
163C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:1037:48: note: candidate is:
164 
165In file included from D:\Program Files (x86)\Arduino\libraries\BME280-master\src/BME280I2C.h:33:0,
166 
167                 from C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:15:
168 
169D:\Program Files (x86)\Arduino\libraries\BME280-master\src/BME280.h:166:11: note: void BME280::read(float&, float&, float&, BME280::TempUnit, BME280::PresUnit)
170 
171    void   read(
172 
173           ^
174 
175D:\Program Files (x86)\Arduino\libraries\BME280-master\src/BME280.h:166:11: note:   no known conversion for argument 4 from 'bool' to 'BME280::TempUnit'
176 
177weatherstation:1041: error: 'class BME280I2C' has no member named 'alt'
178 
179     Altitude = bme.alt(true);
180 
181                    ^
182 
183C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino: In function 'byte Forecast(byte)':
184 
185C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:1089:8: warning: unused variable 'a' [-Wunused-variable]
186 
187   char a;
188 
189        ^
190 
191C:\Users\Nikolay\Documents\Arduino\weatherstation\weatherstation.ino:1120:1: warning: no return statement in function returning non-void [-Wreturn-type]
192 
193 }
194 
195 ^
196 
197Несколько библиотек найдено для "OneWire.h"
198 Используется: C:\Users\Nikolay\Documents\Arduino\libraries\OneWire
199Не используется: D:\Program Files (x86)\Arduino\libraries\OneWire-master
200Не используется: D:\Program Files (x86)\Arduino\libraries\OneWire
201exit status 1
202no matching function for call to 'BME280I2C::read(float&, float&, float&, bool, uint8_t&)'

 

_zerabot_
Offline
Зарегистрирован: 26.05.2017

если речь о моем скетче то  у меня используется http://www.mathertel.de/Arduino/LiquidCrystal_PCF8574.aspx

Она отилчно ищется в подключении библиотек по фразе LiquidCrystal_PCF8574.

Обращаю внимание, что у меня экран подключен через i2c адаптер.

 

 

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

Да, именно о Вашем скетче. Он мне очень понравился, но компилятор что то не компилирует. Очень желаю вашу схему повторить. Больше, конечно, компилятор ругается на bme280i2c библиотеку. Поиски ведут в тупик.

_zerabot_
Offline
Зарегистрирован: 26.05.2017

Библиотека отсюда. https://github.com/finitespace/BME280 Инсталится ручками.

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

PS у меня версия arduino 1.8.2

 

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

_zerabot_ пишет:

Библиотека отсюда. https://github.com/finitespace/BME280 Инсталится ручками.

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

PS у меня версия arduino 1.8.2

 

А чем хуже : "cactus_io_BME280_I2C.h" ?

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

Кто может скомпилировать скетч _zerabot_ из поста #120 под nano v3 и выложит здесь?

_zerabot_
Offline
Зарегистрирован: 26.05.2017

Xer0x_king пишет:

Кто может скомпилировать скетч _zerabot_ из поста #120 под nano v3 и выложит здесь?


После работы сделаю.

Xer0x_king
Offline
Зарегистрирован: 22.06.2017
Подскажите еще по подключению периферии к ардуино:
Дисплей lcd2004 с bme280 садится на а4/а5 (sdl/sda),
dht11 садится на a9,
кнопки на d4...6,
Ds1820 садится на а8,
Куда садить фоторезистор, на какой пин?
И маааааленькая просьба, в скетче, когда будете компилировать, замените dht11 на dht22.
_zerabot_
Offline
Зарегистрирован: 26.05.2017

Xer0x_king пишет:

Подскажите еще по подключению периферии к ардуино:
Дисплей lcd2004 с bme280 садится на а4/а5 (sdl/sda),
кнопки на d4...6,
Да,
dht11 садится на d9,
Ds18d20 садится на d8,
фоторезистор на пин a1
на i2c переходнике для дисплея снимается перемычка отвечающая за подсветку и на ногу, на которой нет потенциала относительно земли цепляется вывод d3 для управления яркостью. Но честно, плавное изменение делать не захотел (памяти не хватает уже) а без нее выглядит очень убого, потому в последней версии я автояркость отключил. Да и жене ночник хороший получился. =)
 
У меня есть предложение, я как доберусь домой, настрою эти библиотеки, и выложу настроенную среду сразу.

Обращаю внимание у меня еще подключен сегментный экран на d12 и d13

0029 //LedDisplay
0030 #include "TM1637.h" // Подключаем библиотеку
0031 #define CLK 13 // К этому пину подключаем CLK
0032 #define DIO 12 // К этому пину подключаем DIO
0033 TM1637 tm1637(CLK, DIO);

 

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

Конечно, буду ждать.Премного буду благодарен.
Только пока у меня TM1637 нет. Буду покупать.

_zerabot_
Offline
Зарегистрирован: 26.05.2017

Вот ссылка на архив с библиотеками. https://cloud.mail.ru/public/L4vX/UFrvfkHat

Содержимое заархивированной папки libraries\ распаковать в папку libraries\ в среде разработки и перезапустить.

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

Проблема была в том, что я писал используя версию от февраля 2017, а со последними версиями не компилируется.

Из замеченных багов за полгода:

*В строке 459 нужно добавить еще 1 пробел, стало заметно при минусовой температуре.

*константы определяющие динамику изменения погоды в функции byte Forecast(byte Mon)

(0,2 и 0,3) однозначно нужно увеличивать минимум в 2 раза, везде где встречаются. А вообще их нужно подбирать экспереминтально для вашего региона. У нас срань, а не погода в межсезонье.

Давление в течении дня на 5-8 мм прыгает за 2-3 часа, утром солнце и +15, в обед 0 и снежная крупа и легкий ветер нежно обрывает плитку со зданий и ласково прикладывает птичек к стенам домов и вечером снова ясно и +15. А зимой 4 месяца сракопада. Ну а  летом датчик на солнце показывает до +60, а воздух прогревается до 35 и ниодного дождя за 4 месяца. Если где и приукрасил, то слегка, а кое где даже приуменьшил =)

 

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

Спасибо большое за помощь. Константы изменил, пробел добавил. На 2 компах компилировалось с ошибкой, на третьем пошло... Залил в ардуинку.Теперь проверить не могу. I2C дисплей не могу завести. Ничего не показывает.Будем тужиться завести на дисплей без I2C.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Xer0x_king пишет:

Спасибо большое за помощь. Константы изменил, пробел добавил. На 2 компах компилировалось с ошибкой, на третьем пошло... Залил в ардуинку.Теперь проверить не могу. I2C дисплей не могу завести. Ничего не показывает.Будем тужиться завести на дисплей без I2C.

а сканер I2C дисплей находит?

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

Виктор Николаевич, не пробовал.Это идея. Заливал тестовый скетч из библиотеки liquid cristal pf8574. Загружал - в мониторе порта была какая то кракозября и не более того.О том, что нету дисплея - порт не сообщал

 

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

Сканер показал 0x3f. Как всегда, или лодка дырявая или акула глухая

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Xer0x_king пишет:

Сканер показал 0x3f. Как всегда, или лодка дырявая или акула глухая

В оригинале: LiquidCrystal_PCF8574 lcd(0x27)

Придется просить компилировать с вашим 0x3f. Потому как PCF8574A не переключится на 0x3F, насколько я помню. А, судя по адресу, именно он у вас, а не обычный простой PCF8574 без индекса.

Xer0x_king
Offline
Зарегистрирован: 22.06.2017

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

 

_zerabot_
Offline
Зарегистрирован: 26.05.2017

Xer0x_king пишет:

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

Все показания с датчиков обновляются раз в минуту. Каждые 20 секунд обновляется значение 1 из датчиков. Чаще просто не вижу смысла, температура, давление и влажность крайне инертные велечины.

За установку яркости отвечает процедура

void SetBrightness(int brightness)

1136 {
1137  
1138   analogWrite(3, constrain( map(brightness / 4, 0, 255, 70, 255), 70, 255));
1139 }

Она устанавливает значение PWM от 70 до 255 на пине 3 в зависимости от напряжения на входе А1. Этот вход замеряет напряжение на делителе 10кОм+фоторезистор. Маркировка последнего неизвестна, но эксперементально он меняет сопротивление примерно от 4кОм до 12кОм.