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, но он все равно не работает, так что я все еще в тупике :/

, 👍0


2 ответа


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 В как логический «высокий». Вам нужен делитель напряжения или преобразователь логического уровня между ними.

,

1

Эта инструкция делает часть TMP36 очень похожей, используя tempPin=0 вместо 2,
Я бы попробовал этот код, поскольку отрицательного значения быть не должно, если вы измеряете температуру в помещении и TMP36 неисправен.

Согласно этим кривым

Диаграмма TMP35/36/37

и таблица из паспорта TMP35/36/37 Технические характеристики TMP35/36/37

Вы должны измерить 700-750 мВ (с VS 3V)

,