#include <Wire.h>
#include "DHT.h"
#include <Adafruit_BMP085.h>
#include "RTClib.h"
#include "FS.h"
#include <ESP8266WiFi.h>
//+++++++++++++++++++++++++++++++++++++++++++++++++++
//переменные
#define DHTTYPE DHT22 // тип датчика - DHT22
#define DHTPIN 13 // на ногу D7 повесим датчик.
// объявим глобальные переменные влажности и температуры
float humidity_room = 0.0; // глобальная переменная влажность
float temp_room = 0.0; // глобальная переменная температура
// Инициируем датчик DHT22. С него будем снимать влажность
// и температуру
DHT dht(DHTPIN, DHTTYPE);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Теперь добавим датчик давления.
// Пин SDA подключаем к D2, пин SDL - к D1
Adafruit_BMP085 bmp;
float pressure = 0.0; // глобальная переменная давления
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Добавляем часы реального времени
// Пин SDA подключаем к D2, пин SDL - к D1
RTC_DS3231 rtc;
// Массив для вывода дня недели
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Все необходимое для WiFi
const char* ssid = "**************"; // имя WiFi сети
const char* password = "**************"; // пароль от WiFi
IPAddress ip(192, 168, 0, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
const int port = 80; // port to serve pages through
WiFiServer server(port);
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup() {
Serial.begin(9600); // Откроем сом порт
// Wire.begin();
// Запускаем датчик давления
if (!bmp.begin()) {
Serial.println("Problem with sensor bmp180!");
while (1) {}
}
// Запускаем датчик температуры
dht.begin();
// Запускаем часы
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Запускаем файловую систему
SPIFFS.begin();
// Запускаем сервер и подключаемся к беспроводной сети
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); // connect to WiFi network
WiFi.config(ip, gateway, subnet);
while (WiFi.status() != WL_CONNECTED) { // wait until connected
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
server.begin(); // Start the server
Serial.println("Server started");
Serial.println(WiFi.localIP()); // Print the servers IP address
}
while (1) {}А вот код, который должен запускать датчик давления:
if (!bmp.begin()) {
Serial.println("Problem with sensor bmp180!");
while (1) {}
}
И вот он-то и не срабатывает. Я пробовал менять очередность инициализации часов и датчика давления - без результата. Пробовал ставить другой модуль часов, на тот вариант, что глюк в самом модуле. Не могу понять, что вызывает ошибку и где ее искать.
// Wire.begin(); Почему запуск I2C за комментирован ?Не могу найти в интернете описание похожей проблемы. У людей прекрасно одновременно работают и датчик давления и часы и еще куча всего на I2C. И просто не могу даже понять, что вообще может в моем случае не работать.
boolean Adafruit_BMP085::begin(uint8_t mode) {
if (mode > BMP085_ULTRAHIGHRES)
mode = BMP085_ULTRAHIGHRES;
oversampling = mode;
Wire.begin();
if (read8(0xD0) != 0x55) return false;
/* read calibration data */
ac1 = read16(BMP085_CAL_AC1);
ac2 = read16(BMP085_CAL_AC2);
ac3 = read16(BMP085_CAL_AC3);
ac4 = read16(BMP085_CAL_AC4);
ac5 = read16(BMP085_CAL_AC5);
ac6 = read16(BMP085_CAL_AC6);
b1 = read16(BMP085_CAL_B1);
b2 = read16(BMP085_CAL_B2);
mb = read16(BMP085_CAL_MB);
mc = read16(BMP085_CAL_MC);
md = read16(BMP085_CAL_MD);
#if (BMP085_DEBUG == 1)
Serial.print("ac1 = "); Serial.println(ac1, DEC);
Serial.print("ac2 = "); Serial.println(ac2, DEC);
Serial.print("ac3 = "); Serial.println(ac3, DEC);
Serial.print("ac4 = "); Serial.println(ac4, DEC);
Serial.print("ac5 = "); Serial.println(ac5, DEC);
Serial.print("ac6 = "); Serial.println(ac6, DEC);
Serial.print("b1 = "); Serial.println(b1, DEC);
Serial.print("b2 = "); Serial.println(b2, DEC);
Serial.print("mb = "); Serial.println(mb, DEC);
Serial.print("mc = "); Serial.println(mc, DEC);
Serial.print("md = "); Serial.println(md, DEC);
#endif
return true;
}
Потому что в каждой функции bmp.begin() и rtc.begin() уже есть вызов этой функции. И я решил, что эта строка лишняя. Хотя я пробовал и с этой строкой. Результат один и тот же.// Wire.begin(); Почему запуск I2C за комментирован ?
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
while (! rtc.begin()) {
Serial.println("Couldn't find RTC");
delay (500);
}
просто тестером (лучше осцилографом) - низкий уровень == шина занята. Попробуйте замерить до и после инициализации модуля. Всё кроме RTC выкиньте, оставьте скетч с часами только. Если до обращений низкий, после высокий - то нужно инициализировать первым. Если всегда низкий - брак. Если всегда высокий и низкий тоько во время обмена данными - застрелиться. Шутка.что пин sda с модуля часов постоянно что-то выдает? Можно это как-то проверить? Скетчем или просто тестером?
Посмотрел библиотеку часов. Она базируется на I2C библтотеке Wire, которая работает на выделенных I2C пинах.Если бы кто-то согласился посмотреть код, было бы замечательно.
Код://+++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Теперь добавим датчик давления. // Пин SDA подключаем к D2, пин SDL - к D1 Adafruit_BMP085 bmp; float pressure = 0.0; // глобальная переменная давления //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Добавляем часы реального времени // Пин SDA подключаем к D2, пин SDL - к D1 RTC_DS3231 rtc; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void setup() { Serial.begin(9600); // Откроем сом порт // Wire.begin(); // Запускаем датчик давления if (!bmp.begin()) { Serial.println("Problem with sensor bmp180!"); while (1) {} } // Запускаем часы if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); }
boolean RTC_DS3231::begin(void) {
Wire.begin();
return true;
}
В таком случае, вызов rtc.begin() просто не нужен, если перед этим была инициализация bmp.begin().В самой функции только вызывается Wire.begin(), больше ничего не делается.
Как я понял из регистра d0 считывается значение, и если оно равно 0х55 то считается, что датчик работает. Что это за регистр, надо курить даташит. Но мне кажется, что дело не в нем, а в модуле rtc, который шину блокирует.if (read8(0xD0) != 0x55) return false;
Совершенно верно. И я тоже склоняюсь все больше к тому, что глюк в железе. Писал уже выше, что пробовал менять модули RTC. Я их в свое время заказывал пять штук, так вот вчера попробовал прогнать все пять штук. Результат одинаковый. Менял провода, ЕСП, макетную плату. Результат одинаковый.@=AK= если я правильно понял, датчик не работает и в том случае, если библиотеки rtc нет вообще. Просто параллельно подключен модуль rtc и работа сбивается.
Часы подключаются по протоколу I2C всего двумя проводами. Необходимо дополнительно подтянуть выводы, к которым подключаются часы к рельсе питания с помощью резисторов 2 КОм.