Wemos ATmega328P+ESP8266 32Mb не видит датчиков

fruzzy
Offline
Зарегистрирован: 02.05.2019

Здравствуйте, пишу от отчаяния. Потратил неделю на прошивку этой платы.

Делаю проект Telegram + датчики воды / температуры / дыма. Есть у меня Wemos D1 c esp8266 на борту, все прошил, все отлично, но уперся в один аналоговый выход, этого для меня очень мало.

Решил купить навороченнее плату чтобы много выходов, вайфай на борту. Приобрел на свою голову две платы:

https://www.aliexpress.com/item/GREATZT-UNO-WiFi-R3-ATmega328P-ESP8266-32Mb-memory-USB-TTL-CH340G-For-Arduino-Uno-NodeMCU-WeMos/32963516971.html?spm=a2g0s.9042311.0.0.4e5a4c4d0CIuE4

Выставил пины 5/6/7 в ON, остальные OFF, прошил, отключил 7 пин, в мониторе порта вайфай подключился, а вот датчики не показывает. Пробовал прошить Blink - тоже ноль на массу. Прошило 100%, а мигает как обычно.

Пробовал менять версии библиотек, менять платы в настройках плат, менять настройки прошивки, облазил весь интернет. Короче за неделю я забрутфорсил почти все варианты прошивки. Плата отправляет сообщения в телеграм, видит входящие, но вот датчики не видит. Я уже все порты перепробовал.

Так как купил две таких, подумал первая брак, у второй аналогичное поведение. Датчики живые, вставляю в старую Wemos D1 - все прекрасно.

Сейчас настройки на которых прошивается успешно и работает телеграм:

Помогите пожалуйста разобраться, я уже сделал все что смог.

Код программы:

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <FS.h>
#include <ArduinoJson.h>
#include "DHT.h"

#define alarm 0 //Активная пищалка подключается на D4 плюсом и минусом на GND
#define DHTPIN 2 // Датчик температуры
#define DHTTYPE DHT22
#define BOTtoken "714045601:AAE92GHOC-z3lAqVm_nRA5as5sh1ju8tcgs"

DHT dht(DHTPIN, DHTTYPE);

char ssid[] = "Natella";     // your network SSID (name)
char password[] = "Natella1103"; // your network key

WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOTtoken, secured_client);

int Bot_mtbs = 2000; // mean time between scan messages
long Bot_lasttime;   // last time messages' scan has been done

int bulk_messages_mtbs = 1500; // mean time between send messages, 1.5 seconds
int messages_limit_per_second = 25; // Telegram API have limit for bulk messages ~30 messages per second

String subscribed_users_filename = "subscribed_users.json";

DynamicJsonBuffer jsonBuffer;

void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));

  for (int i = 0; i < numNewMessages; i++) {
    String chat_id = String(bot.messages[i].chat_id);
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "") from_name = "Guest";

    if (text == "/start") {
      if (addSubscribedUser(chat_id, from_name)) {
        String welcome = "This is Bulk Messages example.\n\n";
        welcome += "/showallusers : show all subscribed users\n";
        welcome += "/testbulkmessage : send test message to subscribed users\n";
        welcome += "/removeallusers : remove all subscribed users\n";
        welcome += "/stop : unsubscribe from bot\n";
        bot.sendMessage(chat_id, welcome, "Markdown");
      } else {
        bot.sendMessage(chat_id, "Something wrong, please try again (later?)", "");
      }
    }

    if (text == "/stop") {
      if (removeSubscribedUser(chat_id)) {
        bot.sendMessage(chat_id, "Thank you, " + from_name + ", we always waiting you back", "");
      } else {
        bot.sendMessage(chat_id, "Something wrong, please try again (later?)", "");
      }
    }

    if (text == "/testbulkmessage") {
      sendMessageToAllSubscribedUsers("ATTENTION, this is bulk message for all subscribed users!");
    }

    if (text == "/showallusers") {
      File subscribedUsersFile = SPIFFS.open("/" + subscribed_users_filename, "r");

      if (!subscribedUsersFile) {
        bot.sendMessage(chat_id, "No subscription file", "");
      }

      size_t size = subscribedUsersFile.size();

      if (size > 1024) {
        bot.sendMessage(chat_id, "Subscribed users file is too large", "");
      } else {
        String file_content = subscribedUsersFile.readString();
        bot.sendMessage(chat_id, file_content, "");
      }
    }

    if (text == "/removeallusers") {
      if (SPIFFS.remove("/" + subscribed_users_filename)) {
        bot.sendMessage(chat_id, "All users removed", "");
      } else {
        bot.sendMessage(chat_id, "Something wrong, please try again (later?)", "");
      }
    }
  }
}

JsonObject& getSubscribedUsers() {
  File subscribedUsersFile = SPIFFS.open("/" + subscribed_users_filename, "r");

  if (!subscribedUsersFile) {
    Serial.println("Failed to open subscribed users file");

    // Create empty file (w+ not working as expect)
    File f = SPIFFS.open("/" + subscribed_users_filename, "w");
    f.close();

    JsonObject& users = jsonBuffer.createObject();

    return users;
  } else {

    size_t size = subscribedUsersFile.size();

    if (size > 1024) {
      Serial.println("Subscribed users file is too large");
      //return users;
    }

    String file_content = subscribedUsersFile.readString();

    JsonObject& users = jsonBuffer.parseObject(file_content);

    if (!users.success()) {
      Serial.println("Failed to parse subscribed users file");
      return users;
    }

    subscribedUsersFile.close();

    return users;
  }
}

bool addSubscribedUser(String chat_id, String from_name) {
  JsonObject& users = getSubscribedUsers();

  File subscribedUsersFile = SPIFFS.open("/" + subscribed_users_filename, "w+");

  if (!subscribedUsersFile) {
    Serial.println("Failed to open subscribed users file for writing");
    //return false;
  }

  users.set(chat_id, from_name);
  users.printTo(subscribedUsersFile);

  subscribedUsersFile.close();

  return true;
}

bool removeSubscribedUser(String chat_id) {
  JsonObject& users = getSubscribedUsers();

  File subscribedUsersFile = SPIFFS.open("/" + subscribed_users_filename, "w");

  if (!subscribedUsersFile) {
    Serial.println("Failed to open subscribed users file for writing");
    return false;
  }

  users.remove(chat_id);
  users.printTo(subscribedUsersFile);

  subscribedUsersFile.close();

  return true;
}

void sendMessageToAllSubscribedUsers(String message) {
  int users_processed = 0;

  JsonObject& users = getSubscribedUsers();

  for (JsonObject::iterator it = users.begin(); it != users.end(); ++it) {
    users_processed++;

    if (users_processed < messages_limit_per_second)  {
      const char* chat_id = it->key;
      bot.sendMessage(chat_id, message, "");
    } else {
      delay(bulk_messages_mtbs);
      users_processed = 0;
    }
  }
}

void alarmLow() {
  tone(alarm, 1000, 900);
  delay(3000);
  tone(alarm, 1000, 900);
  delay(3000);
  tone(alarm, 1000, 900);
  delay(3000);
}

void alarmHigh() {
  tone(alarm, 1000, 1200);
  delay(2000);
  tone(alarm, 1000, 1200);
  delay(2000);
  tone(alarm, 1000, 1200);
  delay(2000);
  tone(alarm, 1000, 1200);
}

void setup() {
  pinMode(A0, INPUT); //Укажем что порт A0 будет использован на вход
  //pinMode(SPIN, INPUT);
  Serial.begin(115200);
  delay(10);
  dht.begin();

  if (!SPIFFS.begin()) {
    Serial.println("Failed to mount file system");
    return;
  }

  // attempt to connect to Wifi network:
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  if (millis() > Bot_lasttime + Bot_mtbs)  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    int h = dht.readHumidity();
    float t = dht.readTemperature();
    int s = analogRead(A0);
    //int s = digitalRead(SPIN);
    String smoke = String(((s / 10 - 8) * 3));
    String smoke_alarm = "ALARM! Smoke value too high: " + String(s) + " (" + smoke + "%)";

    if (s > 300) {
      sendMessageToAllSubscribedUsers(smoke_alarm);
      alarmLow();
    } else if (s > 420) {
      sendMessageToAllSubscribedUsers(smoke_alarm);
      alarmHigh();
    }

    String outputText = "Temperature: " + String(t) + "°C, " + "Humidity: " + h + "%, "
                        + "Smoke: " + String(s) + " (" + smoke + "%)";
    Serial.println(outputText);

    //    if (digitalRead(SPIN) == LOW) {
    //      sendMessageToAllSubscribedUsers(smoke_alarm);
    //      alarmHigh();
    //    }

    while (numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      for (int i = 0; i < numNewMessages; i++) {
        bot.sendMessage(bot.messages[i].chat_id, outputText, "");
      }
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
      //sendMessageToAllSubscribedUsers(outputText);
    }

    Bot_lasttime = millis();
  }
}

 

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Я решил проблему аналоговых входов ESP8266 практичнее.  CD5041BE. Стоят 1,5$ за 10 штук. Просто и надёжно. 

fruzzy
Offline
Зарегистрирован: 02.05.2019

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

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

проблема скорее всего в  SPIFFS,

https://se7en.ws/novye-revizii-esp8266-ne-umeyut-pisat-v-eeprom/

fruzzy
Offline
Зарегистрирован: 02.05.2019

Закомментил, не помогло.

Вот что в консоли:

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

тогда разводку смотрите dhtpin приходит на atmega или esp8266

fruzzy
Offline
Зарегистрирован: 02.05.2019

Я смотрел по картинке с интернета, тоже об этом думал и поэтому после каждой перепрошивки я пробую все цифровые порты) Брутфорс ...

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

esp pins GPIO2

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

и в настройках esp в arduino ide поменяйте builtin led 2 на 15

fruzzy
Offline
Зарегистрирован: 02.05.2019

Valera19701 пишет:

esp pins GPIO2

Извините, не понял, что это значит?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

там есть разъем называется esp pins из 12 торчащих выводов

fruzzy
Offline
Зарегистрирован: 02.05.2019

Valera19701 пишет:

там есть разъем называется esp pins из 12 торчащих выводов

O_O нифига себе!!! СПАСИБО! СРАБОТАЛО! В интернете ни слова о этих пинах. Я думал это для расширения или для модулей (шилдов)

А теперь как мне подключить остальные цифровые выводы? Или можно использовать 5 штук GPIO ?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

вы же атмегу не используете вот и смотрите на оставшиеся выводы есп

fruzzy
Offline
Зарегистрирован: 02.05.2019

Valera19701 пишет:

вы же атмегу не используете вот и смотрите на оставшиеся выводы есп

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

 

И подскажите пожалуйста почему у меня по дыму такой разброс значений (считывает аналоговый вход)

В инете смотрел у людей от 0 до 10 паразитные значения при макс. значениях 1024. Я еще никакого датчика не подключил, а значения уже скачут от 50 до 400, это не подходит для датчика воды или дыма. Например мне уже нужна сигнализация когда вода подступит хотя-бы на 1 мм, а аналоговое значение 400 соответсвует 40% от максимума, т.е. 2 сантиметра воды, это вообще капец.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

потому-что в воздухе ваш аналоговый пин висит, и считывает наводки, подключите на массу и будет 0 показывать

fruzzy
Offline
Зарегистрирован: 02.05.2019

Valera19701 пишет:

потому-что в воздухе ваш аналоговый пин висит, и считывает наводки, подключите на массу и будет 0 показывать

А можно с вами пообщаться в телеге или скайпе пожалуйста? +380636072154 / fru2zzy

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

нет, не раздаю

fruzzy
Offline
Зарегистрирован: 02.05.2019

Valera19701 пишет:

нет, не раздаю

Хорошо, тогда продолжим тут,

1) я подключил датчик дыма на А0, не видит его. Наверное та-же моя ошибка что и раньше, нужно на ESP выводы цеплять, а там 5 штук GPIO, аналоговых нет.

2) Как мне включить адекватные порты D1-D13 атмеги? джамперы как-то выставить нужно?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

fruzzy пишет:

2) Как мне включить адекватные порты D1-D13 атмеги? джамперы как-то выставить нужно?

писать код под атмегу и общаться с есп

fruzzy
Offline
Зарегистрирован: 02.05.2019

Valera19701 пишет:

fruzzy пишет:

2) Как мне включить адекватные порты D1-D13 атмеги? джамперы как-то выставить нужно?

писать код под атмегу и общаться с есп

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

Мда, лучше было за эти деньги купить набор Xiaomi датчиков и не страдать =(

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
fruzzy
Offline
Зарегистрирован: 02.05.2019

Взял за основу статью https://voltiq.ru/esp8266-and-arduino/

подключил как там сказано,  дальше сказано:

Для теста связи попробуйте отправить модулю команду: AT

Я не смог понять как и куда эту команду отправить. Наверное в дебаге как-то, но я не умею.

Провалился в статью, где рассказывают о UART https://voltiq.ru/padi_iot_stamp_uart/

но там сказано что нужны какие-то RS232-UART преобразователи или USB-UART переходники. Мне тоже они нужны?

И еще там не наведен листинг программы. Я не понял как они пересылают информацию