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 В как логический «высокий». Вам нужен делитель напряжения или преобразователь логического уровня между ними.
Спасибо, при редактировании я использовал LM35 (извините), но он всё равно не работает, и я получаю такие результаты, как https://hastebin.com/isifakiwef.ini. То есть с интервалом в 5 секунд, и они, похоже, просто прыгают между 0 и 40?, @Elijah D-R
Я поменял несколько кабелей, и теперь у меня постоянно 120°C. Что, чёрт возьми, происходит? Я думал, что это градусы Фаренгейта, но там всё ещё 46°C?, @Elijah D-R
@ElijahD-R Вы меняли GND и VCC? Обратная полярность выводит датчик из строя. Похоже, вы запутались в своём датчике. Вы точно уверены, что это LM35, а не TMP36? Можете отредактировать вопрос, добавив картинку и текущий код? [Этот пример скетча] (http://www.instructables.com/id/ARDUINO-TEMPERATURE-SENSOR-LM35/) работает?, @Maximilian Gerhardt
Я хочу сказать, что, вероятно, в какой-то момент я перепутал полярность... Пора искать новый датчик температуры, есть какие-нибудь рекомендации?, @Elijah D-R
Подойдёт практически любой датчик температуры с маркировкой «Arduino», если у вас нет особых требований к диапазону температур или точности. Возможно, вам подойдёт что-то вроде DHT11 или DHT22? Ваш старый датчик тоже подойдёт, просто убедитесь, что у вас всё правильно подключено, и для начала запустите минимальную тестовую программу., @Maximilian Gerhardt
Если вам не нужна плата Arduino для обучения, вы можете просто приобрести модуль для [ESP8266-01 с DHT-11](https://www.ebay.com/itm/DHT11-Temperature-Humidity-WIFI-Wireless-Transceiver-Module-ESP8266-ESP-01-01S/202140645418?_trkparms=aid%3D222007%26algo%3DSIM.MBE%26 ao%3D2%26asc%3D50544%26meid%3D8a7a0142fac8437abdbd5483e40d9fd8%26pid%3D100623%26rk%3D2%26rkt%3D6%26sd%3D391909016701%26itm%3D202140645418&_trksid=p2047675.c100623.m-1) менее чем за 5 долларов и напрямую запрограммировать ESP8266, @LotPings
Эта инструкция делает часть TMP36 очень похожей, используя tempPin=0 вместо 2,
Я бы попробовал этот код, поскольку отрицательного значения быть не должно, если вы измеряете температуру в помещении и TMP36 неисправен.
Согласно этим кривым

и таблица из паспорта TMP35/36/37

Вы должны измерить 700-750 мВ (с VS 3V)
Ваш комментарий внезапно частично исчез. Если возвращаемое напряжение ниже ожидаемого, может ли это быть датчик TMP35/37, а не TMP36?, @LotPings
Извините, я только что заметил, что это LM35, а лист, который мне дали вместе с посылкой, был неверным (это был комплект, и в моей коробке было указано TMP36, а на сайте — LM35)., @Elijah D-R
Сейчас я использую код LM35, но все еще получаю колебания? https://hastebin.com/okakudifel.makefile Первое число — это число, записанное analogRead, а второе — результат умножения его на 0,48828125., @Elijah D-R
Аналоговый считыватель должен возвращать целое число от 0 до 1023 для напряжений от 0 до 5 В. Диаграмма построена для напряжения 3 В. Что показывают показания при выводе в последовательный порт?, @LotPings
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Отправка данных о температуре и почве с использованием esp8266-01 через software serial
- AT-команда не отвечает на последовательный монитор
- Arduino выводит значения мусора на serial monitor с ESP8266
- Отправка данных Arduino в MySQL с помощью phpMyAdmin и XAMPP на Windows10
- ошибка: espcomm_upload_mem failed при загрузке скетча
- фатальная ошибка ESP8266WiFi.h: Такого файла или каталога нет
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
Вы тестировали датчик температуры отдельно, без ESP8266?, @Craig