У меня есть проект, в котором я использую Arduino для сбора данных с датчиков из двух источников, а затем отправляю их в ESP8266, используя TX-> RX и RX-> TX. Поскольку я использую AutoConnect для подключения ESP к WiFi, я не могу использовать AT Commands и SoftwareSerial.
Мне удалось подключить ESP к Wi-Fi и отправить информацию в ThingSpeak, введя имя и пароль Wi-Fi, а также ключ API записи ThingSpeak и сохранив их в EPROM ESP. Затем я отправляю информацию датчика от Arduino на ESP в виде строки, используя следующий код.
const int batteryInPin = A1;
sensorBatValue = analogRead(batteryInPin);
sensorOutValue = map(sensorBatValue,0,1024,0,225);
const int waterInPin = A3;
int waterSensorInValue;//reading our water lever sensor
int waterSensorOutValue;//conversion of water sensor value
waterSensorInValue = analogRead(waterInPin);
waterSensorOutValue = map(waterSensorInValue,0,1024,0,225);
f = String('<')+String("Hi")+String(',')+String(waterSensorOutValue)+String(',')+String(sensorBatValue)+String('>');
Serial.print(f);
Затем я использую следующий код, чтобы получить информацию о ESP и отправить ее в ThingSpeak
const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars];
char messageFromPC[numChars] = {0};
int floatFromPC = 0;
int floatFromPC2 = 0;
boolean newData = false;
char Password[36]="";
long itt = 500;
long itt2 = 500;
recvWithStartEndMarkers();
if (newData == true) {
strcpy(tempChars, receivedChars);
// this temporary copy is necessary to protect the original data
// because strtok() used in parseData() replaces the commas with \0
parseData();
showParsedData();
newData = false;
}
long itt =floatFromPC;
long itt2 = floatFromPC2;
long itt =floatFromPC;
long itt2 = floatFromPC2;
EEPROM.begin(512);
Serial.println(""); //Goto next line, as ESP sends some garbage when you reset it
Serial.print(char(EEPROM.read(addr))); //Read from address 0x00
addr++; //Increment address
Serial.print(char(EEPROM.read(addr))); //Read from address 0x01
addr++; //Increment address
Serial.println(char(EEPROM.read(addr))); //Read from address 0x02
//Read string from eeprom
String www;
//Here we dont know how many bytes to read it is better practice to use some terminating character
//Lets do it manually www.circuits4you.com total length is 20 characters
for(int i=0;i<16;i++)
{
www = www + char(EEPROM.read(0x0F+i)); //Read one by one with starting address of 0x0F
}
Serial.print(www); //Print the text on serial monitor
if (client.connect(defaultHost,80))
{ // "184.106.153.149" or api.thingspeak.com
itt++; //Replace with a sensor reading or something useful
String postStr = www;
postStr +="&field1=";
postStr += String(itt);
postStr +="&field2=";
postStr += String(itt2);
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");
}
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'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
//============
void parseData() { // split the data into its parts
char * strtokIndx; // this is used by strtok() as an index
strtokIndx = strtok(tempChars,","); // get the first part - the string
strcpy(messageFromPC, strtokIndx); // copy it to messageFromPC
strtokIndx = strtok(NULL, ","); // this continues where the previous call left off
floatFromPC = atoi(strtokIndx); // convert this part to an integer
strtokIndx = strtok(NULL, ",");
floatFromPC2 = atoi(strtokIndx); // convert this part to a float
}
//============
void showParsedData() {
Serial.print("Message ");
Serial.println(messageFromPC);
Serial.print("Float ");
Serial.println(floatFromPC);
Serial.print("Float ");
Serial.println(floatFromPC2);
}
Как я уже сказал, я не использую AT-команды для отправки этого в ThingSpeak.
Сначала я отлично работал на Arduino Uno R3, но решил перейти на Arduino Pro Mini из-за размера и предполагаемой энергоэффективности.
Однако теперь, когда Arduino Pro Mini подключен к ESP с тем же кодом и той же проводкой, он НЕ РАБОТАЕТ. [Code] [/ code]
Нужно ли использовать какой-то другой код, чтобы заставить его работать? ESP позволяет мне вводить информацию и подключаться к Wi-Fi, а также отправляет информацию в ThingSpeak в соответствующее время. Я не знаю, отправляется ли информация в ESP с Arduino Pro Mini, но я не вижу мигающий индикатор, когда предполагается отправка строки f. Я получаю 1 значение в публикации для уровня воды и 0 для уровня заряда батареи на ThingSpeak.
Любые идеи будут с благодарностью.