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

LOLIN*WEMIS) D1 R2 & mini проблема с шиной SPI.

Народ, с этой проблемой разобрался. Перезагрузка почему-то была только когда я не подключал сигнал CS от дисплея. Сейчас вроде все подобрал куда какие выходы подключить. Все работает и в обычном режиме в режиме глубокого сна. Но есть одно НО. На TX у меня сидит светодиод, который показывает состояние датчика движения (Serial никак не задействован в коде). Так вот в режиме глубокого сна я его и не назначаю, но этот светодиод почему-то при отработке кода или при засыпании, уж не знаю когда, зажигается в пол силы и горит всегда. Как от этого избавиться - не знаю. Вот код, который срабатывает при загрузке (это часть setup)? rjulf ecnhjqcndj hf,jnftn jn frrevekznjhf/
Код:
else {//если нет напряжения 220В
  //Serial.begin(74880);
  //Инициируем SD-карту
  //digitalWrite(POWER_PIN, HIGH);
  SD.begin(CS_PIN_SDC);
  hasSD = true;

  //Работаем с внутренней памятью (пишем, что загрузка шла в режиме отсутствия питания
  EEPROM.begin(EEPROM_SIZE);// инициализируем EEPROM-память заданного ранее размера
  last_power_state = EEPROM.read(1);
  if (last_power_state == true) {
    EEPROM.write(1, false);
    EEPROM.write(0, false);
    EEPROM.commit();
  }

  //Стартуем библиотеку Wire.h
  Wire_init();

  //Считываем данные времени
  timeS = GetTime();
  addToLog(timeS);
  {
  //Запускаем датчик BME280
  String st = "ID-000. 1. Initialzing sensor BME280...";
  addToLog(st);
  bme280_init();

  //Запускаем датчик AHT10 на 38
  st = "ID-000. 2. Initialazing sensor AHT10";
  addToLog(st);
  AHT10_init();

  //Запускаем датчик HDC1080
  st = "ID-000. 3. Initialazing sensor HDC1080";
  addToLog(st);
  HDC1080_init();
  }

  //----------------------------------------------------------------------------------
  //Собираем данные с датчиков
  Getpressure();
  GettIn1();
  Gethumidity1();
  GettIn2();
  Gethumidity2();
  GettIn3();
  Gethumidity3();

  //Пишем данные в БД
  yyyymmdd = String(cyear) + String(cmonthnum / 10) + String(cmonthnum % 10) + String(cdayofmonth / 10) + String(cdayofmonth % 10);
  addToBD(yyyymmdd, temperatureString1, temperatureString2, temperatureString3, humidityString1, humidityString2, humidityString3, pressureString);
  {String st = "ID-000. 5. Data added to DB";
  addToLog(st);}

  //----------------------------------------------------------------------------------
  //Отрабатываем добавление в базу данных за каждые 3 часа
  midcount = EEPROM.read(2);
  if (chour % 3 == 0 && cmin >= 0 && cmin < 30 && midcount == false) {
    int ss1;
    {
      String st = "ID-0001-1)Begin! " + OutTm;
      addToLog(st);
    }
    //Из функции setPars() берем значение имени файла, куда будем писать данные, год, месяц, день и часы, данные за которые будем брать
    const String instr = setPars();
    const int z1 = instr.indexOf(",");
    const int z2 = instr.indexOf(",", z1 + 1);
    const int z3 = instr.lastIndexOf(",");
    const String FN = instr.substring(0, z1);
    const String a_hours1 = instr.substring(z1 + 1, z2);
    const String a_hours2 = instr.substring(z2 + 1, z3);
    const String a_hours3 = instr.substring(z3 + 1);
    const String a_year = FN.substring(7, 9);
    const int a_month = (FN.substring(9, 11)).toInt();
    const int a_day = (FN.substring(11, 13)).toInt();
    String fd = readFile(FN);
    {
      String str_begin1 = "{\"d\":[";
      str_begin1 += String(a_day);
      str_begin1 += ",";
      str_begin1 += String(a_month);
      str_begin1 += ",";
      str_begin1 += a_year;
      str_begin1 += ",";
      String str_begin2 = str_begin1 + a_hours2;
      String str_begin3 = str_begin1 + a_hours3;
      str_begin1 += a_hours1;
      ss1 = fd.indexOf(str_begin1);
      if (ss1 < 0) {ss1 = fd.indexOf(str_begin2);}
      if (ss1 < 0) {ss1 = fd.indexOf(str_begin3);}
    }
    float s_tIn1 = 0;
    float s_tIn2 = 0;
    float s_tIn3 = 0;
    float s_humidity1 = 0;
    float s_humidity2 = 0;
    float s_humidity3 = 0;
    float s_pressure = 0;
    {
      String st = "ID-0001-2)Input pars - " + instr;
      addToLog(st);
    }
    if (fd.indexOf("FALSE") != 0 && fd != "") {
      {
        String st = "ID-0001-3)File was read";
        addToLog(st);
      }
      String FD = "[";
      const int z3 = fd.lastIndexOf(",");
      const String FD1 = fd.substring(ss1, z3);
      FD += FD1;
      FD += "]";
      char dataJson[FD.length() + 1];
      strcpy(dataJson, FD.c_str());
      DynamicJsonBuffer jsonBuffer;
      JsonArray& root = jsonBuffer.parseArray(dataJson);
      const int all_data = root.size();
      if (all_data != 0) {
        String st = "ID-0001-4)Number of records - " + all_data;
        addToLog(st);
        for (int l = 0; l < all_data; l++) {
          JsonVariant v = root[l].as<const JsonObject&>();
          if (v.success()) {
            s_tIn1 += v["d"][5].as<float>();
            s_tIn2 += v["d"][6].as<float>();
            s_tIn3 += v["d"][7].as<float>();
            s_humidity1 += v["d"][8].as<float>();
            s_humidity2 += v["d"][9].as<float>();
            s_humidity3 += v["d"][10].as<float>();
            s_pressure += v["d"][11].as<float>();
          }
        }
        char av_temperatureString1[5], av_temperatureString2[5], av_temperatureString3[5], av_humidityString1[5], av_humidityString2[5], av_humidityString3[5], av_pressureString[6];
        const float sa_tIn1 = s_tIn1 / all_data;
        dtostrf(sa_tIn1, 4, 1, av_temperatureString1);
        const float sa_tIn2 = s_tIn2 / all_data;
        dtostrf(sa_tIn2, 4, 1, av_temperatureString2);
        const float sa_tIn3 = s_tIn3 / all_data;
        dtostrf(sa_tIn3, 4, 1, av_temperatureString3);
        const float sa_humidity1 = s_humidity1 / all_data;
        dtostrf(sa_humidity1, 4, 1, av_humidityString1);
        const float sa_humidity2 = s_humidity2 / all_data;
        dtostrf(sa_humidity2, 4, 1, av_humidityString2);
        const float sa_humidity3 = s_humidity3 / all_data;
        dtostrf(sa_humidity3, 4, 1, av_humidityString3);
        const float sa_pressure = s_pressure / all_data;
        dtostrf(sa_pressure, 5, 1, av_pressureString);
        yyyymm = String(cyear) + String(cmonthnum / 10) + String(cmonthnum % 10);
        if (addToBD(yyyymm, av_temperatureString1, av_temperatureString2, av_temperatureString3, av_humidityString1, av_humidityString2, av_humidityString3, av_pressureString)) {
          String st = "ID-000. 5. Data 3 hours added to DB";
          addToLog(st);
          EEPROM.write(2, true);
          EEPROM.commit();
          st = "ID-000. 6.)Flag for adding data every 3 hour disabled";
          addToLog(st);
        }
        else {
          String st = "ID-000. 5.)The attampt to add to BD was unseccess - " + OutTm;
          addToLog(st);
        }
      } else {
        String st = "ID-000. 5.)Number of records = 0, stop adding.";
        addToLog(st);
      }
    }
  }
  if (chour % 3 != 0 && cmin >= 0 && cmin < 30 && midcount == true) {
    EEPROM.write(2, false);
    EEPROM.commit();
    String st = "ID-000. 7.)Flag for adding data every 3 hour enabled" + OutTm;
    addToLog(st);
  }

  //----------------------------------------------------------------------------------
  {
    String st = "ID-000|----REBOOT----|"+OutTm;
    addToLog(st);
  }

  ESP.deepSleep(18e8); //30 минут
  //ESP.deepSleep(600e6); //10 минут
}
Вот еще схему финальную на всякий приложу:
 

Вложения

Столкнулся с подобной проблемой при подключении платы lolin d32 с SD для удаленной работы. Включал с аккумуляторами, различными зарядками от 220. Столкнулся с отказом писать на SD, иногда большим количеством сдоев на SD записи. Грешу на уровень питания. Думаю, что иногда подаваемого вольтажа не хватает для поддержки SD. Остановился на питании от 220 вольт через отобранную зарядку. Пишет всегда, но сбои бывают. Пока не понял отчего, думаю поиграть задержками после актов записи.
 
Не, у меня вроде на карту все пишет хорошо. Я боюсь, что со включенным в пол сили диодом аккума на долго не хватит даже в режиме глубокого сна.
 
Честно говоря ничего не понял. Что такое Dummy Arduino App и Arduino Set GPIOs Low? Как это связано с тем, что чветодиод горит в пол сили в то время, когда ESP находится в режиме глубокого сна? Ведь в режиме нормальной работы он никогда не загорается, если ему это не назначено. Ну и тем более непонятно можно от этого как-то избавиться?D1 и D2 использовать нельзя, т.к. они уже задействованы под I2C.
Да, еще такая фигня. Пытался я этот светодиод менять местами с GPIO2 и GPIO3. В обычном режиме все работает. Но вот в режиме глубокого сна не отрабатывает. Точнее первый раз отрабатывает и зависает.
 
Со светодиодом разобрался. Подключил его наоборот. Минусом к GPIO1, а плюсом соответственно на +5вольт, которых и нет, когда работает от батареи.
Попробую задать вопрос, хотя ответ получить почти не надеюсь. Есть у меня датчик движения, для того, что бы гасить экран, когда долго никого нет в комнате или ночью, когда нет движения.
Так вот как-то он странно работает. Точнее хуже того. Схема была собрана и он работал как положено. А сейчас вдруг перестал. Я сам датчик накрываю, а на выходе все равно 1. При чем в неопределенный момент он может таки типа понять, что нет движения и дать 0 на выходе. И так как сам датчик полностью закрыт, по идее он не должен бы сработать. Но он срабатывает и опять на выходе 1. Схема датчика самосборная (блок датчика не куплен на алиэкспресс). Но схема рабочая, проверенная на другом устройстве.
При чем где-то с месяц назад, датчик вдруг перестал работать. Я пол схемы перебрал. Вернулся к старому варианту схемы, он работает. А тут возился с засыпанием по сну, чиста проводок от одной платы, где датчик собран отпаял, припаял снова (хотел на GPIO16 посадить светодиод) и он снова перестал работать. Все прозвонил, соплей вроде нет. Спиртом плату промыл. Не пойму и все тут.
Если что вот код работы с датчиком. Но он тоже давно проверенный ни на одном устройстве, да и работал вроде.
Код:
//-------------------------------------------------------------------------------------------
//Работаем с датчиком движения, LockLow = false при обнаружении движения, True в состоянии покоя
//if (digitalRead(MOVE) == HIGH || pultcode != 0) {
if (digitalRead(MOVE) == HIGH) {
  //Если еще не вывели информацию об обнаружении
  if (lockLow)
  {
    lockLow = false;
    digitalWrite(POWER_PIN, HIGH);
    tstab = millis();
    //setColors = true;
  }
  takeLowTime = true;
}
//Ели движения нет
//if (digitalRead(MOVE) == LOW)
else
{
  //Если время окончания движения еще не записано
  if (takeLowTime)
  {
    lowIn = millis(); //Сохраним время окончания движения
    takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
  }
  //Если время без движение превышает паузу => движение окончено
  if (!lockLow && millis() - lowIn > pause)
  {
    //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
    lockLow = true;
    tstab = millis();
    digitalWrite(POWER_PIN, LOW);
  }
}
Да, если что после перепайки проводка я микросхему датчика поменял на всякий пожарный. ноль реакции.
 

Вложения

  • 220.7 KB Просмотры: 5

CodeNameHawk

Moderator
Команда форума
А просто тестером проверить работу датчика, уже не модно?
Разделяй и властвуй.
 
Тестером проверить что у него на выходе? Дык я выход датчика вывел на WEB-страницу и вижу, что там 1 всегда сидит. Тестером раньше проверял. Тоже 1 сидела. Я уж даже пробовал подтянуть выход на землю.
А уж что твориться на промежуточных выходах это осцилографом смотреть надо. А у меня сейчас нет его.
 

CodeNameHawk

Moderator
Команда форума
Дык я выход датчика вывел на WEB-страницу и вижу, что там 1 всегда сидит.
Зачем просить помощь, если не делать то, что советуют?
Вы видите только то, что написано на странице, то что есть на самом деле на выходе датчика, вы не знаете.
Разделяй и властвуй.
Это значит, что сначала датчик надо проверить отключив от схемы.
Есп проверить без датчика и только если они работают по отдельности, подключить вместе и замерить напряжения на входе есп.
Аргумент, что код работает в другой схеме, а в этой нет, вы неправильно интерпретируете.
 
Последнее редактирование:
Я же написал, что перед тем как вывести на WEB страницу проверял тестером. Замучался тыкать вот и вывел на страницу. Но показания совпадают 100%. Это я проверил.
Завтра попробую отключить от ESP выход датчика. Но если он заработает не подключеный к ESP это будет какая-то фантастика. Там ведь просто вход, который меряет состояние.
 
Аргумент, что код работает в другой схеме, а в этой нет, вы неправильно интерпретируете.
немножко поясню, почему я привел этот аргумент. В принципе устройства идентичны. Разница только в том, что в качестве экрана для вывода изображения используются разные устройства и в том, что в данном устройстве 1 датчика температуры и влажности в добавок к двум в предыдущем устройстве(т.е. тут датчики стоят в двух комнатах и на улице, а в первом устройстве только на улице и в комнате). Соответственно код максимально идентичен.
 
Наконец нашел время. Отпаял выход датчика движения от ESP. На выходе датчика постоянно висит 2,7В. На D0 ESP вроде 0. Во всяком случае, когда ее не трогаешь, моя схема в режиме отсутствия движения. Но вот когда касаюсь ее щупом тестера, появляется 1.
 

CodeNameHawk

Moderator
Команда форума
Последнее редактирование:
Если постоянно, то значит не работает.
Об этом я и сам догадывался. Вопрос почему? При чем ведь дважды было, что он работал, а потом переставал работать. А потом по странной причине вновь начинал работать как часы.
Подключите, на этот вывод есп, резистор на 10 Kом на минус.
И померьте по новой.
Ну я думаю это потом, когда разберемся с тем, что бы датчик работал. Без рабочего датчика состояние этого вывода ESP меня мало интересует. Да и что бы подозревать, что что-то не то на нем, надо что бы датчик заработал.
 

CodeNameHawk

Moderator
Команда форума
Вопрос почему? При чем ведь дважды было, что он работал, а потом переставал работать.
Как говорил один капитан, если не работает, значит нет контакта там где нужно или есть контакт там где не нужно.
 
Как говорил один капитан, если не работает, значит нет контакта там где нужно или есть контакт там где не нужно.
Видно я вчера тоже с этим капитаном разговаривал. Уже распечатал схему для прозвонки печатной платы.
 
Пробовал. Сначала датчик движения у меня и был от 5 вольт запитан. Потом я поставил LD1117AS33. Благо там почти никакой обвязки. Уже как стал разбираться и от 5 и от 3,3 пробовал.
 
Сверху Снизу