SOFT WDT Reset (Wemos D1 mini Pro 16M)

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Приветствую Ардуинщиков и профессионалов своего дела.

Требуется небольшая помощь, возник вопрос, создал погодную станцию на собственной плате. И вот всё вроде бы ничего, написал скетч, вроде бы всё работает, но при запуске выдает вот такое в монитор порта:

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffda0 end: 3fffffc0 offset: 01b0
3fffff50:  53444653 fe000f00 003d0900 feef0001  
3fffff60:  feefeffe feefeffe feefeffe feefeffe  
3fffff70:  feefeffe feefeffe feefeffe feefeffe  
3fffff80:  feefeffe feefeffe feefeffe feefeffe  
3fffff90:  feefeffe feefeffe feefeffe 3ffeedf4  
3fffffa0:  3fffdad0 00000000 3ffeedb4 4020cb68  
3fffffb0:  feefeffe feefeffe 3ffe857c 40100e95  
<<<stack<<<

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
vffffffff
~ld
⸮bl`r⸮nlph
Initializing SD card...initialization failed!
Manufacturer ID=0xFFFF
Device ID=0xFFFF
Could not find a valid BMP280 sensor, check wiring!

Ниже привожу полный скетч:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <RtcDS1307.h>
#include <SPI.h>
#include <SD.h>
#include <Ticker.h>
#include "ClosedCube_HDC1080.h"
#include "Adafruit_MCP23X17.h"
#include <Adafruit_ADS1015.h>
#include <Adafruit_BMP280.h>
#include <BH1750FVI.h>


Adafruit_ADS1015 ads;     /* Use thi for the 12-bit version */
Adafruit_MCP23X17 mcp;
Adafruit_BMP280 bmp; // I2C
BH1750FVI myBH1750(BH1750_DEFAULT_I2CADDR, BH1750_ONE_TIME_HIGH_RES_MODE_2, 1.085, BH1750_ACCURACY_DEFAULT);

File myFile;
RtcDS1307<TwoWire> Rtc(Wire);

ClosedCube_HDC1080 hdc1080;

Ticker ClockTimer;

#define countof(a) (sizeof(a) / sizeof(a[0]))
#define CDSS 15

#define mcpPinLed 11
#define mcpPinPON 9
#define mcpPin_OnOff_Button 10


//#define OnOff_Button 0
byte buttoncount = 0;
//#define LedPin 2
//#define Power_On 16

const char *LogFileName = "log.csv";

const char *ssid = "switch01";      // Имя вайфай точки доступа
const char *pass = "f89mn2xK";     // Пароль от точки доступа

const char *mqtt_server  =  "192.168.10.xxx";   // Имя сервера MQTT
const int  mqtt_port     =  18xx;                 // Порт для подключения к серверу MQTT
const char *mqtt_user    =  "antxxxo";       // Логин от сервер
const char *mqtt_pass    =  "Al1EaNt2xx4";        // Пароль от сервера

const char * months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"} ;

byte ss = 0;    // секунды 
byte mm = 0;    // минуты
byte hh = 0;    // часы
byte da = 0;    // день
byte mo = 0;    // месяц
int yea = 0;    // год

byte DataTimer = 0;
#define MaxDataTimer 30

byte Prev_min = 0;    // минуты
byte DataUpdate = 1;

byte SDpresed = 0;

char Buffer[] = "Hello String";

float BattVoltage = 0.0;
float PanelVoltage = 0.0;
float ChargingCurrent = 0.0;
float DisChargCurrent = 0.0;
float ChargingCurrentCount = 0.0;
float DisChargCurrentCount = 0.0;
byte Count = 0;

float Temperature = 0.0;
float Humidity = 0.0;
float PressurePA = 0.0;
float PressureMM = 0.0;
float Lightlevel = 0.0;

void timerIsr()
{
    DataUpdate = 1;
}

void callback(const MQTT::Publish& pub)     // Функция получения данных от сервера
{
    Serial.print(pub.topic());                // выводим в сериал порт название топика
    Serial.print(F(" => "));
    Serial.println(pub.payload_string());     // выводим в сериал порт значение полученных данных
    
    String payload = pub.payload_string();
      
    if(String(pub.topic()) == "WStation/DateTimeSet")    //  проверяем из нужного ли нам топика пришли данные 
    {
        String DateSet = payload.substring(0, 12);          // устанавливаем дату и время
        String TimeSet = payload.substring(12);
        char userDate[12];
        char userTime[9];
        DateSet.toCharArray(userDate, 12);
        TimeSet.toCharArray(userTime, 9);
        RtcDateTime manual = RtcDateTime(userDate, userTime);
        Rtc.SetDateTime(manual);
        Serial.print(userDate);
        Serial.print(F(" "));
        Serial.println(userTime);
    }
    
    if(String(pub.topic()) == "WStation/TimeCorrect")   // проверяем из нужного ли нам топика пришли данные 
    {
        int timeCorrect = payload.toInt();            //  преобразуем полученные данные в тип integer
        mm = mm + timeCorrect;
        if (mm > 59){
            mm = 0;
            hh++;
        }
        /* Sample:
          RtcDateTime manual = RtcDateTime("Jan 25 2017", "16:30:00")); // минуты и секунды двузначные!
          Rtc.SetDateTime(manual);
        */
        char userDate[11];                              // формирование строки даты в формате МММ ДД ГГГГ
        sprintf(userDate,"%s %d %d", months[mo-1], da, yea);
        char userTime[8];                               // формирование строки времени в формате ЧЧ:ММ:СС
        sprintf(userTime,"%02d:%02d:%02d", hh, mm, ss);
        RtcDateTime manual = RtcDateTime(userDate, userTime);
        Rtc.SetDateTime(manual);
        Serial.print(userDate);
        Serial.print(F(" "));
        Serial.println(userTime);
    }
    
}

WiFiClient wclient;      
PubSubClient client(wclient, mqtt_server, mqtt_port);

void setup () 
{
    // The ADC input range (or gain) can be changed via the following
    // functions, but be careful never to exceed VDD +0.3V max, or to
    // exceed the upper and lower limits if you adjust the input range!
    // Setting these values incorrectly may destroy your ADC!
    //                                                                ADS1015  ADS1115
    //                                                                -------  -------
    //ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
    // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
    // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
    ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
    // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
    // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
    ads.begin();
  
    mcp.begin_I2C();      // use default address 0
    mcp.pinMode(mcpPinLed, OUTPUT);
    mcp.digitalWrite(mcpPinLed, LOW);

    mcp.pinMode(mcpPinPON, OUTPUT);
    //mcp.digitalWrite(mcpPinPON, LOW);

    mcp.pinMode(mcpPin_OnOff_Button, INPUT);
    
    //pinMode(Power_On, OUTPUT);
    //pinMode(OnOff_Button, INPUT);
    //pinMode(OnOff_Button, INPUT_PULLUP);
    //pinMode(LedPin, OUTPUT);
    //digitalWrite(LedPin, HIGH);
    //digitalWrite(Power_On, LOW);
    delay(500);
    //digitalWrite(Power_On, HIGH);
    mcp.digitalWrite(mcpPinLed, HIGH);
    //digitalWrite(LedPin, LOW);
    mcp.digitalWrite(mcpPinPON, HIGH);
    
    Serial.begin(115200);
    
    Serial.println(F(""));
    Serial.print(F("Initializing SD card..."));
    if (!SD.begin(CDSS)) {
        Serial.println(F("initialization failed!"));
        SDpresed = 0;
    }else{
        Serial.println(F("initialization done."));
        SDpresed = 1;
        if (!SD.exists(LogFileName)) {
            myFile = SD.open(LogFileName, FILE_WRITE);
            if (myFile) {
                Serial.print(F("Writing to "));
                Serial.print(LogFileName);
                Serial.print(F("..."));
                
                myFile.print("Date:");
                myFile.print(",");
                myFile.print("Time:");
                myFile.print(",");
                myFile.print("V Batt.");
                myFile.print(",");
                myFile.print("V SolarPanel.");
                myFile.print(",");
                myFile.print("mA Charging");
                myFile.print(",");
                myFile.print("mA Discharg.");
                myFile.print(",");
                myFile.print("Temperature:");
                myFile.print(",");
                myFile.print("Humidity:");
                myFile.print(",");
                myFile.print("Pressure Pa.:");
                myFile.print(",");
                myFile.print("Pressure mm.Rt.st:");
                myFile.print(",");
                myFile.println("Light level:");
                
                Serial.println(F("done."));
                Serial.println(F(""));
            } else {
                Serial.print(F("error opening"));
                Serial.println(LogFileName);
            }
            myFile.close();
        }
    }

    hdc1080.begin(0x40);
    Serial.print(F("Manufacturer ID=0x"));
    Serial.println(hdc1080.readManufacturerId(), HEX); // 0x5449 ID of Texas Instruments
    Serial.print(F("Device ID=0x"));
    Serial.println(hdc1080.readDeviceId(), HEX); // 0x1050 ID of the device

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

    if (!myBH1750.begin())
    {
        Serial.println(F("ROHM BH1750FVI is not present")); //(F()) saves string to flash & keeps dynamic memory free
    }
    
    Rtc.Begin();
    Serial.println();
    if (!Rtc.GetIsRunning())
    {
        Serial.println(F("RTC was not actively running, starting now"));
        Rtc.SetIsRunning(true);
    }
    RtcDateTime now = Rtc.GetDateTime();
    Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low); 
    
    ClockTimer.attach(1, timerIsr);
}

void loop () 
{
    if (WiFi.status() != WL_CONNECTED) {
        Serial.print(F("Connecting to "));
        Serial.print(ssid);
        Serial.println(F("..."));
        WiFi.begin(ssid, pass);
        
        if (WiFi.waitForConnectResult() != WL_CONNECTED)
            return;
        Serial.println(F("WiFi connected"));
    }
    
    // подключаемся к MQTT серверу
    if (WiFi.status() == WL_CONNECTED) {
        if (!client.connected()) {
            Serial.println(F("Connecting to MQTT server"));
            if (client.connect(MQTT::Connect("arduinoClient2")
                                 .set_auth(mqtt_user, mqtt_pass))) {
                Serial.println(F("Connected to MQTT server"));
                client.set_callback(callback);
                client.subscribe("WStation/DateTimeSet");                 // подписывааемся по топик с данными для установки даты / времени
                client.subscribe("WStation/TimeCorrect");                 // подписывааемся по топик с данными для корректировки времени
            } else {
                Serial.println(F("Could not connect to MQTT server"));   
            }
        }
        if (client.connected()){
            client.loop();
            
        }
    }

    if (DataUpdate){
        Serial.println(F(" => "));
        DataUpdate = 0;
        GetData();
        if (Prev_min != mm){
            Serial.println(F(" => 2"));
            Prev_min = mm;
            if (SDpresed){
                DataLog();
            }
        }
        DataTimer++;
        if (DataTimer > MaxDataTimer){
            Serial.println(F(" => 3"));
            DataTimer = 0;
            SendData();
        }
        if (mcp.digitalRead(mcpPin_OnOff_Button) == HIGH) {
            Serial.println(F(" => 4"));
            buttoncount++;
            if (buttoncount > 1){
                Serial.println(F(" => 5"));
                buttoncount = 0;
                Power_OFF();
            }
        } else{
            buttoncount = 0;
        }
    }
}

void Power_OFF(){
    //digitalWrite(LedPin, HIGH);
    mcp.digitalWrite(mcpPinLed, LOW);
    delay(2500);
    Serial.println(F(" => 6"));
    //digitalWrite(Power_On, LOW);
    mcp.digitalWrite(mcpPinPON, LOW);
    Serial.println(F(" => 7"));
}

void GetData(){
    // ------ Date & Time ----------------------------------------------------------------------------------------
    if (!Rtc.IsDateTimeValid()) 
    {
        if (Rtc.LastError() != 0)
        {
            Serial.print(F("RTC communications error = "));
            Serial.println(Rtc.LastError());
        }
        else
        {
            Serial.println(F("RTC lost confidence in the DateTime!"));
        }
    }
    RtcDateTime now = Rtc.GetDateTime();
    ss = now.Second(); 
    mm = now.Minute();
    hh = now.Hour();
    da = now.Day();
    mo = now.Month();
    yea = now.Year();
    
    
    // ----- Battery ----------------------------------------------------------------------------------------------
    int16_t results;
    int16_t adc0;
    int sample1 = 0;
    int sample2 = 0;
    for(int i=0;i< 80;i++)
    {
        sample1 = sample1 + ads.readADC_Differential_0_3(); 
        sample2 = sample2 + ads.readADC_Differential_1_3(); 
        delay(2);
    }
    results = sample1 / 80; 
    //results = ads.readADC_Differential_0_3();  
    Serial.print(F("Charging 0-3: ")); Serial.print(results); Serial.print(F("(")); Serial.print(results * 0.5); Serial.println(F("mV)"));
    ChargingCurrentCount = ChargingCurrentCount + float(results * 0.5) / 0.26666;

    results = sample2 / 80; 
    //results = ads.readADC_Differential_1_3();    
    Serial.print(F("DisCharging 1-3: ")); Serial.print(results); Serial.print(F("(")); Serial.print(results * 0.5); Serial.println(F("mV)"));
    DisChargCurrentCount = DisChargCurrentCount + float(results * 0.5) / 0.26666;
    
    adc0 = ads.readADC_SingleEnded(3);
    BattVoltage = (float((adc0 * 0.5) / 1000.0)) / 0.2675;
    
    adc0 = ads.readADC_SingleEnded(2);
    PanelVoltage = float((adc0 * 0.5) / 1000.0) / 0.1277;
    
    if (BattVoltage < 2.55){
        Power_OFF();
    }
    
    Count++;
    if (Count > 59){
        Count = 0;
        ChargingCurrent = ChargingCurrentCount / 60.0;
        DisChargCurrent = DisChargCurrentCount / 60.0;
        ChargingCurrentCount = 0;
        DisChargCurrentCount = 0;
    }
    Serial.println(BattVoltage);
    Serial.println(PanelVoltage);
    Serial.println(ChargingCurrent);
    Serial.println(DisChargCurrent);
    
    
    //----- Temperature & Humidity -----------------------------------------------------------------------------------
    Temperature = hdc1080.readTemperature();
    Humidity = hdc1080.readHumidity();


    //----- Pressure -------------------------------------------------------------------------------------------------
    PressurePA = bmp.readPressure();
    PressureMM = PressurePA / 133.3;


    //----- Light level ----------------------------------------------------------------------------------------------
    Lightlevel = myBH1750.readLightLevel();
    Serial.print(F("Light level: "));
    Serial.println(Lightlevel);
}

void DataLog(){
    
    Serial.println();

    myFile = SD.open(LogFileName, FILE_WRITE);
    if (myFile) {
        Serial.println(F("Writing to log.csv..."));
        
        sprintf(Buffer,"%02u.%02u.%02u", da, mo, yea);
        myFile.print(Buffer);                             // запись в файл даты
        myFile.print(",");

        Serial.print(F("Date / Time: "));Serial.print(Buffer);
        
        sprintf(Buffer,"%02u:%02u:%02u", hh, mm, ss);  
        myFile.print(Buffer);                             // запись в файл времени

        Serial.print(F(" "));Serial.println(Buffer);
        
        myFile.print(",");
        myFile.print(BattVoltage);                      // запись в файл напряжения на аккумуляторе
        myFile.print(",");
        myFile.print(PanelVoltage);                      // запись в файл напряжения на солнечной панели
        myFile.print(",");
        myFile.print(ChargingCurrent);                      // запись в файл силы тока заряда
        myFile.print(",");
        myFile.print(DisChargCurrent);                      // запись в файл силы тока разряда

        Serial.print(F("Battery Voltage: "));Serial.print(BattVoltage); Serial.println(F(" V.")); 
        Serial.print(F("Solar Panell Voltage: "));Serial.print(PanelVoltage); Serial.println(F(" V.")); 
        Serial.print(F("Charging Current: "));Serial.print(ChargingCurrent); Serial.println(F(" mA")); 
        Serial.print(F("DisCharging Current: "));Serial.print(DisChargCurrent); Serial.println(F(" mA")); 
        
        myFile.print(",");
        myFile.print(Temperature);                      // запись в файл Температуры
        myFile.print(",");
        myFile.println(Humidity);                      // запись в файл Влажности
        
        Serial.print(F("T="));
        Serial.print(Temperature);
        Serial.print(F("C, RH="));
        Serial.print(Humidity);
        Serial.println(F("%"));

        myFile.print(PressurePA);
        myFile.print(",");
        myFile.print(PressureMM);
        myFile.print(",");
        myFile.println(Lightlevel);
        
        Serial.print(F("PressurePA= "));
        Serial.println(PressurePA);
        Serial.print(F("PressureMM= "));
        Serial.println(PressureMM);
        Serial.print(F("Light level: "));
        Serial.println(Lightlevel);
        
        Serial.println(F("done."));
        Serial.println(F(""));
        myFile.close();
    } else {
        // if the file didn't open, print an error:
        Serial.println(F("error opening log file!"));
    }
}

void SendData(){
    client.publish("WStation/Battery", String(BattVoltage));        // отправляем в топик для аккумулятора
    client.publish("WStation/Solar", String(PanelVoltage));         // отправляем в топик напряжение солнечной панели
    client.publish("WStation/Charging", String(ChargingCurrent));   // отправляем в топик силу тока заряда
    client.publish("WStation/DisCharging", String(DisChargCurrent)); // отправляем в топик силу тока разряда

    sprintf(Buffer,"%02u.%02u.%02u", da, mo, yea);
    client.publish("WStation/Date", String(Buffer)); // отправляем в топик даты
    
    sprintf(Buffer,"%02u:%02u:%02u", hh, mm, ss);
    client.publish("WStation/Time", String(Buffer)); // отправляем в топик времени

    client.publish("WStation/Temperature", String(Temperature)); // отправляем в топик для термодатчика значение температуры
    
    client.publish("WStation/Humidity", String(Humidity)); // отправляем в топик для термодатчика значение влажности

    client.publish("WStation/PressurePA", String(PressurePA));   // отправляем в топик давление в паскалях
    client.publish("WStation/PressureMM", String(PressureMM)); // отправляем в топик давление в миллиметрах ртутного столбика

    client.publish("WStation/Lightlevel", String(Lightlevel)); // отправляем в топик уровень освещенности
}

Грешу на строки: 231,232,233,234 выделил цветным.

если комментирую while(1); то вроде как все работает, но то начинает постоянно к wifi конектится то еще что-то.

если while(1); оставляем Wemos D1 постоянно ребутится.

Народ выручайте уже всё облазил куда смотреть? что поменять. Готов оплатить помощь.

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

Антон, что вам непонятно в сообщении

Could not find a valid BMP280 sensor, check wiring! ??

Прежде чем копать огромный код - разберитесь, почему у вас датчик BMP280 не отвечает. Отключите его от своей схемы, возьмите отдельную ардуину и запустите любой пример из библиотеки для этого датчика.

Еще можно запустить I2C сканер, некоторые BMP280 с Али имеют другой адрес

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

while(1) { yield(); ... ; }

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

По факту датчик BMP280 и не подключен, его пока что нет, а вы думаете, что именно из-за него происходит дальнейшая перезагрузка Wemos? Потому как если мы комментируем while(1) - то код продолжает работать дальше, но как попало. То есть Вы пологаете , что ошибка Soft WDT Reset идет оттуда?

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

То есть простыми словами пишем после стройки
while(1);
{
yield();
}

Правильно? Или я что-то с кавычками намудрил?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Кабздец! Ты это серьезно говоришь? То есть датчика нет? А как же оно "работает" тогда без него? )))

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

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

Антон, признайтесь, вы в коде вообще ни буквы не понимаете? Этот код специально написан так, чтобы он зависал при отсутствии датчика - вы что, этого не видите?

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

BOOM пишет:

Кабздец! Ты это серьезно говоришь?


да уж... И этот человек год на форуме...

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Я вижу все и понимаю, вы хотите сказать, что цикл while(1); убивает wemos и он идет в WDT?

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

MASHUKOV.ANTON пишет:

Я вижу все и понимаю, вы хотите сказать, что цикл while(1); убивает wemos и он идет в WDT?

если вы не будете строить из себя знатока - будет лучше.

Сам ваш вопрос говорит о том, что вы ни черта не понимаете.

while(1); - это бесконечный цикл, он завешивает любой МК, а не только вемос. Вы можете вставить в этот цикл yield();, как посоветовал садман41, но в практическом плане это бессмыслено. так как вемос все равно будет крутится в этом цикле бесконечно. Вы можете удалить этот while(1) вовсе, но это тоже не поможет, так как код не предназначен для работы без датчика давления.

Короче. заканчивайте тупить, либо добавляйте датчик, либо правьте код. чтобы удалить обращение к BMP вовсе.

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

MASHUKOV.ANTON пишет:
То есть простыми словами пишем после стройки
while(1);
{
yield();
}

Правильно? Или я что-то с кавычками намудрил?


Неправильно. Точка с запятой лишняя.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:
Точка с запятой лишняя.

Думаешь, он угадает, какая из двух?

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

Ну, со второй попытки угадает.

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

DetSimen пишет:

sadman41 пишет:
Точка с запятой лишняя.

Думаешь, он угадает, какая из двух?

ты что?  в него не веришь?

MASHUKOV.ANTON пишет:

Я вижу все и понимаю

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

sadman41 пишет:
Ну, со второй попытки угадает.

нет, придет с вопросом "удалил точку с запятой, теперь компилятор ругается...."

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

ты что?  в него не веришь?

MASHUKOV.ANTON пишет:

Я вижу все и понимаю

Неа. 

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Все вы конечно крутые профи! Наверное ошибок не делали не разу, и наверно трудно вспомнить себя таким же неучами. Все что написал написал сам! Да помогали люди, возможно не во всем понимаю. И кстати тут не разбор полетов вроде бы, а я конкретно помощи в решении вопроса попросил. Сейчас датчик купил, встал вопрос (его не видит Wemos D1 Mini Pro), есть много разных поверий типо сменить адрес в библиотеке, припять резисторы, подтянуть к питанию 3.3В. Но нигде нет конкретного решения вопроса. Как он подключается понятно, но нужно ли паять резисторы и тд. есть 2 датчика сканер I2C не находит адрес.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

MASHUKOV.ANTON пишет:
Как он подключается понятно, но нужно ли паять резисторы и тд. есть 2 датчика сканер I2C не находит адрес.

А как вы его подключаете? Что еще подключено к ESP?

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Я собираю свою погодную станцию. Датчик только один пока что BMP280  он таки и не заводится Все остальное работает, что подкл. долго описывать.

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

MASHUKOV.ANTON пишет:

 сканер I2C не находит адрес.

пока сканер не найдет датчик, продолжать нет смысла

MASHUKOV.ANTON пишет:

Сейчас датчик купил, встал вопрос (его не видит Wemos D1 Mini Pro), есть много разных поверий типо сменить адрес в библиотеке, припять резисторы, подтянуть к питанию 3.3В. Но нигде нет конкретного решения вопроса.

слушайте, Антон, вы очень наивны, если считайте, что абсолютно на любую вашу проблему у кого-то есть готовое "конкретное решение вопроса". Чаше всего никакого решения нет, надо не ленится и читать форумы, документацию и пробовать все те способы, которые вы называете "повериями" - попробовать поменять адрес, подтянуть пины, припаять резисторы и много еще чего.

Если же вы будете сидеть и ждать, пока кто-то сообщит вам "конкретное решение" - вы ничего никогда не сделаете.

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

MASHUKOV.ANTON пишет:

что подкл. долго описывать.

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

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

MASHUKOV.ANTON пишет:
Я собираю свою погодную станцию.

Это прекрасно, что собираете погодную станцию.

MASHUKOV.ANTON пишет:
Датчик только один пока что BMP280  он таки и не заводится Все остальное работает, что подкл. долго описывать.

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

Подключите датчик к чистой ESP (больше ничего не подключено, кроме одного датчика), сделайте подтяжку I2C линий к VCC, и загрузите I2C сканер. 

Если не увидит ESP датчик - будет что обсуждать. 

Подключаете то   SCL -> GPIO5 (D1) ;  SDA -> GPIO4 (D2)  ? 

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

SergeiL пишет:

Подключите датчик к чистой ESP (больше ничего не подключено, кроме одного датчика), сделайте подтяжку I2C линий к VCC, и загрузите I2C сканер. 

Если не увидит ESP датчик - будет что обсуждать. 

Подключаете то   SCL -> GPIO5 (D1) ;  SDA -> GPIO4 (D2)  ? 

Это если он плату выбрал как LOLIN (WEMOS) D1 mini Pro, а то тут некоторые выбирают NodeMCU )))

/*
  pins_arduino.h - Pin definition functions for Arduino
  Part of Arduino - http://www.arduino.cc/

  Copyright (c) 2007 David A. Mellis
  Modified for ESP8266 platform by Ivan Grokhotkov, 2014-2015.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General
  Public License along with this library; if not, write to the
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  Boston, MA  02111-1307  USA

  $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
*/

#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#define PIN_WIRE_SDA (4)
#define PIN_WIRE_SCL (5)

static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;

#define LED_BUILTIN 2

static const uint8_t D0   = 16;
static const uint8_t D1   = 5;
static const uint8_t D2   = 4;
static const uint8_t D3   = 0;
static const uint8_t D4   = 2;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 15;
static const uint8_t RX   = 3;
static const uint8_t TX   = 1;

#include "../generic/common.h"

#endif /* Pins_Arduino_h */

 

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

На вемосе I2C работает - это точно.

Вопрос только в самом модуле BMP280 - он двух исполнений встречается (3.3V и 5М). Хотя, конечно, так и так работать должно - ESP8266 от 5V на входах не горит.

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

sadman41 пишет:

На вемосе I2C работает - это точно.

Вопрос только в самом модуле BMP280 - он двух исполнений встречается (3.3V и 5М). Хотя, конечно, так и так работать должно - ESP8266 от 5V на входах не горит.

у него адрес не определяется. тут или датчик или не та плата (не к тем пинам подключил)  выбрана

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Всем спасибо за помощь, с датчиком BMP280 похоже проблема либо он неисправен, подключения всех датчиков на плате погодной станции происходят по шине I2C, для этого на плате созданы и выведены отдельные колодки для подключения, все дорожки распаяны. Плату проектировал через EasyEDA все проверено и заранее все резисторы и тд. все что нужно подтянуто к своим питаниям и резисторам. К сожалению датчик BMP280 не сканировался сканером I2C. Почитал на этом форуме есть много постов, но ни один не решает проблему к сожалению. Также в библиотеке Adafruin_BMP280_Lib.... менял адреса: (0x77, 0x76, 0x56-0x58) и многие другие какие сумел отыскать гугл. Но безрезультатно. Попробовал датчик BMP180 проблем нет всё сразу же заработало. И сканер нашел сразу адрес. Делаю вывод, что AliExpress прислал отбраковку, я покупал 2шт, т.к. они даже небыли промаркированы. При подаче на них питания, все прозванивается нигде КЗ нет, заказал с трех магазинов разных еще 5 штук, буду ждать. Ниже немного фотографий погодной станции. Для того чтобы было немного понятно о чём тут вообще речь идет.

Схема созданная в программе EasyEDA

Схема созданная с помощью программы EasyEda и отправлена на заказ в китай JLCPCB.

Заказывал в двух вариантах черных и белых, распаял сразу 2 платы, с учетом если проект "ПОГОДНОЙ СТАНЦИИ" полностью воссоздам, то вторую плату подарю тестю. Так выглядит плата в чистом виде и с распаенными стабилизаторами напряжения один на 3.3в. другой на 5 вольт.

Ниже Плата с обратной стороны.

Плата в сборе но без датчиков. Уже в рабочем состоянии с залитым на нее скетчем.

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

 

 

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

MASHUKOV.ANTON пишет:

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

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

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

кстати если BMP-280 3.3 вольта питать от 5 он даёт дуба, у меня было именно  так

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Вы имеете ввиду, что я по вашим меркам не "вырос" ещё. 

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

ua6em пишет:

кстати если BMP-280 3.3 вольта питать от 5 он даёт дуба, у меня было именно  так

Это в принципе очевидно, датчик исполняется в 2х вариантах. 

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Возможно кто-то разбирается в конвертах уровней, и тд. Есть небольшое понимание одной задумки, хотел сделать но пока что не получается, возможно знаний маловато даёт Джереми Блюм))). В общем хочу сделать так, чтобы при записи данных на SD мигал мой светодиод например зеленого цвета, т.е. простыми словами как на сетевой карте идёт передача данных и диод моргает + если нет карты диоды не горят если карта вставлена (т.е. определилась скетчем) загорается оранжевый. Т.е. воссоздать принцип работы как у сетевой карты. чтоб было видно идут ли данные или нет, т.к на карте собираются данные о погоде  и тд. после чего можно составить диаграмму и тд. Есть у кго соображения как это можно сделать? пока пробую но ничего не выходит.

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

MASHUKOV.ANTON пишет:

Вы имеете ввиду, что я по вашим меркам не "вырос" ещё. 

в принципе да. Ветка показала, что в коде вы ни в зуб ногой. При таком раскладе не стоит кому-то рекомендовать свои поделки, пока сами четко не разберетесь. как оно работает.

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

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

MASHUKOV.ANTON пишет:

Есть у кго соображения как это можно сделать? пока пробую но ничего не выходит.

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

Вам код блинка помочь найти в инете? :)

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

b707 пишет:

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

Вам код блинка помочь найти в инете? :)

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

В данном же случае у меня стоит вопрос как через Wemos обраться к пинам Data Logger Shield, там есть свободный pin и подать туда питание 3.3в чтоб зажечь диод отдельно припаянный к этому пину?

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

MASHUKOV.ANTON пишет:
В общем вот так в кратце о погодной станции, так же все те кто заинтересовался проектом, могу выслать платы, либо уже с распаенными компонентами.

Посмотрел ваше решение погодной станции.  А нужно ли все собирать в одном месте, при стоимости ESP в 300 рублей? Вот зачем SD карта на устройстве подключающемся к Интернет? Не лень вам ее будет вытаскивать и читать ее где-то, если можно посмотреть логи или данные из базы, например на интеграторе (у меня ОпенХАБ), через обычный браузер из любой точки планеты? Но это ИМХО.

У меня к дому штук 20 ESP подключается, и да, только на двух стоят I2C PCF расширители портов и I2C датчики температуры и влажности. Датчики добавил от делать нечего, так как была возможность.

А так в комнатах стоят NTP часы на 7-ми сегментных индикаторах, и заодно передают температуру и влажность на OpenHAB. Часы не показывают температуру и влажность в комнате, показывают уличную температуру, но передают, можно потом графики посмотреть, если захочется.     

В сети уже лет пять ходит утверждение, что что бы ты не собирал на ESP8266, так и ли иначе это решение стремится стать погодной станцией.

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

SergeiL пишет:
А нужно ли все собирать в одном месте, при стоимости ESP в 300 рублей? Вот зачем SD карта на устройстве подключающемся к Интернет? Не лень вам ее будет вытаскивать и читать ее где-то

A если отключили интернет тогда что куда будешь отправлять данные в небо?

SergeiL пишет:
В сети уже лет пять ходит утверждение, что что бы ты не собирал на ESP8266, так и ли иначе это решение стремится стать погодной станцией.

Если что что-то можешь и хочешь сделать пусть это будет свое, всегда роднее.

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

Помещать систему хранения данных в агрессивную и опасную среду - идея не из лучших.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

MASHUKOV.ANTON пишет:

А что если у тебя все пины заняты уже и некуда питалово выводить, что делать ... ? 

Использовать либо I2C-расширители портов (например, всем известная PCF8574 и подобные), либо сдвиговый регистр (например, 74HC595 и подобные), либо все вместе. Причем "натыкать" их можно ооочень много, датчиков всех и светодиодов не хватит, чтобы их все занять )))))

Поддержу #34 - Если есть подключение к сети, то почему бы этим не воспользоваться и отвязаться от SD-карт?

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Как программно в скетче написать чтоб wemos d1 подал питание на пин A0 другого модуля, например на DATA LOGGER SHIELD'e?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Как-то вот это вот утверждение:

MASHUKOV.ANTON пишет:

Я вижу все и понимаю

С вот этим не вяжется:

MASHUKOV.ANTON пишет:

Как программно в скетче написать чтоб wemos d1 подал питание на пин A0 другого модуля, например на DATA LOGGER SHIELD'e?

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

BOOM пишет:
Использовать либо I2C-расширители портов (например, всем известная PCF8574 и подобные), либо сдвиговый регистр (например, 74HC595 и подобные), либо все вместе. Причем "натыкать" их можно ооочень много, датчиков всех и светодиодов не хватит, чтобы их все занять )))))

Дак они есть у меня вы на фото надеюсь видели MCP23017, вопрос как сделать так чтоб wemos D1 подать на определенный pin mcp23017 питаниe как это программно осуществить?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

MASHUKOV.ANTON пишет:

Дак они есть у меня вы на фото надеюсь видели MCP23017, вопрос как сделать так чтоб wemos D1 подать на определенный pin mcp23017 питаниe как это программно осуществить?

Так в приведенном Вами же коде все это есть ))) Неужели высказывание:

MASHUKOV.ANTON пишет:

Я вижу все и понимаю

Все-таки ложное?

Подсказка: Смотри строку 172 )))

 

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

BOOM пишет:

Так в приведенном Вами же коде все это есть

тут стоит поправить - "в спижженом им где-то коде"...

Что, у кого-то есть еще сомнения. что "всегда лучше собрать свое"? :)

Автор. так что в приведенном проекте твое? - есть хоть что-то? -код очевидно нет. Схема, скорее всего, тоже где-то списана, потому как если бы ты сам придумал использовать mcp 23017 - то знал бы и как на нем пином управлять...

Плата, скорее всего, тоже разведена не им - ну просто по аналогии, для развода платы нужно что-то понимать в схемах, а из темы ясно, что ТС - полный ноль.

 

Забавно, что человек еще и имеет наглость предлагать другим тиражировать свой проект...

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Администратор тему я думаю можно закрыть. Потому как ответов на занные вопросы по существу. нет. Есть только мега умники и диванные эксперты делающие выводы с потолка. 

Конкретно b707 вот этот умник на форуме не дал ни одного дельного совета за все его 5 лет на форуме. Балаболка! сколько не читал коменты везде обсирает людей. Блокировать таких пользователей нужно.

 

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

sadman41 пишет:

Помещать систему хранения данных в агрессивную и опасную среду - идея не из лучших.

в смысле...тяжело плыть в серной кислоте?

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

MASHUKOV.ANTON пишет:

Конкретно b707 вот этот умник на форуме не дал ни одного дельного совета за все его 5 лет на форуме.

ты мало того что тупень, так еще и память у тебя короткая. Конкретно тебе я дал дельные советы в сообщениях #1 #9 #19

Но таким как ты не советы нужны, а "конкретные решения" - то бишь, читай, чтобы кто-то писал код за тебя. Сам ты думать не умеешь. Для таких у меня и правда нет никакого сочуствия и помощи, таких я высмеиваю и троллю.

Ветку закрываешь - и правильно. Смысла в ней - ноль. Сам ты - пустое место, помочь тебе нельзя, а делать за тебя твой проект никто не будет.

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

MASHUKOV.ANTON пишет:

 Блокировать таких пользователей нужно.

не всё так однозначно, он увеличивает индекс сайта в поисковых системах )))

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

MASHUKOV.ANTON пишет:

Конкретно b707 вот этот умник ...сколько не читал коменты везде обсирает людей.

а что остается, если 80% новичков ничего другого не заслуживают? к оставшимся 20% я отношусь с уважением. Но уважение не дается просто так, его надо заслужить.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

И RTC там "очень нужен". ;-). Время из сети не получить же :-)

У меня RTC на часах с большим индикатором в коридоре стоит. Часы на ESP.

Если есть NTP время - мигают две точки, работают с RTC - одна. Видел одну точку только при включении питания, секунд пять,  пока время не получат по NTP.

 

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

SergeiL пишет:

Если есть NTP время - мигают две точки, работают с RTC - одна. Видел одну точку только при включении питания, секунд пять,  пока время не получат по NTP.

а как часто обновляешь по NTP? прям каждую секунду, раз у тебя ВСЕГДА две точки мигают?

делал свои часы - ставил обновление с сети раз в 4 часа, между обновлениями обычный миллис

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

b707 пишет:

а как часто обновляешь по NTP? прям каждую секунду, раз у тебя две точки мигают?

делал свои часы - ставил обновление с сети раз в 4 часа, между обновлениями обычный миллис

Конечно не каждую секунду.

Когда часы делал, поставил каждую минуту. Причем дома часов 5 штук, и каждые лезут на NTP сервер за обновлением каждую минуту. Думал заблокируют из за частых обновлений, но нет, все работает без каких либо проблем. А между обновлениями по тикеру инкрементирую секунды. Из тикера и точки мигают.

Если 10 мин нет ответов от NTP сервера, начинают мигать одной точкой. Значения из тикера. Проверял по тикеру точность хода вполне. Если нет NTP и время различается с RTC - время корректируется по RTC. 

На малине поднят NTP сервер, нужно на него перевести домашние часы.