Отправка строки с Arduino на ESP8266 работает на UNO, но не на Pro Mini
У меня есть проект, в котором я получаю данные датчика и отправляю их на ESP8266-01 для отправки в ThingSpeak. После некоторой работы я заставил его работать. Поэтому, как настоящий умный человек, я решил заменить Arduino UNO, который я использовал (который работал), на Arduino Pro Mini. Используя тот же код и соединения, строка не отправляется ни в ESP, ни в ThingSpeak.
Вот сокращенная версия кода отправки, который я использовал на UNO и Pro.
#include <FS.h>
#include <ESP8266WiFi.h> //https://github.com/esp8266/Ардуино
#include <EEPROM.h>
// нужно для библиотеки
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
#include <ArduinoJson.h>
//#include <SoftwareSerial.h>
//SoftwareSerial espSerial(A0, D1); // Прием | Передача
// материал для ввода строки
const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars]; // временный массив для использования при разборе
// переменные для хранения проанализированных данных
char messageFromPC[numChars] = {0};
float floatFromPC = 0;
float floatFromPC2 = 0;
boolean newData = false;
//конец всего, чтобы ввести строку
String f;
String start = "start";
//НАЧАЛО НОВЫХ МАТЕРИАЛОВ
char Password[36] = "";
char apiKey[16] = "";
WiFiClient client;
//новый конец eeprom
char defaultHost[100] = "";
//Thing Speak IP-адрес (иногда веб-адрес вызывает проблемы с ESP :/
long itt = 500;
long itt2 = 500;
const byte wifiResetPin = 13;
int interruptPinDebounce = 0;
long debouncing_time = 1000;
volatile unsigned long wifiResetLastMillis = 0;
bool shouldSaveConfig = false;
void saveConfigCallback () {
Serial.println("Should save config");
shouldSaveConfig = true;
}
void handleWifiReset() {
if (millis() < wifiResetLastMillis) {
wifiResetLastMillis = millis();
}
if ((millis() - wifiResetLastMillis) >= debouncing_time) {
Serial.println("Clearing WiFi data resetting");
WiFiManager wifiManager;
wifiManager.resetSettings();
SPIFFS.format();
ESP.reset();
delay(1000);
}
wifiResetLastMillis = millis();
}
int addr = 0;
void setup() {
//EEPROM.begin(512); //Инициализировать EEPROM
WiFiManager wifiManager;
Serial.begin(9600);
//espSerial.begin(115200);
pinMode(wifiResetPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(wifiResetPin), handleWifiReset, FALLING);
WiFiManagerParameter customAPIKey("apiKey", "ThingSpeakWriteAPI", apiKey, 16);
// ЗАВЕРШИТЬ НОВЫЕ МАТЕРИАЛЫ
//Менеджер Wi-Fi
//Локальная инициализация. После того, как его бизнес сделан, нет необходимости держать его рядом
//WiFiManager wifiManager;
//НАЧАЛО НОВЫХ МАТЕРИАЛОВ
//wifiManager.setSaveConfigCallback (saveConfigCallback);
wifiManager.addParameter(&customAPIKey);
// ЗАВЕРШИТЬ НОВЫЕ МАТЕРИАЛЫ
//сброс сохраненных настроек
//wifiManager.resetSettings();
//устанавливаем собственный ip для портала
//wifiManager.setAPStaticIPConfig(IP-адрес(10,0,1,1), IP-адрес(10,0,1,1), IP-адрес(255,255,255,0));
//получает ssid и проход из eeprom и пытается подключиться
//если не подключается запускает точку доступа с указанным именем
//здесь "AutoConnectAP"
//и входит в цикл блокировки в ожидании конфигурации
wifiManager.autoConnect("AutoConnectAP");
Serial.println("Connected");
//НАЧАЛО НОВЫХ МАТЕРИАЛОВ
strcpy(apiKey, customAPIKey.getValue());
if (shouldSaveConfig) {
Serial.println("saving config");
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.createObject();
json["defaultHost"] = defaultHost;
json["apiKey"] = apiKey;
Serial.println("API");
Serial.print(apiKey);
String apiKey2 = String(apiKey);
File configFile = SPIFFS.open("/config.json", "w");
if (!configFile) {
Serial.println("failed to open config file for writing");
}
json.printTo(configFile);
json.printTo(Serial);
delay(1000);
configFile.close();
//конец сохранения
}
Serial.println("local ip");
Serial.println(WiFi.localIP());
// ЗАВЕРШИТЬ НОВЫЕ МАТЕРИАЛЫ
//или используйте это для автоматически сгенерированного имени ESP + ChipID
//wifiManager.autoConnect();
//Serial.println("WriteApi");
//Serial.println(apiKey);
// если вы доберетесь сюда, значит, вы подключились к Wi-Fi
//Serial.println("K)");
//сохраняем пользовательские параметры в FS
strcpy(apiKey, customAPIKey.getValue());
EEPROM.begin(512); //Инициализировать EEPROM
// записать соответствующий байт EEPROM.
// эти значения останутся там, когда плата
// выключен.
EEPROM.write(addr, 'A'); //Запись символа А
addr++; //Увеличить адрес
EEPROM.write(addr, 'B'); //Запись символа А
addr++; //Увеличить адрес
EEPROM.write(addr, 'C'); //Запись символа А
//Записываем строку в eeprom
String www = apiKey;
for (int i = 0; i < www.length(); i++) {
//цикл до длины строки www.length() возвращает длину строки
EEPROM.write(0x0F + i, www[i]); //Записываем один за другим с начальным адресом 0x0F
}
EEPROM.commit(); // Сохраняем данные в EEPROM
//читаем строку из eeprom
}
//обратный вызов, уведомляющий нас о необходимости сохранения конфига
void loop() {
//новая строка материала
recvWithStartEndMarkers();
if (newData == true) {
strcpy(tempChars, receivedChars);
// эта временная копия необходима для защиты исходных данных
// потому что strtok(), используемый в parseData(), заменяет запятые на \0
parseData();
showParsedData();
newData = false;
}
// конец строки нового материала
WiFiManager wifiManager;
if (WiFi.status() == WL_DISCONNECTED) {
wifiManager.autoConnect("AutoConnectAP");
}
delay(1000);
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Connected");
delay(1000);
WiFiClient client;
long itt = 50;
long itt2 = 200;
char defaultHost[100] = "api.thingspeak.com";
EEPROM.begin(512);
Serial.println(""); //Переходим к следующей строке, так как ESP отправляет какой-то мусор, когда вы его сбрасываете
Serial.print(char(EEPROM.read(addr))); //Чтение с адреса 0x00
addr++; //Увеличить адрес
Serial.print(char(EEPROM.read(addr))); //Чтение с адреса 0x01
addr++; //Увеличить адрес
Serial.println(char(EEPROM.read(addr))); //Чтение с адреса 0x02
//читаем строку из eeprom
String www;
//Здесь мы не знаем, сколько байт нужно прочитать, лучше использовать какой-нибудь завершающий символ
//Давайте сделаем это вручную www.circuits4you.com общая длина 20 символов
for (int i = 0; i < 16; i++) {
www = www + char(EEPROM.read(0x0F + i)); //Чтение по одному с начальным адресом 0x0F
}
Serial.print(www); // Печатаем текст на последовательном мониторе
if (client.connect(defaultHost, 80)) { // "184.106.153.149" или api.thingspeak.com
itt++; //Заменить на показания датчика или что-то полезное
String postStr = www;
postStr += "&field1=";
postStr += String(floatFromPC);
postStr += "&field2=";
postStr += String(floatFromPC2);
postStr += "\r\n\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + String (www) + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n\n");
client.print(postStr);
Serial.println("% send to Thingspeak");
}
client.stop();
Serial.println("Waiting…");
}
delay(5000);
}
//больше нового для строки
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
} else {
receivedChars[ndx] = '\0'; // завершаем строку
recvInProgress = false;
ndx = 0;
newData = true;
}
} else if (rc == startMarker) {
recvInProgress = true;
}
}
}
void parseData() { // разбиваем данные на части
char * strtokIndx; // это используется strtok() в качестве индекса
strtokIndx = strtok(tempChars, ","); // получаем первую часть - строку
strcpy(messageFromPC, strtokIndx); // копируем его в messageFromPC
strtokIndx = strtok(NULL, ","); // это продолжается там, где остановился предыдущий вызов
floatFromPC = atoi(strtokIndx); // преобразовать эту часть в целое число
strtokIndx = strtok(NULL, ",");
floatFromPC2 = atoi(strtokIndx); // преобразовать эту часть в число с плавающей запятой
}
void showParsedData() {
Serial.print("Message ");
Serial.println(messageFromPC);
Serial.print("Float ");
Serial.println(floatFromPC);
Serial.print("Float ");
Serial.println(floatFromPC2);
}
//конец новой строки материала
Извините за длину, но... я не знаю, нужно ли мне изменить способ отправки строки или мне нужно включить контакты TX и RX в Pro Mini. Я пытался подключить RX Arduino к TX ESP и TX Arduino к RX ESP и RX к RX и TX к TX безрезультатно. Я знаю, что контакты работают, потому что я много раз программировал ESP и PRO с контактами TX и RX.
Кто-нибудь может помочь мне с этим? Это сводит меня с ума.
@user1114881, 👍-1
Обсуждение1 ответ
Я, наконец, заставил это работать, повторив Serial.print (f); а затем задержка (1000); много раз. Я изменил свой исходный пост, чтобы отразить это. Каким-то образом это передает строку в ESP, чтобы он мог ее проанализировать и загрузить. Теперь все, что я хочу сделать, это добавить датчик температуры и, возможно, добавить IFTTT ко всему этому, чтобы, если нижний предел становится слишком низким или верхний слишком высоким (об уровне воды, я могу получить уведомление, чтобы проверить всю систему . Спасибо JRobert за помощь, я получил необходимую мощность для платы.
- Повреждение данных SoftwareSerial - поиск предложений
- AT-команда не отвечает на последовательный монитор
- Последовательная связь ESP8266 с ATMega328P
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Пытаюсь прошить ESP8266 с помощью Arduino UNO
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Использование ESP8266-01 с Arduino uno R3
Используете ли вы одни и те же соединения между ESP и Arduino? Кросс-соединение RX/TX правильно. Uno — это устройство на 5 В; ESP - это устройство на 3,3 В. Pro-mini может быть любым. Использовали ли вы переключатели уровней или аналогичные с UNO? Pro-mini нуждается и использует их (5v Pro-mini) или не нуждается и не использует их (3.3v Pro-mini)?, @JRobert
Поэтому я провел несколько экспериментов. У меня был модуль адаптера , прикрепленный к ESP, поэтому я снял его и подключил напрямую к ESP. Я перешел от контактов платы Pro как RX к TX, так и TX к Rx, и наоборот, без загрузки, без мигания светодиода tx на плате. Я также попробовал с контактов заголовка на конце платы оба T, @user1114881
извините, нажмите «вернуться», это конец предыдущего комментария TX к RX и RX к TX и наоборот. Но без лучших результатов. Обычно я использую переключатели уровней, но не для эксперимента с Arduino Uno и Arduino Pro Mini. Без переключателя он работал с UNO, а не с Pro Mini. Так что я не думаю, что это контактные соединения., @user1114881
Что-то в тебе, Про-мин, отличается от тебя, Уно. (Рабочее напряжение? Частота? Выбор скорости передачи данных?) У нас недостаточно информации (пока), чтобы знать, что это такое, но это то направление, в котором вам нужно двигаться., @JRobert
Таким образом, ESP питается от отдельного регулятора напряжения 3,3 В. Я пробовал все виды скорости передачи данных как на Pro, так и на ESP. Предполагается, что ESP работает на скорости 115200, и когда я пытаюсь сбросить его, он говорит, что скорость 115200 бод заменяется на 115200, но какую бы скорость я ни задавал в коде для переопределения, я должен установить последовательный монитор на эту скорость, чтобы она была читать правильно. Pro говорит, что его нормальная скорость составляет 57600, но я пытался сбросить ее, и ничего не помогает. Мне нужен окончательный ответ. TXO на плате Pro подключается к RX на ESP, а RXI к TX. вот так у меня настроено., @user1114881
Вот распечатка формы загрузки компьютера в Pro Mini с использованием порта: /dev/cu.usbserial-00000000 с использованием программатора: arduino Переопределение скорости передачи: 57600 AVR Часть: ATmega328P, @user1114881
У вас правильные соединения Tx->Rx и Rx->Tx (называемые «перекрестными»). «Переопределение скорости передачи данных... и т. д.» верно во время загрузки. Загрузчик устанавливает известную скорость передачи для загрузки, а avrdude на вашем ПК устанавливает скорость передачи ПК на то же значение. Слово «переопределение» здесь сбивает с толку, но просто означает, что во время загрузки не будут использоваться последние скорости, на которых вы их оставили. ..., @JRobert
... Тем не менее, все еще интересно, чем отличаются ваши Uno и Pro-mini. Является ли каждое из них устройством 5v? Соединены ли/были основания Arduino и ESP друг с другом? Питается ли ESP от контакта питания 3,3 В Arduino (не должно быть)? Подключен ли Arduino Tx -> ESP RX либо через делитель напряжения, либо через преобразователь уровней (это должно быть, но обратное подключение, ETx -> ARx, можно и без него). Использует ли Arduino UART на контактах [1,2] или SoftwareSerial (если SS, вам нужно будет снизить скорость передачи данных до 9600)? Схема ваших силовых и коммуникационных соединений поможет., @JRobert
UNO и Pro оба 5v. UNO и ESP имеют общую основу, и при первоначальном подключении UNO питается от источника батареи, который имеет усилитель до 9 В, подключенный к контакту Vin. ESP питается от 9 В, проходящего через регулятор 3,3 В. На Pro он питается от усилителя 9 В, идущего на регулятор 5 В, затем на контакт 5 В VCC для питания платы, а ESP питается от регулятора 3,3 В. реле включается на короткое время для питания ESP с 3,3 В для экономии энергии. 9В, входящее в UNO, я думаю, регулируется до 5В. Я не могу думать ни о чем другом. оба 16 Гц, @user1114881
Если я правильно перечитал ваш пост, соединение Arduino Tx -> ESP Rx является прямым. Но 5 В Arduino слишком высоки для ESP и, возможно, повредили драйвер контакта Rx. Уно еще работает? Все, что я могу сделать, это повторить, что вам или нам нужны схемы рабочих и неработающих систем и более подробное описание проблемы, чем «... он отлично работает на Arduino UNO, но не на Arduino Pro Mini». Сложные проблемы требуют сделать шаг назад и применить строгий, полный и пошаговый анализ. Пожалуйста, дополните свои вопросы схемами и четким описанием того, как они ведут себя по-разному., @JRobert
Каждый раз, когда я меняю скорость передачи данных, я перепрограммирую ESP с помощью RX-TX, чтобы они работали нормально. Я читал, что при длительном воздействии он может поджарить их, но на короткое время это нормально. Один из них, который я понял, я их вставлю. PRO, который я использую, является подделкой, так что это может быть он. Я заказал оригинальный в SparkFun и заменю его, когда он будет доставлен. Я загружаю две электрические схемы., @user1114881
Единственное различие, которое я вижу между двумя вашими схемами, заключается в том, что Uno использует встроенный регулятор 5 В, а внешний регулятор 5 В, похоже, не работает. Pro использует ваш внешний регулятор 5v. Почему разница? Пробовали ли вы подавать на вход Pro's Vin/Raw 9 В, как на Uno? Я понятия не имею, почему это должно быть проблематично; это просто разница, которую я вижу, которую я бы исключил. Я бы также провел обратный эксперимент и сравнил любую плату MCU, питаемую от вашего внешнего регулятора на своем Vin., @JRobert
Я попробую это. Необработанное входное напряжение PRO регулируется до 5 В, поэтому я не думаю, что должна быть разница. Есть ли способ запрограммировать ESP8266 с помощью Arduino PRO MINI, как я делаю UNO. таким образом я бы знал, работает ли RX TX на плате PRO., @user1114881
Вы должны быть в состоянии делать с Pro все, что вы можете с Uno. Но разве вы не говорили, что *могли* сделать это (2-е и последнее предложение вашего поста)?, @JRobert
Я программирую ESP с помощью UNO, а затем переключаю его на Pro. Я сейчас в дороге, но попробую, когда вернусь домой. Не понимаю, почему изменение входного напряжения должно иметь значение, @user1114881
Я попытался подключить 9vdc к сырому и отключить 5vdc к VCC. PRO показывает, что у него есть питание по красному светодиоду, но контакты, похоже, не работают. По крайней мере, контакт № 2 не загорается, когда должен. Если я отключу 5 В и подключу питание к разъему, контакт № 2 не будет реагировать должным образом. Я думаю, что плата испорчена. попробую снять и заменить. Любые предложения по удалению., @user1114881
Сегодня я установил новый Arduino Pro Mini и запрограммировал его. Подключение теперь такое же, как и в случае с Arduino UNO, показанным выше. 9v идет на необработанный вход. При подключении к аккумулятору все работает как надо, за исключением того, что номера датчиков НЕ передаются с Pro на ESP. Я собираюсь попробовать подключить TX-TX и RX-RX. но я не думаю, что это сработает. Может ли быть такое, что когда я отправляю номера с Про на esp, esp начинает вещание раньше, чем получает номера датчиков? Должен ли я запустить его дольше, чтобы увидеть, получит ли он номера для 2-й трансляции? По-прежнему нет светодиодов TX в Pro., @user1114881