• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь NodeMCU (с чипом CH340G) + GY-BMP/E280 + DS3231 + Mh-z19 + tft 2.8 дисплей

Иван 32

New member
Всем привет!

Собственно проблема:
имеется на руках

Подключение:
mh-z19(датчик - nodemcu)
rx - d6
tx - d4
vin - vusb
gnd - gnd

bme-280(датчик - nodemcu)
vcc - 3.3v
gnd - gnd
scl - d1
sda - d2
csb - d3
sdo - d5

ili9341(экран- nodemcu)
vcc, led, reset - 3.3v
gnd - gnd
cs - d8
d/c - d7
sdi(mosi) -d2
sck - d1

DS3231(датчик - nodemcu)
vcc - 3.3v
gnd - gnd
sda - d2
scl - d1

Скетч рабочий(на экране появляются показания и даже правдивые):
Код:
#include <UTFT.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <SoftwareSerial.h>

// assign the ESP8266 pins to arduino pins
#define D1 5
#define D2 4
#define D3 0
#define D5 14

// assign the SPI bus to pins
#define BME_SCK D1
#define BME_MISO D5
#define BME_MOSI D2
#define BME1_CS D3

#define SEALEVELPRESSURE_HPA (1013.25)

extern uint8_t SmallFont[];
UTFT myGLCD ( ILI9341_S5P, 4,5,15,1,13 );

//Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
Adafruit_BME280 bme(BME1_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
SoftwareSerial mySerial(2, 12); // RX, TX

byte request[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char response[9];


float getCO2(){
  mySerial.write(request, 9);
  memset(response, 0, 9);
  mySerial.readBytes(response, 9);
  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response[i];
  crc = 255 - crc;
  crc++;
  if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
    Serial.println("CRC error");
  } else {
    unsigned int HLconcentration = (unsigned int) response[2];
    unsigned int LLconcentration = (unsigned int) response[3];
    unsigned int co2 = (256*HLconcentration) + LLconcentration;

    Serial.print("PPM = ");
    Serial.println(co2);
    return co2;
    //Serial.println();
  }
}

void setup() {
  Serial.begin(9600);
   //Wire.begin(5/*D1*/, 4/*D3*/); delay(10);
  Serial.println(F("BME280 test"));

  if (!bme.begin()) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }

  myGLCD.InitLCD (  );
  myGLCD.setFont ( SmallFont );
}

void loop() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");

    Serial.print( bme.readPressure() / 133.32239F);
    Serial.println(" mmHg");

    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");

    Serial.println();

   float coo = getCO2();

    myGLCD.clrScr (  );

    myGLCD.setColor ( 255, 255, 255 );
    myGLCD.setBackColor ( 255, 0, 0 );
    myGLCD.print ( String("Temp: ")+bme.readTemperature()+" *C", CENTER, 93 );
    myGLCD.print ( String("Pressure: ")+(bme.readPressure()/133.32239F)+" mmHg", CENTER, 106 );
    myGLCD.print ( String("Humidity: ")+bme.readHumidity()+" %", CENTER, 119 );
    myGLCD.print ( String("Co2: ")+coo+" ppm", CENTER, 132 );

    myGLCD.setColor ( 0, 255, 0 );
    myGLCD.setBackColor ( 0, 0, 255 );
    myGLCD.print ( String("Runtime: (msecs)"), CENTER, 210 );
    myGLCD.printNumI ( millis (  ), CENTER, 225 );
  
    delay(2000);
}
Скетч с добавлением кода для часов(не работает):
Код:
#include <DS3231.h>
#include <UTFT.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <SoftwareSerial.h>


DS3231 clock;
RTCDateTime dt;



// assign the ESP8266 pins to arduino pins
#define D1 5
#define D2 4
#define D3 0
#define D5 14

// assign the SPI bus to pins
#define BME_SCK D1
#define BME_MISO D5
#define BME_MOSI D2
#define BME1_CS D3

#define SEALEVELPRESSURE_HPA (1013.25)

extern uint8_t SmallFont[];
UTFT myGLCD ( ILI9341_S5P, 4,5,15,1,13 );

//Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME1_CS); // hardware SPI
Adafruit_BME280 bme(BME1_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
SoftwareSerial mySerial(2, 12); // RX, TX

byte request[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char response[9];


float getCO2(){
  mySerial.write(request, 9);
  memset(response, 0, 9);
  mySerial.readBytes(response, 9);
  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response[i];
  crc = 255 - crc;
  crc++;
  if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
    Serial.println("CRC error");
  } else {
    unsigned int HLconcentration = (unsigned int) response[2];
    unsigned int LLconcentration = (unsigned int) response[3];
    unsigned int co2 = (256*HLconcentration) + LLconcentration;

    Serial.print("PPM = ");
    Serial.println(co2);
    return co2;
    //Serial.println();
  }
}


void setup() {

  Serial.begin(9600);
  Serial.println(F("BME280 test"));

  if (!bme.begin()) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
clock.begin();

  // Set sketch compiling time
  clock.setDateTime(__DATE__, __TIME__);

 
  myGLCD.InitLCD (  );
  myGLCD.setFont ( SmallFont );
}


void loop() {


    dt = clock.getDateTime();
    Serial.print("Long format with month name: ");
    Serial.println(clock.dateFormat("d F Y H:i:s",  dt));
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");

    Serial.print( bme.readPressure() / 133.32239F);
    Serial.println(" mmHg");

    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");

    Serial.println();

   float coo = getCO2();
  
    myGLCD.clrScr (  );

    myGLCD.setColor ( 255, 255, 255 );
    myGLCD.setBackColor ( 255, 0, 0 );
    myGLCD.print ( String("Time: ")+clock.dateFormat("d F Y H:i:s",  dt), CENTER, 73 );
    myGLCD.print ( String("Temp: ")+bme.readTemperature()+" *C", CENTER, 93 );
    myGLCD.print ( String("Pressure: ")+(bme.readPressure()/133.32239F)+" mmHg", CENTER, 106 );
    myGLCD.print ( String("Humidity: ")+bme.readHumidity()+" %", CENTER, 119 );
    myGLCD.print ( String("Co2: ")+coo+" ppm", CENTER, 132 );

    myGLCD.setColor ( 0, 255, 0 );
    myGLCD.setBackColor ( 0, 0, 255 );
    myGLCD.print ( String("Runtime: (msecs)"), CENTER, 210 );
    myGLCD.printNumI ( millis (  ), CENTER, 225 );
  
    delay(2000);
}
Дополнение:
Отдельно работают все датчики и nodemcu(по 3 штуки каждого имеется в запасах, кроме датчика СО2)
Сканером прозваниваются и видятся - и часы, и bme280, когда подключены вместе .
Стоит в любую комбинацию добавить часы - любой код перестает работать. Часы отдельно от всего - работают(есть 3 платы часов, проверил каждую).


Нужна ваша помощь. Подскажите, где я ошибаюсь и как это можно исправить?
 

nikolz

Well-known member
Всем привет!



bme-280(датчик - nodemcu)
vcc - 3.3v
gnd - gnd
scl - d1
sda - d2
csb - d3
sdo - d5

ili9341(экран- nodemcu)
vcc, led, reset - 3.3v
gnd - gnd
cs - d8
d/c - d7
sdi(mosi) -d2
sck - d1

DS3231(датчик - nodemcu)
vcc - 3.3v
gnd - gnd
sda - d2
scl - d1
Нужна ваша помощь. Подскажите, где я ошибаюсь и как это можно исправить?
Каким образом Вы управляете часами когда обращаетесь к bme и ili?
 

Иван 32

New member
Есть альтернативная библиотека I2C.
что вы имеете в виду?

Каким образом Вы управляете часами когда обращаетесь к bme и ili?
Пока что, до подобного не дошел. Пытался вывести значение времени в serial - но и это не увенчалось успехом. А часами надо как то по особенному управлять?
 

nikolz

Well-known member
что вы имеете в виду?
Пока что, до подобного не дошел. Пытался вывести значение времени в serial - но и это не увенчалось успехом. А часами надо как то по особенному управлять?
тогда почему считаете, что все вместе должно работать, если у них общие d1 и d2 , но часы внешне не отключаются и программно тоже.
 

Иван 32

New member
тогда почему считаете, что все вместе должно работать, если у них общие d1 и d2 , но часы внешне не отключаются и программно тоже.
А можно какой-нибудь пример кода привести? Я не очень понимаю концепцию. Сейчас у меня пины d1 d2 используются у трех элементов, это часы, экран и датчик bme280. Но, тк контакты на плате расширении соединены , то esp их не видит как один элемент? Чтобы все работало, нужно как то их отключать? Что-то вроде, поработал датчик, сохранили в переменную показания, отключили, поработали часы, сохранили время в переменную, отключили, заработал дисплей - вывели все переменные на дисплей и повторили процедуру с датчиками?
 

nikolz

Well-known member
А можно какой-нибудь пример кода привести? Я не очень понимаю концепцию. Сейчас у меня пины d1 d2 используются у трех элементов, это часы, экран и датчик bme280. Но, тк контакты на плате расширении соединены , то esp их не видит как один элемент? Чтобы все работало, нужно как то их отключать? Что-то вроде, поработал датчик, сохранили в переменную показания, отключили, поработали часы, сохранили время в переменную, отключили, заработал дисплей - вывели все переменные на дисплей и повторили процедуру с датчиками?
В этих датчиках реализован интерфейс I2C.
Посмотрите описание интерфейса и датasheet датчиков и решите как их включать на общую шину чтобы они друг другу не мешали.
 

CodeNameHawk

Moderator
Команда форума
что вы имеете в виду?
На форуме писали, что со стандартной i2c библиотекой, два устройства не хотят работать вместе и предлагали
если не поможет попробуйте исправленный драйвер для i2c - enjoyneering/ESP8266-I2C-Driver
Для проверки оставьте только часы и барометр, из программы выкиньте все остальное и проверьте работают ли они вместе.
Покажите схему подключения всех компонентов, а не ее описание.
ili работает через mosi miso, почему его туда не подключили?
esp12.png
 
Последнее редактирование:

Иван 32

New member
Покажите схему подключения всех компонентов, а не ее описание.
Попытался сделать схему, надеюсь она понятна. Ну вот никак у меня с рисованием - ну вообще никак)

ili работает через mosi miso, почему его туда не подключили?
Первый вариант , который нашел и который заработал - оставил.

Для проверки оставьте только часы и барометр, из программы выкиньте все остальное и проверьте работают ли они вместе.
Пробовал, инициализацию (bme.begin и rtc.begin) проходят успешно. Когда доходит время до loop - дата получается из какого-то набора цифр, а bme отображает свои максимальные отрицательные значения(-1400 метров над уровнем моря, -200(не помню точную цифру) градусов, 0% влажности и тд)


Библиотеку попробую, но уже завтра, сегодня до устройств не доберусь.
 

Вложения

Сверху Снизу