• Система автоматизации с открытым исходным кодом на базе 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% влажности и тд)


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

Вложения

Сверху Снизу