Отправка строки с Arduino на ESP8266 работает на UNO, но не на Pro Mini

Проводка Arduino Uno

У меня есть проект, в котором я получаю данные датчика и отправляю их на 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.

Кто-нибудь может помочь мне с этим? Это сводит меня с ума.

, 👍-1

Обсуждение

Используете ли вы одни и те же соединения между 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


1 ответ


0

Я, наконец, заставил это работать, повторив Serial.print (f); а затем задержка (1000); много раз. Я изменил свой исходный пост, чтобы отразить это. Каким-то образом это передает строку в ESP, чтобы он мог ее проанализировать и загрузить. Теперь все, что я хочу сделать, это добавить датчик температуры и, возможно, добавить IFTTT ко всему этому, чтобы, если нижний предел становится слишком низким или верхний слишком высоким (об уровне воды, я могу получить уведомление, чтобы проверить всю систему . Спасибо JRobert за помощь, я получил необходимую мощность для платы.

,