Wemos D1R2 - переход Onewire 2 DS18B20 на переменную
Я новичок, провел несколько тестов с Uno, и теперь у меня в руках Wemos D1R2... Я создаю что-то вроде метеостанции, которая будет отправлять данные на Thingspeak.com и регистрировать эти данные там. Мне удалось объединить 2 примера вместе (1 для отправки данных в ThingsSpeak) и (1 для чтения 1 DS18B20 с помощью onewire) Теперь мне нужно подключить 2 или более датчиков DS18B20 к одной и той же шине Onewire BUS (мне также удалось сделать это с помощью этого руководства http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20#mult ), на последовательном мониторе показания идут нормально, но когда я пытаюсь отправить показания на вещи, я получаю сообщение об ошибке:
temp_logger_multime_sensors_2:174: ошибка: оператор не может разрешить адрес перегруженной функции
Serial.print printTemperature(Probe01);
Мой фрагмент кода:
/* References
Данные датчика DHT11 для Thingspeak с использованием Wemos D1
http://www.esp8266learning.com/dht11-sensor-data-to-thingspeak-using-a-wemos-d1.php#codesyntax_3
Руи Сантос - Полная информация о проекте на http://randomnerdtutorials.com
Несколько датчиков температуры YourDuino DS18B20 на 1 проводе
http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20#mult
V1.01 17.01.2013 ...на основе примеров Рика Кретцингера
*/
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// замените ключом API вещей вашего канала, вашим SSID и паролем
String apiKey = "THINGSPEAKKEY";
const char* ssid = "WIFINAME";
const char* password = "WIFIPASSWORD";
const char* server = "api.thingspeak.com";
/*-----( Declare Constants and Pin Numbers )-----*/
#define ONE_WIRE_BUS_PIN 5
/*-----( Declare objects )-----*/
// Настройка экземпляра oneWire для связи с любыми устройствами OneWire
OneWire oneWire(ONE_WIRE_BUS_PIN);
// Передаем нашу ссылку oneWire в Dallas Temperature.
DallasTemperature sensors(&oneWire);
DeviceAddress Probe01 = { 0x28, 0xFF, 0x51, 0xA5, 0x61, 0x16, 0x03, 0x92 }; // зонд 1
DeviceAddress Probe02 = { 0x28, 0xFF, 0xF8, 0x99, 0x52, 0x16, 0x04, 0xB1 }; // зонд 2
WiFiClient client;
void setup() /****** SETUP: RUNS ONCE ******/
{
// запускаем последовательный порт для отображения результатов
Serial.begin(115200);
delay(10);
/* Serial.begin(9600);
Serial.print("Initializing Temperature Control Library Version ");
Serial.println(DALLASTEMPLIBVERSION);
*/
// Инициализируем библиотеку измерения температуры
sensors.begin();
WiFi.begin(ssid, password);
// Подключение к сети Wi-Fi
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected on IP ...");
// Печать IP-адреса ESP
Serial.println(WiFi.localIP());
}
/*-----( Declare User-written Functions )-----*/
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00)
{
Serial.print("Error getting temperature ");
}
else
{
Serial.print(tempC);
}
}// Конечная температура печати
void loop() /****** LOOP: RUNS CONSTANTLY ******/
{
delay(1000);
Serial.println();
Serial.print("Number of Devices found on bus = ");
Serial.println(sensors.getDeviceCount());
Serial.print("Getting temperatures... ");
Serial.println();
// Даем команду всем устройствам на шине считать температуру
sensors.requestTemperatures();
float StrProbe01 = printTemperature(Probe01); //ДУМАЙТЕ, ПРОБЛЕМА ЗДЕСЬ
float StrProbe02 = printTemperature(Probe02); //И ТУТ
Serial.print("Probe 01 temperature is: ");
printTemperature(Probe01); //<-- ЭТА ЧАСТЬ РАБОТАЕТ
Serial.println();
Serial.print("Probe 02 temperature is: ");
printTemperature(Probe02);
Serial.println();
if (client.connect(server,80)) {
String postStr = apiKey;
postStr +="&field1=";
postStr += float(StrProbe01);
postStr +="&field2=";
postStr += float(StrProbe02);
postStr += "\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: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
Serial.print("Temperature: ");
Serial.print printTemperature(Probe01);
Serial.print(" degrees Celsius Humidity: ");
Serial.print printTemperature(Probe02);
Serial.println("Sending data to Thingspeak");
}
client.stop();
Serial.println("Waiting 20 secs");
// вещам требуется как минимум 15-секундная задержка перед обновлением
// 20 секунд на всякий случай
delay(20000);
}//--(конец основного цикла)---
Я подозреваю, что сначала мне нужно преобразовать printTemperature(Probe01);
в переменную (как вы можете видеть в коде) и использовать эту переменную в postStr += StrProbe01;
как, но я пытался, как вы можете видеть в коде, и это тоже не сработало.
* ОБНОВЛЕНИЕ * Приведенный ниже код отлично работает при отправке данных в Thingspeak и последовательный монитор с 1 DS18B20
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// замените ключом API вещей вашего канала, вашим SSID и паролем
String apiKey = "THINGSPEAKKEY";
const char* ssid = "WIFINAME";
const char* password = "WIFIPASSWORD";
const char* server = "api.thingspeak.com";
const char* t2 = "5";
const char* h2 = "12.34";
//НАЧАТЬ DS18B20 Материалы
// Провод данных подключается к контакту D1 на ESP8266 12-E — GPIO 5
#define ONE_WIRE_BUS 5 // вывод DS18B20
// Настройте экземпляр oneWire для связи с любыми устройствами OneWire (не только с микросхемами температуры Maxim/Dallas)
OneWire oneWire(ONE_WIRE_BUS);
// Передаем нашу ссылку oneWire в Dallas Temperature.
DallasTemperature DS18B20(&oneWire);
char temperatureCString[6];
char temperatureFString[6];
//КОНЕЦ материала DS18B20
WiFiClient client;
void setup()
{
Serial.begin(115200);
delay(10);
// dht.begin();
DS18B20.begin(); // IC по умолчанию 9 бит. Если у вас возникли проблемы, подумайте о том, чтобы увеличить его. 12. Увеличивает задержку, давая ИС больше времени для обработки измерения температуры.
WiFi.begin(ssid, password);
// Подключение к сети Wi-Fi
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected on IP ...");
// Печать IP-адреса ESP
Serial.println(WiFi.localIP());
}
void getTemperature() {
float tempC;
float tempF;
do {
DS18B20.requestTemperatures();
tempC = DS18B20.getTempCByIndex(0);
dtostrf(tempC, 2, 2, temperatureCString);
tempF = DS18B20.getTempFByIndex(0);
dtostrf(tempF, 3, 2, temperatureFString);
delay(100);
} while (tempC == 85.0 || tempC == (-127.0));
}
// выполняется снова и снова
void loop()
{
getTemperature();
if (client.connect(server,80)) {
String postStr = apiKey;
postStr +="&field1=";
postStr += String(temperatureCString);
postStr +="&field2=";
postStr += String(temperatureFString);
postStr += "\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: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
Serial.print("Temp in C: ");
Serial.print(temperatureCString);
Serial.print(" and Temp in F: ");
Serial.print(temperatureFString);
Serial.println("Sending data to Thingspeak");
}
client.stop();
Serial.println("Waiting 20 secs");
// вещам требуется как минимум 15-секундная задержка перед обновлением
// 20 секунд на всякий случай
delay(20000);
}
И этот код отлично работает, отображая 2 DS18B20 на последовательном мониторе, подключенном к 1 шине Onewire BUS, но мне нужно реализовать (раскомментировать) часть, связанную с вещами.
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// замените ключом API вещей вашего канала, вашим SSID и паролем
String apiKey = "THINGSPEAKKEY";
const char* ssid = "WIFINAME";
const char* password = "WIFIPASSWORD";
const char* server = "api.thingspeak.com";
/*-----( Declare Constants and Pin Numbers )-----*/
#define ONE_WIRE_BUS_PIN 5
/*-----( Declare objects )-----*/
// Настройка экземпляра oneWire для связи с любыми устройствами OneWire
OneWire oneWire(ONE_WIRE_BUS_PIN);
// Передаем нашу ссылку oneWire в Dallas Temperature.
DallasTemperature sensors(&oneWire);
DeviceAddress Probe01 = { 0x28, 0xFF, 0x51, 0xA5, 0x61, 0x16, 0x03, 0x92 }; // зонд 1
DeviceAddress Probe02 = { 0x28, 0xFF, 0xF8, 0x99, 0x52, 0x16, 0x04, 0xB1 }; // зонд 2
WiFiClient client;
void setup() /****** SETUP: RUNS ONCE ******/
{
// запускаем последовательный порт для отображения результатов
Serial.begin(115200);
delay(10);
// Инициализируем библиотеку измерения температуры
sensors.begin();
WiFi.begin(ssid, password);
// Подключение к сети Wi-Fi
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected on IP ...");
// Печать IP-адреса ESP
Serial.println(WiFi.localIP());
} //--(конец настройки)---
/*-----( Declare User-written Functions )-----*/
void printTemp(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00)
{
Serial.print("Error getting temperature ");
}
else
{
Serial.print(tempC);
}
}// Конец времени печати
void loop() /****** LOOP: RUNS CONSTANTLY ******/
{
delay(1000);
Serial.println();
Serial.print("Number of Devices found on bus = ");
Serial.println(sensors.getDeviceCount());
Serial.print("Getting temperatures... ");
Serial.println();
// Даем команду всем устройствам на шине считать температуру
sensors.requestTemperatures();
Serial.print("Probe 01 temperature is: ");
printTemp(Probe01);
Serial.println();
Serial.print("Probe 02 temperature is: ");
printTemp(Probe02);
Serial.println();
/*
if (client.connect(server,80)) {
String postStr = apiKey;
postStr +="&field1=";
postStr += float(StrProbe01);
postStr +="&field2=";
postStr += float(StrProbe02);
postStr += "\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: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
Serial.print("Temperature: ");
Serial.print printTemp(Probe01);
Serial.print(" degrees Celsius Humidity: ");
Serial.print printTemp(Probe02);
Serial.println("Sending data to Thingspeak");
}
client.stop();
Serial.println("Waiting 20 secs");
// вещам требуется как минимум 15-секундная задержка перед обновлением
// 20 секунд на всякий случай
delay(20000);
*/
}//--(конец основного цикла)---
Все, что нужно сделать, это сгенерировать своего рода переменную (возможно, float , я не уверен) и передать ее как строку http
Спасибо
@Diego, 👍0
Обсуждение4 ответа
Поскольку переменные DeviceInformation не являются POD (обычными старыми данными), было бы немного эффективнее использовать ссылки или указатели, это позволит избежать их копирования. Если вы сделаете это, вы можете сделать глобальные переменные Probe01 и Probe02 постоянными переменными.
В цикле вокруг строки 98 вы вызываете printTemperature() и присваиваете возвращаемое значение веществу с плавающей запятой. Что очень странно, потому что в строке 72 вы определяете void printTemperature()
. Поэтому я подозреваю, что в вызове библиотеки Dalas может быть функция printTemperature, которая возвращает число с плавающей запятой, и это перегруженная функция, о которой идет речь.
Поэтому, чтобы исправить это, измените имя вашей функции printTemperature и измените две строки, в которых она вызывается. Надеюсь, это решит эту проблему.
Спасибо @Matt, но, как я уже сказал, я начинаю с мира C и Arduino, я едва ли объединяю образцы из Интернета и пытаюсь заставить их работать :) Я обновил свой пост, указав 2 кода, которые я запустил, 1 код считывает ОДИН датчик температуры и отображает его на последовательном мониторе, а также отправляет на платформу Thingspeak. другой код может считывать 2 датчика на одной шине, но мне не удается получить эти 2 показания для отправки через вещи., @Diego
Возможно, можно использовать нотацию :: для уточнения printTemperature()
, т.е. для указания используемого пространства имен. См., например, [пространство имен](http://en.cppreference.com/w/cpp/language/namespace) и [поиск имени](http://en.cppreference.com/w/cpp/language/lookup) на странице cppreference. .com, @James Waldby - jwpat7
Ответьте на ваше редактирование: я бы создал новый проект и поместил в настройку только закомментированный код (и минимум, необходимый для его работы), а затем опубликовал проблемы, с которыми вы столкнулись.
Я не вижу никаких проблем с компиляцией, но данные, которые вы отправляете в Thingspeak, выглядят неправильно. Я думаю, что вы отправляете:
String postStr = apiKey + "&field1=" + float(StrProbe01) + "&field2=" + float(StrProbe02) + "\r\n\r\n";
И я думаю, вам следует отправить:
String postStr = "field1=" + float(StrProbe01) + "&field2=" + float(StrProbe02) + "\r\n\r\n";
(На основе этого примера Arduino.cc)
В работающем коде у вас есть:
if (client.connect(server,80)) {
String postStr = apiKey;
postStr +="&field1=";
postStr += String(temperatureCString);
postStr +="&field2=";
postStr += String(temperatureFString);
postStr += "\r\n\r\n";
В коде, который не работает, вы делаете следующее:
if (client.connect(server,80)) {
String postStr = apiKey;
postStr +="&field1=";
postStr += float(StrProbe01);
postStr +="&field2=";
postStr += float(StrProbe02);
postStr += "\r\n\r\n";
Распечатайте обе отправляемые вами строки, postStr, используя Serial.print. Сравните результат. Меня сейчас нет дома, чтобы попробовать, но я уверен, что значения float(StrProbe01) и float(StrProbe02) неверны. В своих рекомендациях Thingspeak объясняет, как должна выглядеть отправляемая вами строка.
Попробуйте вернуть float из printTemp:
/*-----( Declare User-written Functions )-----*/
float printTemp(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00)
{
Serial.print("Error getting temperature ");
}
/* else
{
Serial.print(tempC);
}
*/ you won't be needing this
return tempC;
}// Конец времени печати
И назовите его так же, как в своем примере с комментариями. Подозреваю, что это не самый эффективный способ, но он должен сработать.
- Как читать и записывать EEPROM в ESP8266
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Как определить размер Flash?
- Несколько клиентских серверов через Wi-Fi
- Передача функции-члена класса в качестве аргумента
- В ESP-12E NodeMCU, какой выход PIN A0?
- Esp8266 Vin контакт
Ваш вопрос значительно выиграл бы от [http://stackoverflow.com/help/mcve] (минимальный, полный, проверяемый пример), поскольку проблема, с которой вы столкнулись, связана с кодом, который вы не опубликовали. Также было бы полезно опубликовать версию (опять же, минимальную, полную и поддающуюся проверке), которая работает., @Mark Smith
@MarkSmith извините за это, я пытался сократить код, но получить, что это было бы трудно смоделировать ... вот весь код (я пытался очистить как можно больше), проблема начинается после
sensors.requestTemperatures();
когда Добавляю раздел Thingspeak, @Diego