• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Arduino IDE esp8266+dht22+bmp085

kkozyrev

New member
Vitaly, спасибо. Смогу протестировать только в понедельник.:(
Отпишусь потом по итогам.
Хотя может кто и раньше сделает ;)
 

kkozyrev

New member
странно. компилятор ругается на Wire.pins(0,2)
пишет: "'Wire' does not name a type"
 

Vitaly

Member
как я писал ранее .pins устаревшая функция и надо использовать Wire.begin(sda,scl);
не помню только где я это прочитал)
 

kkozyrev

New member
упс... точно.
Wire.begin(0,2); скомпилировалось... спасибо.
другая проблемка... не могу найти скетч ардуиновский для bmp085, чтобы под esp плату компилировался...
(вышеприведенный BigAlex пример не желает собираться :()
 
Последнее редактирование:

Vitaly

Member
с какими ошибками?

последней ли сборки библиотеки есп под ардуину? если старые надо сменить ссылку на staging, стереть скачанное и переставить через boardmanager

мной выложенный в начале скетч начал собираться после какого-то обновления esp либ, но за неимением свободной bmp проверить я его не могу
поэтому там только инициализация прописана
 

big_alex

New member
@kkozyrev, странно у меня компилится и работает с этими библиотеками BMP085 и DHT
причем именно с Wire.pins, правда выдает предупреждение, но на работу не влияет
 

Вложения

  • 11.6 KB Просмотры: 57
Последнее редактирование:

kkozyrev

New member
Vitaly, лезет такая ошибка
warning: [HASHTAG]#warning[/HASHTAG] "OneWire. Fallback mode. Using API calls for pinMode,digitalRead and digitalWrite. Operation of this library is not guaranteed on this architecture." [-Wcpp]
 

kkozyrev

New member
big_alex, у меня вылезает эта ошибка, но потом компилируется.
А сама программа тоже потом на ESP-шке работает?
 

big_alex

New member
@kkozyrev, программа работает как часы, но предупреждение у меня другое

ESP8266_meteo.ino: In function 'void setup()':
ESP8266_meteo.ino:41:19: warning: 'void TwoWire::pins(int, int)' is deprecated (declared at C:\Users\Aleksandr\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-1044-g170995a\libraries\Wire/Wire.h:54) [-Wdeprecated-declarations]

UPD еще я выкинул строки про OneWire и добавил счет по прерываниям (хочу счетчик Гейгера подключить), отмечу что с ардуино я столкнулся впервые и вообще не программист, поэтому код такой какой есть ))) благодаря форумам.

Код:
//Мини метеостанция с веб сервером
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "DHT.h"
#include <EEPROM.h>
#define DHTPIN 5 //GPIO5
#define DHTTYPE DHT21   // DHT21(AM2301)

int imp_sum = 0; // Сумма накопленых импульсов
unsigned long currentTime=0;
unsigned long startTime=millis();
int imp_val = 0; // Счетчик импульсов
unsigned long timer = 0;
unsigned long timer1=millis();
DHT dht(DHTPIN, DHTTYPE, 15);
const char* ssid = "my_ssid"; // Имя сети для подключения в режиме клиента
const char* ssid2 = "Wi-Fi-METEOSTATION(12121212)"; // Имя сети в режиме точки доступа
const char* password = "my_password"; // Пароль сети в режиме клиента
const char* password2 = "12121212"; // Пароль сети в режиме точки доступа
const char* host = "narodmon.ru"; //Адрес сервера, куда передаются данные
const char* key   = "yourkey"; //Ключ доступа к серверу

extern "C" {
#include "user_interface.h"
uint16 readvdd33(void);
}

ESP8266WebServer server(80);
//#define REPORT_INTERVAL 60
const int led = 13;
Adafruit_BMP085 bmp;


void setup(void)
{
  attachInterrupt(4, IMP_IN, FALLING); // Активируем внешнее прерывание
  Serial.begin(115200);
  Wire.pins(14, 12);// устанавливаем пины SDA,SCL для i2c
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1) {}
  }

  //Serial.begin(115200);
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);

  // Connect to WiFi network
  // Выбираем режим Wi-Fi
  // Выбор режимов выполняется изменением состояния 13 пина.
  // если 1, то точка доступа
  // если 0, то режим клиента
  if (digitalRead(13)==1)
  {
  WiFi.mode(WIFI_AP); //Режим Wi-Fi Точка доступа
  WiFi.softAP(ssid2, password2);//Поднятие точки доступа
  Serial.println("");
  Serial.println("AP mode"); //Говорим что мы в режиме точки доступа
  }
  else
  {
   Serial.print("Wait for connection\n\r");
   WiFi.mode(WIFI_STA); //Режим Wi-Fi клиент
   WiFi.begin(ssid, password); //Подключение в режиме клиента

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Client mode");// Говорим что мы в режиме клиент
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  }
    server.on("/", handle_root);
    server.on("/inline", [](){
    server.send(200, "text/plain", "this works as well");
    delay(100);
  });
  server.begin();
  Serial.println("HTTP server started");
  delay(100);

  //dht21 sensor
  Serial.println("DHTxx test!");
  dht.begin();
  delay(100);
  }

//-------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------

void data() {
   //dht21

  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  //float hi = dht.computeHeatIndex(f, h, true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.println();
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
       
//bmp180
  Serial.print("Temperature = ");
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
   
  Serial.print("Pressure = ");
  Serial.print(bmp.readPressure()/133.322);
  Serial.println(" mm");

  float pressure = (bmp.readPressure()/133.322);
  float temp180 = (bmp.readTemperature());

//----------------------------------------------------------------------------------------
//Формируем GET запрос к серверу
  Serial.print("connecting to ");
  Serial.println(host);
  // Используем WiFiClient класс для выполнения TCP подключения
  WiFiClient client;
  const int httpPort = 8283;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
    Serial.println("connect - OK ");
  }
   
  digitalWrite(led, 1);
  // Здесь мы отправляем запрос к удаленному серверу
  client.print(String ("#18-FE-34-A3-92-95\n") + "#T1#" + t + "\n" +
               "#H1#" + h + "\n" +
               "#T2#" + temp180 + "\n" +
               "#P1#" + pressure + "\n"
               "##");
  delay(200);
// Выводим то, что отправили к серверу
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");
  digitalWrite(led, 0);
  }
//----------------------------------------------------------------------
void handle_root() { 
  digitalWrite(led, 1);
  //Веб сервер
    server.send(200, "text/html", "<!DOCTYPE html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><meta name=\"viewport\" content=\"width=400px\"><title>Wi-Fi ESP8266 Метеостанция</title>"
  "<style type=\"text/css\">body\{background-color: #7D8EE2;color:#FFF;}"
"a {color:#73B9FF;}"
".blockk {border:solid 1px #2d2d2d;text-align:center;background:#0059B3;padding:10px 10px 10px 10px;-moz-border-radius: 5px;-webkit-border-radius: 5px;border-radius: 5px;}"
".blockk {border:double 2px #000000;-moz-border-radius: 5px;-webkit-border-radius: 5px;border-radius: 5px;}"
"</style><style type=\"text/css\" media=\'(min-width: 810px)\'>body\{font-size:18px;}.blockk \{width: 400px;}</style>"
"<style type=\"text/css\" media=\'(max-width: 800px) and (orientation:landscape)\'>body\{font-size:8px;}</style><meta http-equiv=\"REFRESH\" content=\"300\"></head><body><center><div class=\"blockk\">Мини Метеостанция на ESP8266<br><hr><b>AM2301:</b><br>Температура: "+String(dht.readTemperature())+" &deg;C.<br> Влажность (отн.): "+String(dht.readHumidity())+" %.<br>Ощущаемая температура: "+String((5*(dht.computeHeatIndex(dht.readTemperature(true), dht.readHumidity(), true)-32))/9)+" &deg;C.<br><hr><b>BMP180:</b><br>Температура: "+String(bmp.readTemperature())+" &deg;C.<br> Давление(атм.): "+String(bmp.readPressure()/133.322)+" мм.рт.ст.<br><hr><b>СБМ-19:</b><br>Радиация: " +String((imp_sum/5)*0.21)+ " мкР/ч <br><hr><b>Питание:</b><br>Напряжение: " +String(readvdd33())+ " мВ <br><hr><b>Память:</b><br>Свободно: " +String(ESP.getFreeHeap())+ " байт <hr></div></center></body></html>");
  digitalWrite(led, 0);
  }


// Функция обработки сигнала со счетчика Гейгера
void IMP_IN() {
  if (currentTime<=300000){    // Время измерения 5 минут (300000)
  imp_val++;
  currentTime=millis()-startTime;
  Serial.println(currentTime);
  delay (10);
  }
else{
  Serial.println("end 5 min");
  imp_sum=imp_val;
  currentTime=0;
  startTime=millis();
  imp_val=0;
  Serial.println(currentTime);
  Serial.println(imp_sum);
  }
}
void loop(void){
  if (timer<=600000){
  timer=millis()-timer1;
  delay (50);
  server.handleClient();
  delay (50);
  }
else{
  timer=0;
  timer1=millis();
  data();
  }
}
 
Последнее редактирование:

Vitaly

Member
Кстати вот тут в ошибке и видно сообщение что wire.pins deprecated и что собираем с либами версии 1.6.5-1044-g170995a у меня такие же
big_alex, а если заменить Wire.pins(14, 12); на Wire.begin(14,12); варнинг должен уйти

kkozyrev, какая версия библиотек используется при компиляции? посмотреть можно в папке c:\Users\user\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\
 

big_alex

New member
@Vitaly, спасибо, действительно предупреждений нет. Осталось с readvdd33 разобраться, а то раз 36, а раз 3370 показывает.
 

kkozyrev

New member
Vitaly, вот с такой версией 1.6.5-947-g39819f0 вообще не собирается у меня
c:/users/љ®бвп/appdata/roaming/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/lib\libm.a(lib_a-e_pow.o): In function `__ieee754_pow':
Ошибка компиляции.
 

Vitaly

Member
во первых убедится что в "Arduino IDE, далее Файл – Настройки – в поле Additional Boards Manager URLs"
ссылка не на стабильную версию http://arduino.esp8266.com/package_esp8266com_index.json
а на "ночную сборку" - http://arduino.esp8266.com/staging/package_esp8266com_index.json

потом в профиле пользователя c:\Users\username\AppData\Roaming\Arduino15\packages\ удалить каталог esp8266
и в c:\Users\username\AppData\Roaming\Arduino15\ файлы package_esp8266com_index.json и package_esp8266com_index.json.sig.tmp

после чего можно повторно установить библиотеки через tools-> board -> boards manager
 

big_alex

New member
@kkozyrev, ну так выше есть мой код и если заменить Wire.pins(14, 12); на Wire.begin(14,12) компилится без проблем, кстати я сначала ставил стабильную, а потом ночную сборку IDE
 
Последнее редактирование:

kkozyrev

New member
господа, скетч наконец-то начал компилироваться. Ура!!!
Но в ком порт валиться вот это:

ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 1264, room 16
tail 0
chksum 0x42
csum 0x42
~ld

Что за бред?
 
Сверху Снизу