TMP36 не работает с Arduino Uno?
У меня есть Arduino Uno, подключенный к TMP36 и ESP8266 для отправки показаний температуры в PHP-файл, который получает запрос POST и сохраняет его в текстовом файле.
ESP8266 и PHP работают отлично, и я в этом уверен. Но температура, которую получает мой код, просто смехотворна и сильно меняется. Я приложу свой код и набросок Fritzing и URL к data.txt (вы можете видеть результаты в реальном времени). Это может быть проблема с моим кодом или что-то еще, я не уверен, что я возился с этим безуспешно, и, надеюсь, свежий взгляд поможет.
Большая часть кода — копипаст, поскольку я никогда раньше не использовал ESP8266.
#include "SoftwareSerial.h"
String ssid ="correctssid";
String password="correctpwd";
float val=0;
int temppin = 2;
float volts=0.0;
float tempC=0.0;
SoftwareSerial esp(6, 7);
String data;
String server = "www.elijahdur.co.uk";
String url = "/arduino/esp8266/file.php"; //Я изменил это просто потому, что
void setup() {
esp.begin(9600);
Serial.begin(9600);
reset();
connectWifi();
}
void reset() {
esp.println("AT+RST");
delay(1000);
if(esp.find("OK") ){
Serial.println("Module Reset");
}
}
void connectWifi() {
String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";
esp.println(cmd);
delay(4000);
if(esp.find("OK")) {
Serial.println("Connected!");
}
else {
connectWifi();
Serial.println("Cannot connect to wifi");
}
}
void loop () {
val = analogRead(temppin);
volts = val * 5.0;
volts /= 1024.0;
tempC = (volts - 0.5) * 100;
String string = (String) tempC;
data = "data=" + string;
httppost();
delay(30000);
}
void httppost () {
esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//запускаем TCP-соединение.
if( esp.find("OK")) {
Serial.println("TCP connection ready");
}
delay(1000);
String postRequest =
"POST " + url + " HTTP/1.0\r\n" +
"Host: " + server + "\r\n" +
"Accept: *" + "/" + "*\r\n" +
"Content-Length: " + data.length() + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"\r\n" + data;
String sendCmd = "AT+CIPSEND=";//определяем количество отправляемых символов.
esp.print(sendCmd);
esp.println(postRequest.length());
delay(500);
if(esp.find(">")) {
Serial.println("Sending..");
esp.print(postRequest);
}
if( esp.find("SEND OK")) {
Serial.println("Packet sent");
}
while (esp.available()) {
String tmpResp = esp.readString();
Serial.println(tmpResp);
}
esp.println("AT+CIPCLOSE");
}
Текстовый файл находится по адресу http://elijahdur.co.uk/arduino/esp8266/data.txt
Иногда он сразу выдает -50, и это потому, что он считывает 0 и отнимает 5 В от аналогового сигнала.
Любая помощь будет высоко оценена, спасибо!
ПРАВКА: Извините, но я перепутал датчики и использовал LM35, но он все равно не работает, так что я все еще в тупике :/
@Elijah D-R, 👍0
2 ответа
Во-первых, как общий совет по отладке: всегда используйте минимальный пример, чтобы проверить только один компонент и убедиться, что он работает. Вам следовало бы протестировать датчик температуры отдельно, а затем соединение ESP8266 WiFi.
Во-вторых, относительно этого кода:
/* как глобальная переменная */
float val=0;
void loop () {
val = analogRead(temppin);
volts = val * 5.0;
volts /= 1024.0;
tempC = (volts - 0.5) * 100;
String string = (String) tempC;
data = "data=" + string;
httppost();
delay(30000);
}
Строка String string = (String) tempC;
выглядит для меня очень подозрительно. Вы приводите float
к объекту String
, т.е. вы переинтерпретируете его с помощью оператора приведения. Это не должно работать, потому что float
не является объектом String
.
Что должно сработать, так это создание нового объекта String
с помощью его конструктора, т. е. write
String string(tempC);
Если это не работает, используйте скетч по адресу https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor, измените sensorPin на 2
, дважды проверьте проводку и удалите ESP8266.
И третье замечание: вы подключаете TX вашего Arduino напрямую к RX-контакту ESP8266, согласно вашей схеме. Это повредит модуль ESP8266, поскольку это устройство 3,3 В и должно получать только сигналы 3,3 В — ваш Arduino Uno выдает 5 В как логический «высокий». Вам нужен делитель напряжения или преобразователь логического уровня между ними.
Эта инструкция делает часть TMP36 очень похожей, используя tempPin=0 вместо 2,
Я бы попробовал этот код, поскольку отрицательного значения быть не должно, если вы измеряете температуру в помещении и TMP36 неисправен.
Согласно этим кривым
и таблица из паспорта TMP35/36/37
Вы должны измерить 700-750 мВ (с VS 3V)
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Отправка данных о температуре и почве с использованием esp8266-01 через software serial
- AT-команда не отвечает на последовательный монитор
- Отправка данных Arduino в MySQL с помощью phpMyAdmin и XAMPP на Windows10
- Arduino выводит значения мусора на serial monitor с ESP8266
- ошибка: espcomm_upload_mem failed при загрузке скетча
- фатальная ошибка ESP8266WiFi.h: Такого файла или каталога нет
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino