Stránka 1 z 1

1-Wire 18B20 a thinkspeak (invalid use of void expression)

Napsal: 30 led 2018, 18:12
od mikro_cz
Dobrý den, potřeboval bych od Vás pomoci. předem to bude určitě nějaká blbost. nejsem nějaký velký programátor. spíš se polehoučku učím.
Mám 5senzorů.Vyčrtl jsme si jejich adresy. chci podle adres vyčíst teploty a ty pak odeslat na thinkspeak.
Když sestavuju string do THS (thuinkspeak) zavolám si vypsání teploty dle adresy a pokračuju na další snímač. Ovšem při kompilaci mě to vypíše chybu viz dole. Bude to chyba o pointrech atd. ale jsem v tom holt blbej :-(
Jedu na Wemosu D1mini. V kodu je ještě pozustatek předchozího projektu (včelařské váhy) proto uspávání wifiny, a ESpčka.. to je ale bez vlivu na tuhle blbou chybu.
Snad z popisu a z kodu to bude trochu patrné.
Děkuju všem za cokoliv co mě pomůže, případně dovysvětlím co je potřeba.
Díky moc.

Kód: Vybrat vše

   
/*Kotelna*/
//new chanell : Channel ID: 412xxx
//API KEY: read : xxxx35ETOOT4RNNC
//API KEy write : xxxxxOY6SRATRK841



#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#define ONE_WIRE_BUS D7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
WiFiClient client;
ADC_MODE(ADC_VCC); 
extern "C" {
#include "user_interface.h"
}

const char* ssid = "G2_8805";
const char* password = "830xxxxx9";
const char* server = "api.thingspeak.com";
const char* api_key = "xxxxVF35ETOOT4RNNC";

DeviceAddress Probe01 = { 0x28, 0x8A, 0xB1, 0x40, 0x04, 0x00, 0x00, 0xC7 }; //Kotelzpatecka
DeviceAddress Probe02 = { 0x28, 0xCC, 0x92, 0x40, 0x04, 0x00, 0x00, 0xB6 }; //Kotelvystup
DeviceAddress Probe03 = { 0x28, 0x4D, 0x8D, 0x40, 0x04, 0x00, 0x00, 0x78 }; //Stoupacka
DeviceAddress Probe04 = { 0x28, 0x9A, 0x80, 0x40, 0x04, 0x00, 0x00, 0xD5 }; //Zpatecka
DeviceAddress Probe05 = { 0x28, 0xE1, 0xC7, 0x40, 0x04, 0x00, 0x00, 0x0D }; //3CVvstup





void setup() {
  Serial.begin(115200);
  delay(10);
  WiFi.begin(ssid, password);
  sensors.begin();
  sensors.setResolution(Probe01, 10);
  sensors.setResolution(Probe02, 10);
  sensors.setResolution(Probe03, 10);
  sensors.setResolution(Probe04, 10);
  sensors.setResolution(Probe05, 10);
}

void loop() {
 WiFi.forceSleepWake();
delay( 10 );
WiFi.mode( WIFI_STA );
WiFi.begin(ssid, password);
  delay(300);
  float vdd = (ESP.getVcc() / 1024.00f)*1.22f;
  
  sensors.requestTemperatures();

  Serial.print("Probe 01 temperature is:   ");
  printTemperature(Probe01);
  Serial.println();
  Serial.print("Probe 02 temperature is:   ");
  printTemperature(Probe02);
  Serial.println();
  Serial.print("Probe 03 temperature is:   ");
  printTemperature(Probe03);
  Serial.println();
  Serial.print("Probe 04 temperature is:   ");
  printTemperature(Probe04);
  Serial.println();
  Serial.print("Probe 05 temperature is:   ");
  printTemperature(Probe05);
  Serial.println();
  Serial.print(vdd);
  Serial.println();
  
if (client.connect(server,80)) {
Serial.println("Connect to ThingSpeak - OK"); 
 
sensors.requestTemperatures();
 
String dataToThingSpeak = "";

dataToThingSpeak+="GET /update?api_key=";
dataToThingSpeak+=api_key;
dataToThingSpeak+="&field1=";
dataToThingSpeak+=String(printTemperature(Probe01));
dataToThingSpeak+="&field2=";
dataToThingSpeak+=String(printTemperature(Probe02));
dataToThingSpeak+="&field3=";
dataToThingSpeak+=String(printTemperature(Probe03));
dataToThingSpeak+="&field4=";
dataToThingSpeak+=String(printTemperature(Probe04));
dataToThingSpeak+="&field5=";
dataToThingSpeak+=String(printTemperature(Probe05));
dataToThingSpeak+=" HTTP/1.1\r\nHost: a.c.d\r\nConnection: close\r\n\r\n";
dataToThingSpeak+="";
client.print(dataToThingSpeak);
Serial.println(dataToThingSpeak);

}

 while(client.available()){
    String line = client.readStringUntil('\r');
  Serial.print(line);
  }
   
Serial.println(".....");
WiFi.disconnect();
delay(2);
Serial.println("Wifi disconnect");
WiFi.mode(WIFI_OFF);
delay(2);
Serial.println("Wifi OFF");
WiFi.forceSleepBegin();
Serial.println("Force sleep begin");
delay(2);
Serial.println("Spanek 5sec");

delay(10000*10); //  10 sec

}
void printTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);
   }
   
   
Chyba :

C:\Users\Nehet\Desktop\Kotelna\Kotelna.ino: In function 'void loop()':

Kotelna:94: error: invalid use of void expression

dataToThingSpeak+=String(printTemperature(Probe01));

^

Kotelna:96: error: invalid use of void expression

dataToThingSpeak+=String(printTemperature(Probe02));

^

Kotelna:98: error: invalid use of void expression

dataToThingSpeak+=String(printTemperature(Probe03));

^

Kotelna:100: error: invalid use of void expression

dataToThingSpeak+=String(printTemperature(Probe04));

^

Kotelna:102: error: invalid use of void expression

dataToThingSpeak+=String(printTemperature(Probe05));
^

exit status 1
invalid use of void expression

Re: 1-Wire 18B20 a thinkspeak (invalid use of void expression)

Napsal: 30 led 2018, 18:34
od martinius96
očakávaš nejakú premennú, ale funkcia je typu void, nevracia žiadnu hodnotu.
Možno máš novšiu knižnicu akú si mal a je to tam pozmenené, možno musíš kód navrhnúť nanovo a inak.

Re: 1-Wire 18B20 a thinkspeak (invalid use of void expression)

Napsal: 30 led 2018, 21:10
od pavel1tu
A proč nepoužíváš knihovnu ThingSpeak.h která umí zapisovat pomocí funkce ThingSpeak.writeField ?

Je dávno co jsem to zkoušel, ale má dojem že jsem to dělal takhle "ThingSpeak.writeField(myChannelNumber, 1, voltage, myWriteAPIKey);"
Dělal jsem to přímo podle knihovny a příkladu z ní

Nemám to ale jak vyzkoušet.

Re: 1-Wire 18B20 a thinkspeak (invalid use of void expression)

Napsal: 30 led 2018, 22:38
od ohruska
Zdravím.
Zkusil jsem ten tvůj kód na zkoušku zjednodušit a ono nic.

Kód: Vybrat vše

#include <DallasTemperature.h>

DeviceAddress Probe01 = { 0x28, 0x8A, 0xB1, 0x40, 0x04, 0x00, 0x00, 0xC7 }; //Kotelzpatecka
//float tempC;
void setup() {
  // put your setup code here, to run once:
    Serial.begin(9600);
    Serial.print("Probe 01 temperature is:   ");
    printTemperature(Probe01);
    Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:
}
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = 25.254;
}
Na výpisu bylo toto :
Probe 01 temperature is:
Ale jak ti psal kolega
očakávaš nejakú premennú, ale funkcia je typu void, nevracia žiadnu hodnotu.
Je to třeba upravit, "void" změnit na funkci "float" a doplnit co má funkce vracet, "return tempC;" A ještě upravit výpis na obrazovku printTemperature(Probe01); na "Serial.print(printTemperature(Probe01));"

Kód: Vybrat vše

#include <DallasTemperature.h>

DeviceAddress Probe01 = { 0x28, 0x8A, 0xB1, 0x40, 0x04, 0x00, 0x00, 0xC7 }; //Kotelzpatecka
//float tempC;
void setup() {
  // put your setup code here, to run once:
    Serial.begin(9600);
    Serial.print("Probe 01 temperature is:   ");
    Serial.print(printTemperature(Probe01));
    Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:

}

float printTemperature(DeviceAddress deviceAddress)
{

float tempC = 25.254;
return tempC;
}
Na výpisu se objeví toto :
Probe 01 temperature is: 25.25
Pak by mělo fungovat i odesílání hodno na server. "dataToThingSpeak+=String(printTemperature(Probe01));"

Re: 1-Wire 18B20 a thinkspeak (invalid use of void expression)

Napsal: 01 úno 2018, 20:25
od afilip
To je celé nějaké divné.
Načtěte si na začátku všech 5 teplot do proměnných float teplota1 až teplota5 pomocí requestTemperatures,

převeďte to na string
char buf[25];
String strTeplota1 = dtostrf(teplota1, 5, 2, buf);
String strTeplota2 = dtostrf(teplota2, 5, 2, buf);
atd.

a potom ten string bude vypadat
dataToThingSpeak+="&field1=";
dataToThingSpeak+=String(strTeplota1));
dataToThingSpeak+="&field2=";
dataToThingSpeak+=String(strTeplota2));
atd.

Re: 1-Wire 18B20 a thinkspeak (invalid use of void expression)

Napsal: 14 úno 2018, 21:37
od mikro_cz
Zdravím,
Děkuji všem. Vyřešil sem to : return tempC a jsem funkční.
Děkuju všem za pomoc.