Wemos ATmega328P+ESP8266 32Mb не видит датчиков
- Войдите на сайт для отправки комментариев
Здравствуйте, пишу от отчаяния. Потратил неделю на прошивку этой платы.
Делаю проект Telegram + датчики воды / температуры / дыма. Есть у меня Wemos D1 c esp8266 на борту, все прошил, все отлично, но уперся в один аналоговый выход, этого для меня очень мало.
Решил купить навороченнее плату чтобы много выходов, вайфай на борту. Приобрел на свою голову две платы:
Выставил пины 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();
}
}
Я решил проблему аналоговых входов ESP8266 практичнее. CD5041BE. Стоят 1,5$ за 10 штук. Просто и надёжно.
Я решил взять готовое решение чтобы оно работало из коробки, чтобы я свой код не менял, а тупо перезалил и все завелось. Но не тут то было( Я читал о свитчах разных, но для меня это слишком сложно и муторно. Отдельное питание, отдельные прошивки, отдельные танцы с бубном.
проблема скорее всего в SPIFFS,
https://se7en.ws/novye-revizii-esp8266-ne-umeyut-pisat-v-eeprom/
Закомментил, не помогло.
Вот что в консоли:
тогда разводку смотрите dhtpin приходит на atmega или esp8266
Я смотрел по картинке с интернета, тоже об этом думал и поэтому после каждой перепрошивки я пробую все цифровые порты) Брутфорс ...
esp pins GPIO2
и в настройках esp в arduino ide поменяйте builtin led 2 на 15
esp pins GPIO2
Извините, не понял, что это значит?
там есть разъем называется esp pins из 12 торчащих выводов
там есть разъем называется esp pins из 12 торчащих выводов
O_O нифига себе!!! СПАСИБО! СРАБОТАЛО! В интернете ни слова о этих пинах. Я думал это для расширения или для модулей (шилдов)
А теперь как мне подключить остальные цифровые выводы? Или можно использовать 5 штук GPIO ?
вы же атмегу не используете вот и смотрите на оставшиеся выводы есп
вы же атмегу не используете вот и смотрите на оставшиеся выводы есп
А как ее использовать? В интернете мануалы были именно вот такие. Ставить джамперы 5/6/7, прошивать, отключать 7 джампер и вуаля.
И подскажите пожалуйста почему у меня по дыму такой разброс значений (считывает аналоговый вход)
В инете смотрел у людей от 0 до 10 паразитные значения при макс. значениях 1024. Я еще никакого датчика не подключил, а значения уже скачут от 50 до 400, это не подходит для датчика воды или дыма. Например мне уже нужна сигнализация когда вода подступит хотя-бы на 1 мм, а аналоговое значение 400 соответсвует 40% от максимума, т.е. 2 сантиметра воды, это вообще капец.
потому-что в воздухе ваш аналоговый пин висит, и считывает наводки, подключите на массу и будет 0 показывать
потому-что в воздухе ваш аналоговый пин висит, и считывает наводки, подключите на массу и будет 0 показывать
А можно с вами пообщаться в телеге или скайпе пожалуйста? +380636072154 / fru2zzy
нет, не раздаю
нет, не раздаю
Хорошо, тогда продолжим тут,
1) я подключил датчик дыма на А0, не видит его. Наверное та-же моя ошибка что и раньше, нужно на ESP выводы цеплять, а там 5 штук GPIO, аналоговых нет.
2) Как мне включить адекватные порты D1-D13 атмеги? джамперы как-то выставить нужно?
2) Как мне включить адекватные порты D1-D13 атмеги? джамперы как-то выставить нужно?
писать код под атмегу и общаться с есп
2) Как мне включить адекватные порты D1-D13 атмеги? джамперы как-то выставить нужно?
писать код под атмегу и общаться с есп
В инете не смог найти ничего для новичков к сожалению. Какие запросы хотя-бы гуглить или как мне перевести мой проект на атмегу и чтобы она отсылала все на есп?
Мда, лучше было за эти деньги купить набор Xiaomi датчиков и не страдать =(
https://yandex.ru/search/?clid=2186618&text=esp%2001%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%20%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE&lr=119399&redircnt=1556828561.1
https://yandex.ru/search/?clid=2186618&text=esp%2001%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%20%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE&lr=119399&redircnt=1556828561.1
Взял за основу статью https://voltiq.ru/esp8266-and-arduino/
подключил как там сказано, дальше сказано:
Для теста связи попробуйте отправить модулю команду: AT
Я не смог понять как и куда эту команду отправить. Наверное в дебаге как-то, но я не умею.
Провалился в статью, где рассказывают о UART https://voltiq.ru/padi_iot_stamp_uart/
но там сказано что нужны какие-то RS232-UART преобразователи или USB-UART переходники. Мне тоже они нужны?
И еще там не наведен листинг программы. Я не понял как они пересылают информацию