Проблема подключения ESP8266 ESP-01 arduino uno к cayenne - PullRequest
0 голосов
/ 19 апреля 2020

Я использую экран ESP8266 Wi-Fi для подключения Arduino к серверу cayenne. Однако после подключения чипа к точке доступа он нагревается, а иногда и отстает. После этого он показывает некоторое сообщение, но сервер Cayenne не подключился к Arduino. Каждый виджет не может работать (нет ответа при нажатии кнопки, значение температуры не изменилось и т. Д. c.). Кто-нибудь может решить эту проблему? Это важно для моей курсовой работы. Я использую чип Arduino Uno и ESP8266 ESP-01. Мы пробовали разные стили кода для загрузки данных на сервер cayenne, но они не работали (ниже представлены 3 версии)

Версия 1 финала (Cayenne out):

#define CAYENNE_PRINT Serial
#include <CayenneMQTTESP8266Shield.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <virtuabotixRTC.h>

//Real+Virtual
#define LED_PIN 5
#define temp_sensor 4
#define EspSerial Serial

//Virtual
#define Power_sensor 9
#define DayPower 10
#define MonthPower 11
#define LED_PWM 12

//SSID

char ssid[] = "TP-LINK_MWNg";
char password[] = "mwngpass";

char username[] = "743674368676328742somenumbers";
char mqtt_password[] = "743674368676328742somenumbers";
char client_id[] = "743674368676328742somenumbers";

ESP8266 wifi(&EspSerial);

//Temperature setup
OneWire oneWire(4);
DallasTemperature sensors(&oneWire);

//Power sensor
const int analogInPin = A0;
int sensorValue = 0;        // value read from the pot
float MAXValue = 0;        // value output to the PWM (analog out)
float Power = 0;
int PWM = 0;

//Time
int curSec = 0;
int curMin = 0;
int curHour = 0;
int curDay = 0;
virtuabotixRTC myRTC(6, 7, 8);
unsigned PowerInDay = 0;
unsigned PowerInMonth = 0;

void setup() {
  // put your setup code here, to run once:
  sensors.begin();
  EspSerial.begin(115200);
  delay(10);
  Cayenne.begin(username, mqtt_password, client_id, wifi, ssid, password);

  pinMode(LED_PIN, OUTPUT);
  analogWrite(LED_PIN, PWM);

  curSec = myRTC.seconds;
  curMin = myRTC.minutes;
  curHour = myRTC.hours;
  curDay = myRTC.dayofmonth;

  //test

}

void loop() {
  Cayenne.loop();
  myRTC.updateTime();
  if ( curSec != myRTC.seconds ) {
    PowerInDay += Power;
    curSec = myRTC.seconds;
  }
  if (curDay != myRTC.dayofmonth) {
    PowerInMonth += PowerInDay;
    PowerInDay = 0;
    curDay = myRTC.dayofmonth;
  }
  if (curDay > myRTC.dayofmonth) {
    PowerInMonth = 0;
  }
  Serial.print(myRTC.dayofmonth);
  Serial.print('/');
  Serial.print(myRTC.month);
  Serial.print('/');
  Serial.print(myRTC.year);
  Serial.print('/');
  Serial.print(' ');
  Serial.print(myRTC.hours);
  Serial.print(':');
  Serial.print(myRTC.minutes);
  Serial.print(':');
  Serial.print(myRTC.seconds);
  Serial.print('\n');
  Serial.print(PowerInDay);
  Serial.print(' ');
  Serial.print(PowerInMonth);
  Serial.print('\n');

}

CAYENNE_OUT(temp_sensor)
{
  sensors.requestTemperatures();
  Cayenne.celsiusWrite(temp_sensor, sensors.getTempCByIndex(0));
}

CAYENNE_OUT(Power_sensor)
{
  sensorValue = analogRead(analogInPin);
  // map it to the range of the analog out:
  if (sensorValue > 0)
    MAXValue = sensorValue * 0.00007307;

  Power = MAXValue * ((float)PWM / (float)255) * 3.3 * ((float)PWM / (float)255);
  // change the analog out value:/

  // print the results to the serial monitor:
  Serial.print("sensor = ");
  Serial.print(sensorValue); //RAW value from analog read :)
  Serial.print("\t output = ");
  Serial.println(MAXValue * ((float)PWM / (float)255), 3); //Output the current
  Serial.print("Power =");
  Serial.println(Power, 3);
  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(50);
  Cayenne.virtualWrite(Power_sensor, Power, "pow", "w");
}

CAYENNE_OUT(DayPower) {
  Cayenne.virtualWrite(DayPower, PowerInDay, "pow", "w");
}

CAYENNE_OUT(MonthPower) {
  Cayenne.virtualWrite(MonthPower, PowerInMonth, "pow", "w");
}


CAYENNE_IN(LED_PIN)
{
  int currentValue = getValue.asInt();
  if (currentValue == 1) {
    PWM = 255;
    digitalWrite(LED_PIN, HIGH);
  } else {
    PWM = 0;
    digitalWrite(LED_PIN, LOW);
  }
  //digitalWrite(Relay, HIGH);
  //Process message here. If there is an error set an error message using getValue.setError(), e.g getValue.setError("Error message");
}

CAYENNE_IN(LED_PWM)
{
  int value = getValue.asInt(); // 0 to 255
  PWM = value;
  analogWrite(LED_PIN, value);
}

Финал 2 Версия (Cayenne out_Default):

#define CAYENNE_PRINT Serial
#include <CayenneMQTTESP8266Shield.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <virtuabotixRTC.h>

//Real+Virtual
#define LED_PIN 5
#define temp_sensor 4
#define EspSerial Serial

//Virtual
#define Power_sensor 9
#define DayPower 10
#define MonthPower 11
#define LED_PWM 12

//SSID

char ssid[] = "TP-LINK_MWNg";
char password[] = "mwngpass";

char username[] = "743674368676328742somenumbers";
char mqtt_password[] = "743674368676328742somenumbers";
char client_id[] = "743674368676328742somenumbers";

ESP8266 wifi(&EspSerial);

//Temperature setup
OneWire oneWire(4);
DallasTemperature sensors(&oneWire);

//Power sensor
const int analogInPin = A0;
int sensorValue = 0;        // value read from the pot
float MAXValue = 0;        // value output to the PWM (analog out)
float Power = 0;
int PWM = 0;

//Time
int curSec = 0;
int curMin = 0;
int curHour = 0;
int curDay = 0;
virtuabotixRTC myRTC(6, 7, 8);
unsigned PowerInDay = 0;
unsigned PowerInMonth = 0;

void setup() {
  // put your setup code here, to run once:
  sensors.begin();
  EspSerial.begin(115200);
  delay(10);
  Cayenne.begin(username, mqtt_password, client_id, wifi, ssid, password);

  pinMode(LED_PIN, OUTPUT);
  analogWrite(LED_PIN, PWM);

  curSec = myRTC.seconds;
  curMin = myRTC.minutes;
  curHour = myRTC.hours;
  curDay = myRTC.dayofmonth;

  //test

}

void loop() {
  Cayenne.loop();
  myRTC.updateTime();
  if ( curSec != myRTC.seconds ) {
    PowerInDay += Power;
    curSec = myRTC.seconds;
  }
  if (curDay != myRTC.dayofmonth) {
    PowerInMonth += PowerInDay;
    PowerInDay = 0;
    curDay = myRTC.dayofmonth;
  }
  if (curDay > myRTC.dayofmonth) {
    PowerInMonth = 0;
  }
  Serial.print(myRTC.dayofmonth);
  Serial.print('/');
  Serial.print(myRTC.month);
  Serial.print('/');
  Serial.print(myRTC.year);
  Serial.print('/');
  Serial.print(' ');
  Serial.print(myRTC.hours);
  Serial.print(':');
  Serial.print(myRTC.minutes);
  Serial.print(':');
  Serial.print(myRTC.seconds);
  Serial.print('\n');
  Serial.print(PowerInDay);
  Serial.print(' ');
  Serial.print(PowerInMonth);
  Serial.print('\n');

}

  CAYENNE_OUT_DEFAULT()
  {
  //Temp sensor-----------------------------------------
  sensors.requestTemperatures();
  Cayenne.celsiusWrite(temp_sensor, sensors.getTempCByIndex(0));
  //Temp sensor-----------------------------------------

  //Power sensor-------------------------------------------------
  sensorValue = analogRead(analogInPin);
  // map it to the range of the analog out:
  if (sensorValue > 0)
    MAXValue = sensorValue * 0.00007307;

  Power = MAXValue * ((float)PWM / (float)255) * 3.3 * ((float)PWM / (float)255);
  // change the analog out value:/

  // print the results to the serial monitor:
  Serial.print("sensor = ");
  Serial.print(sensorValue); //RAW value from analog read :)
  Serial.print("\t output = ");
  Serial.println(MAXValue * ((float)PWM / (float)255), 3); //Output the current
  Serial.print("Power =");
  Serial.println(Power, 3);
  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(50);
  Cayenne.virtualWrite(Power_sensor, Power, "pow", "w");
  //Power sensor-------------------------------------------------

  //Power Day-------------------------------------------------
  Cayenne.virtualWrite(DayPower, PowerInDay, "pow", "w");

  //Power Month-------------------------------------------------
  Cayenne.virtualWrite(MonthPower, PowerInMonth, "pow", "w");

  }

CAYENNE_IN(LED_PIN)
{
  int currentValue = getValue.asInt();
  if (currentValue == 1) {
    PWM = 255;
    digitalWrite(LED_PIN, HIGH);
  } else {
    PWM = 0;
    digitalWrite(LED_PIN, LOW);
  }
  //digitalWrite(Relay, HIGH);
  //Process message here. If there is an error set an error message using getValue.setError(), e.g getValue.setError("Error message");
}

CAYENNE_IN(LED_PWM)
{
  int value = getValue.asInt(); // 0 to 255
  PWM = value;
  analogWrite(LED_PIN, value);
}

Версия для финала 3 (Отправка данных с разницей во времени):

#define CAYENNE_PRINT Serial
#include <CayenneMQTTESP8266Shield.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <virtuabotixRTC.h>

//Real+Virtual
#define LED_PIN 5
#define temp_sensor 4
#define EspSerial Serial

//Virtual
#define Power_sensor 9
#define DayPower 10
#define MonthPower 11
#define LED_PWM 12

//SSID

char ssid[] = "TP-LINK_MWNg";
char password[] = "mwngpass";

char username[] = "743674368676328742somenumbers";
char mqtt_password[] = "743674368676328742somenumbers";
char client_id[] = "743674368676328742somenumbers";

ESP8266 wifi(&EspSerial);

//Temperature setup
OneWire oneWire(4);
DallasTemperature sensors(&oneWire);

//Power sensor
const int analogInPin = A0;
int sensorValue = 0;        // value read from the pot
float MAXValue = 0;        // value output to the PWM (analog out)
float Power = 0;
int PWM = 0;

//Time
int curSec = 0;
int curMin = 0;
int curHour = 0;
int curDay = 0;
virtuabotixRTC myRTC(6, 7, 8);
unsigned PowerInDay = 0;
unsigned PowerInMonth = 0;
int lastMillis = 0;
void setup() {
  // put your setup code here, to run once:
  sensors.begin();
  EspSerial.begin(115200);
  delay(10);
  Cayenne.begin(username, mqtt_password, client_id, wifi, ssid, password);

  pinMode(LED_PIN, OUTPUT);
  analogWrite(LED_PIN, PWM);

  curSec = myRTC.seconds;
  curMin = myRTC.minutes;
  curHour = myRTC.hours;
  curDay = myRTC.dayofmonth;

  //test

}

void loop() {
  Cayenne.loop();
  myRTC.updateTime();
  if ( curSec != myRTC.seconds ) {
    PowerInDay += Power;
    curSec = myRTC.seconds;
  }
  if (curDay != myRTC.dayofmonth) {
    PowerInMonth += PowerInDay;
    PowerInDay = 0;
    curDay = myRTC.dayofmonth;
  }
  if (curDay > myRTC.dayofmonth) {
    PowerInMonth = 0;
  }
//  Serial.print(myRTC.dayofmonth);
//  Serial.print('/');
//  Serial.print(myRTC.month);
//  Serial.print('/');
//  Serial.print(myRTC.year);
//  Serial.print('/');
//  Serial.print(' ');
//  Serial.print(myRTC.hours);
//  Serial.print(':');
//  Serial.print(myRTC.minutes);
//  Serial.print(':');
//  Serial.print(myRTC.seconds);
//  Serial.print('\n');
//  Serial.print(PowerInDay);
//  Serial.print(' ');
//  Serial.print(PowerInMonth);
//  Serial.print('\n');

 if(millis() - lastMillis > 10000 && millis() - lastMillis < 20000 ) {//Send data between 10 - 20 seconds
   //Temp sensor-----------------------------------------
  sensors.requestTemperatures();
  Cayenne.celsiusWrite(temp_sensor, sensors.getTempCByIndex(0));
  //Temp sensor-----------------------------------------
   }
 if(millis() - lastMillis > 20000 && millis() - lastMillis < 30000 ) {//Send data between 20 - 30 seconds
      //Power sensor-------------------------------------------------
  sensorValue = analogRead(analogInPin);
  // map it to the range of the analog out:
  if (sensorValue > 0)
    MAXValue = sensorValue * 0.00007307;

  Power = MAXValue * ((float)PWM / (float)255) * 3.3 * ((float)PWM / (float)255);
  // change the analog out value:/

  // print the results to the serial monitor:
  Serial.print("sensor = ");
  Serial.print(sensorValue); //RAW value from analog read :)
  Serial.print("\t output = ");
  Serial.println(MAXValue * ((float)PWM / (float)255), 3); //Output the current
  Serial.print("Power =");
  Serial.println(Power, 3);
  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(50);
  Cayenne.virtualWrite(Power_sensor, Power, "pow", "w");
  //Power sensor-------------------------------------------------

   }
 if(millis() - lastMillis > 30000 && millis() - lastMillis < 40000 ) {//Send data between 30 - 40 seconds

      //Power Day-------------------------------------------------
  Cayenne.virtualWrite(DayPower, PowerInDay, "pow", "w");
   }
 if(millis() - lastMillis > 40000 && millis() - lastMillis < 50000 ) {//Send data between 40 - 50 seconds

       //Power Month-------------------------------------------------
  Cayenne.virtualWrite(MonthPower, PowerInMonth, "pow", "w");
  lastMillis = millis();
   }

}

CAYENNE_IN(LED_PIN)
{
  int currentValue = getValue.asInt();
  if (currentValue == 1) {
    PWM = 255;
    digitalWrite(LED_PIN, HIGH);
  } else {
    PWM = 0;
    digitalWrite(LED_PIN, LOW);
  }
  //digitalWrite(Relay, HIGH);
  //Process message here. If there is an error set an error message using getValue.setError(), e.g getValue.setError("Error message");
}
CAYENNE_IN(LED_PWM)
{
  int value = getValue.asInt(); // 0 to 255
  PWM = value;
  analogWrite(LED_PIN, value);
}

Последовательное сообщение монитора:

AT
ATE0
AT+CIPMUX=1
AT+CWMODE?
AT+CWJAP="TP-LINK_MWNg","mwngpass"
[5618] Connected to WiFi
[5619] Connecting to mqtt.mydevices.com:1883
AT+CIPSTART=1,"TCP","mqtt.mydevices.com",1883
[15636] Network connect failed
AT+CIPSTART=1,"TCP","mqtt.mydevices.com",1883
AT+CIPSEND=1,40
MQIsdp
9c6b2/things/743674368676328742somenumbersAT+CIPSEND=1,16
e7f5ba423/cmd/+
AT+CIPSEND=1,40
AT+CIPSEND=1,40
AT+CIPSEND=1,40
AT+CIPSEND=1,40
1i Zv1/743674368676328742somenumbersAT+CIPSEND=1,40
6b2/things/743674368676328742somenumbersAT+CIPSEND=1,27
f5ba423/data/4temp,c=28.125sensor = 0     output = 0.000
Power =0.000
AT+CIPSEND=1,40
1g

1 Ответ

1 голос
/ 19 апреля 2020

Если ваш модуль нагревается, это, вероятно, аппаратная проблема. Я полагаю, вы используете 5 В для модуля esp, что плохо, поскольку ему нужно всего лишь 3,3 В. Он может выжить 5 В в течение короткого времени (момент), но не тяните свою удачу. Таким образом, вы должны преобразовать 5V ro 3.3V уровня. Вы не можете использовать выходной контакт 3,3 В Arduino, поскольку он не может обеспечить питание, необходимое для ESP (до 250 мА), против макс. 50 мА на контакте 3,3 В Arduino (UNO).

enter image description here

Краткое описание схемы c:

  • Вывод V CC ESP питается от выходного вывода 3,3 В регулятор напряжения (AMS1117 в grphi c).
  • Конденсатор 10 мкФ подключен к выходным контактам для стабилизации регулятора.
  • Контакт CH_PD также должен быть подключен к 3,3 В.
  • Контакт GND, очевидно, подключен к заземлению.
  • Контакт TXD ESP может быть подключен непосредственно к выводу RX. Arduino (эмулируется на выводе 6).
  • Вывод RXD ESP подключен к выводу TX Arduino (имитируется на выводе 7) через переключатель уровня.

Последние два может быть изменено в зависимости от того, используете ли вы аппаратный или программный серийный номер
РЕДАКТИРОВАТЬ
Поскольку вы используете rt c, нет смысла обновлять время каждые l oop, это приведет к sh твоя связь Либо делайте это каждые x часов и убедитесь, что если / еще запущено nochyenne l oop (). Нет смысла синхронизировать c time каждый x миллис () синхронизацию времени каждый час, достаточно для вашего сценария, я бы go раз в день

...