praegune kellaaeg 20.06.2024 03:41:52
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
Terror
HV veteran
liitunud: 08.11.2001
|
27.10.2020 09:11:59
Arduino koodi bug (jookseb kokku) |
|
|
Keskkütte juhtimiseks on tehtud automaatika mis lülitab 2'te pumpa vastavalt temperatuuridele.
Eile üritasin sinna MQTT funktsionaalsuse lisada, kuid asi lõppes sellega, et asi jookseb kokku, kui saata üle MQTT käsklus "ON" (Kui koodis oli ees check: if(radikaC > 39){ siis ta mingil põhjusel sinna IF sisse ka ei jõudnud MQTT callbackis. Kui see ära võtta jooksis kokku).
Samas üle ühe veebiliidese juhtimine funktsioonis int MobileSwitch(String command) töötab juba aastaid.
Ehk kellelgi hakkab silma mille vastu olen eksinud.
Kogu kood:
Spoiler
SYSTEM_THREAD(ENABLED);
#include "mqtt.h"
#include "analogSmooth.h"
#include <LiquidCrystal_I2C_Spark.h>
#include <TimeAlarms.h>
#undef now();
float callback(char* topic, byte* payload, unsigned int length);
byte server[] = { 192,168,1,223 };
MQTT client(server, 1883, callback);
String writeAPIKey = "XXX";
String channelID = "XXX";
TCPClient Xclient;
int ledRed = A4; // A4 -- A0 if ON then indicates that there is 230V present and boiler pump is OFF
int ledGreen = A5; // A5 -- A1 is ON then boiler pump is ON
int radikatemp = A6; //A6 --A2
int toatemp = A0; //A0 -- A3
int pliiditemp = A1; //A1 -- A4
int pliidiveetemp = A2; //A2 -- A5
int xtemp = A3; //A3 --A6
int relayRadiator = D2; //relay to turn ON/OFF radiator pump
int relayBoiler = D3; // relay to turn ON/OFF boiler pump.
int c = 0;
int d = 0;
int aeg = 0;
int secs = 0;
int mins=0;
int hours=0;
LiquidCrystal_I2C *lcd;
//UDP UDPClient;
String timeStr;
AnalogSmooth as100 = AnalogSmooth(10);
AnalogSmooth as101 = AnalogSmooth(30);
AnalogSmooth as102 = AnalogSmooth(10);
AnalogSmooth as103 = AnalogSmooth(10);
float radikaC = 0.0;
float toaC = 0.0;
float pliidiC = 0.0;
float pliidiveeC = 0.0;
float xtempC = 0.0;
int toggleDelay = 5;
int toggleLCDState = 1;
int previousNow = 0;
int previousNow2 = 0;
int ForceState = 0;
float callback(char* topic, byte* payload, unsigned int length) {
char p[length + 1];
memcpy(p, payload, length);
p[length] = NULL;
Serial.println("callback...");
if (!strcmp(p, "ON")){
if(radikaC > 39){
previousNow2 = Time.now();
ForceState = 1;
}
}
if (!strcmp(p, "OFF")){
previousNow2 = Time.now();
ForceState = -1;
}
if (!strcmp(p, "AUTO")){
ForceState = 0;
}
}
void setup(){
// Particle.function("Radikapump",MobileSwitch);
Time.zone(+2);
Alarm.alarmRepeat(8,30,0, MorningAlarm); // 8:30am every day
Alarm.timerRepeat(400, Repeats2);// timer for every 400 seconds
Alarm.timerOnce(10, OnceOnly); // called once after 10 seconds
Serial.begin(9600);
lcd = new LiquidCrystal_I2C(0x27, 20, 4); // set the LCD address to 0x20 for a 16x2 //SparkCore bug, address is actually 27 but shifted (0x27*2)
lcd->init(); // initialize the lcd
lcd->backlight();
// lcd->noBacklight();
lcd->clear();
pinMode(radikatemp, INPUT_PULLDOWN);
pinMode(toatemp, INPUT_PULLDOWN);
pinMode(pliiditemp, INPUT_PULLDOWN);
pinMode(pliidiveetemp, INPUT_PULLDOWN);
pinMode(xtemp, INPUT_PULLDOWN);
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(relayRadiator, OUTPUT);
pinMode(relayBoiler, OUTPUT);
digitalWrite(relayRadiator, LOW);
digitalWrite(relayBoiler, LOW);
analogWrite(ledRed,150);
}
void loop(){
if(!client.isConnected()){
client.connect("centralheating");
// Serial.println("Connecting to MQTT...");
client.subscribe("staatus");
}
if(client.isConnected()){
client.loop();
// Serial.println("Connected to MQTT.");
}
radikaC = (as100.analogReadSmooth(radikatemp) * 3.3) / 4095*100; //getting the voltage reading from the temperature sensor
toaC = (as101.analogReadSmooth(toatemp) * 3.3) / 4095*100 - 0.5;
pliidiC = (as102.analogReadSmooth(pliiditemp) * 3.3) / 4095*200;
pliidiveeC = (analogRead(pliidiveetemp) * 3.3) / 4095*100;
xtempC = (analogRead(xtemp) * 3.3) / 4095*100;
if(Time.now() - previousNow > toggleDelay) {
previousNow = Time.now();
lcd->clear();
if (toggleLCDState == 1){
toggleLCDState = 0;
toggleDelay = 3;
}
else{
toggleLCDState = 1;
toggleDelay = 10;
}
}
if(Time.now() - previousNow2 > 7200) {
previousNow2 = Time.now();
ForceState = 0;
lcd->clear();
}
if(toggleLCDState == 1){
lcd->setCursor(1,0);
lcd->print("Korsten");
lcd->setCursor(11,0);
lcd->print(pliidiC, 1);
lcd->print(" ");
lcd->setCursor(1,1);
lcd->print("Radikasse");
lcd->setCursor(11,1);
lcd->print(radikaC, 1);
lcd->print(" ");
lcd->setCursor(1,2);
lcd->print("Toatemp");
lcd->setCursor(11,2);
lcd->print(toaC, 1);
lcd->print(" ");
lcd->setCursor(1,3);
lcd->print("Pliita");
lcd->setCursor(11,3);
lcd->print(pliidiveeC, 1);
lcd->print(" ");
}
else if(toggleLCDState == 0){
digitalClockDisplay();
if(ForceState != 0){
secs = 14400 - (Time.now() - previousNow2); //
mins=secs/60; //convert seconds to minutes
hours=mins/60; //convert minutes to hours
secs=secs-(mins*60); //subtract the coverted seconds to minutes in order to display 59 secs max
mins=mins-(hours*60); //subtract the coverted minutes to hours in order to display 59 minutes max
lcd->setCursor(3,2);
lcd->print("Forced state: ");
lcd->setCursor(6,3);
if(hours<10) lcd->print('0');
lcd->print(hours);
lcd->print(":");
if(mins<10) lcd->print('0');
lcd->print(mins);
lcd->print(":");
if(secs<10) lcd->print('0');
lcd->print(secs);
}
}
if (toaC > 23.6){
previousNow2 = Time.now();
ForceState = -1;
}
c = tempkontroll(radikaC, toaC, c, aeg, pliidiveeC);
d = tempkontroll2(pliidiC, pliidiveeC, d);
Taustavalgus();
Alarm.delay(900);
}
void Taustavalgus(){
if(Time.hour()<8 || Time.hour()>20){
lcd->noBacklight();
}
else{
lcd->backlight();
}
}
void ThingSpeakUpdate(String tsData)
{
Serial.println("Date string: " + tsData);
Serial.println("...Connecting to Thingspeak");
// Connecting and sending data to Thingspeak
if(Xclient.connect("api.thingspeak.com", 80))
{
Serial.println("...Connection succesful, updating datastreams");
Xclient.print("POST /update HTTP/1.1\n");
Xclient.print("Host: api.thingspeak.com\n");
Xclient.print("Connection: close\n");
Xclient.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
Xclient.print("Content-Type: application/x-www-form-urlencoded\n");
Xclient.print("Content-Length: ");
Xclient.print(tsData.length());
Xclient.print("\n\n");
Xclient.println(tsData); //the ""ln" is important here.
// This delay is pivitol without it the TCP client will often close before the data is fully sent
delay(250);
Serial.println("Thingspeak update sent.");
}
else{
Serial.println("Unable to connect to Thingspeak.");
}
if(!Xclient.connected()){
Xclient.stop();
}
Xclient.flush();
Xclient.stop();
}
int tempkontroll(float radikaC, float toaC, int c, int aeg, float pliidiveeC) {
aeg =Time.hour()*60+Time.minute();
if((toaC < 20.7 && radikaC > 39 && c == 0 && aeg < 1290 && aeg > 360 && ForceState == 0) || (ForceState == 1)) {
c = 1;
digitalWrite(relayRadiator, HIGH); //paneb relee "HIGH" asendisse
}
/*
if((radikaC > 84 || pliidiveeC > 84) && c == 0) {
c = 1;
digitalWrite(relayRadiator, HIGH); //paneb relee "HIGH" asendisse
analogWrite(ledRed,150);
Alarm.delay(100);
}
*/
else if((((toaC > 21.4 || radikaC < 37) && c == 1 && radikaC < 88 && ForceState == 0) || (aeg > 1290 && radikaC < 88 && ForceState == 0)) || (ForceState == -1 && radikaC < 88) ) {
c = 0;
digitalWrite(relayRadiator, LOW); //paneb relee "LOW" asendisse
}
return c;
}
int tempkontroll2(float pliidiC, float pliidiveeC, int d) {
if((pliidiC > 90 || pliidiveeC > 80) && d == 0) {
d = 1;
digitalWrite(relayBoiler, HIGH); //paneb relee "HIGH" asendisse
analogWrite(ledRed,0);
analogWrite(ledGreen,150);
}
else if(pliidiC < 85 && pliidiveeC <79 && d == 1) {
d = 0;
digitalWrite(relayBoiler, LOW); //paneb relee "LOW" asendisse
analogWrite(ledRed,150);
analogWrite(ledGreen,0);
}
return d;
}
void MorningAlarm(){
Spark.syncTime();
if (isDST() == 1){
Time.beginDST();
}
else {
Time.endDST();
}
}
void Repeats2(){
if(client.isConnected()){
// client.publish("centralheating/",String(celsius, 1));
}
if(Spark.connected())
{
ThingSpeakUpdate("field1="+String(toaC)+"&field2="+String(radikaC)+"&field3="+String(pliidiC)+"&field4="+String(pliidiveeC)+"&field6="+String(c)+"&field7="+String(d));
}
}
void OnceOnly(){
Spark.syncTime();
if (isDST() == 1){
Time.beginDST();
}
else {
Time.endDST();
}
}
bool isDST()
{ // (Central) European Summer Timer calculation (last Sunday in March/October)
int dayOfMonth = Time.day();
int month = Time.month();
int dayOfWeek = Time.weekday() - 1; // make Sunday 0 .. Saturday 6
if (month >= 4 && month <= 9){ // April to September definetly DST
return true;
}
else if (month < 3 || month > 10){ // before March or after October is definetly standard time
return false;
}
// March and October need deeper examination
boolean lastSundayOrAfter = (dayOfMonth - dayOfWeek > 24);
if (!lastSundayOrAfter){ // before switching Sunday
return (month == 10); // October DST will be true, March not
}
if (dayOfWeek){ // AFTER the switching Sunday
return (month == 3); // for March DST is true, for October not
}
int secSinceMidnightUTC = Time.now() % 86400;
boolean dayStartedAs = (month == 10); // DST in October, in March not
// on switching Sunday we need to consider the time
if (secSinceMidnightUTC >= 1*3600){ // 1:00 UTC (=1:00 GMT/2:00 BST or 2:00 CET/3:00 CEST)
return !dayStartedAs;
}
return dayStartedAs;
}
void digitalClockDisplay(){
lcd->setCursor(1,1);
lcd->print(Time.year(), DEC);
lcd->print('/');
if(Time.month()<10) lcd->print('0');
lcd->print(Time.month(), DEC);
lcd->print('/');
lcd->print(Time.day(), DEC);
lcd->print(' ');
if(Time.hour()<10) lcd->print('0');
lcd->print(Time.hour(), DEC);
lcd->print(':');
if(Time.minute()<10) lcd->print('0');
lcd->print(Time.minute(), DEC);
lcd->print(':');
if(Time.second()<10) lcd->print('0');
lcd->print(Time.second(), DEC);
}
int MobileSwitch(String command) {
if (command=="off") {
previousNow2 = Time.now();
ForceState = -1;
return 0;
}
else if (command=="on") {
if(radikaC > 39){
previousNow2 = Time.now();
ForceState = 1;
//digitalWrite(relayRadiator, HIGH);
return 1;
}
else{
return -1;
}
}
else if (command=="auto") {
ForceState = 0;
return 1;
}
else {
return -1;
}
}
|
MQTT callback funktsioon:
float callback(char* topic, byte* payload, unsigned int length) {
char p[length + 1];
memcpy(p, payload, length);
p[length] = NULL;
Serial.println("callback...");
if (!strcmp(p, "ON")){
if(radikaC > 39){
previousNow2 = Time.now();
ForceState = 1;
}
}
if (!strcmp(p, "OFF")){
previousNow2 = Time.now();
ForceState = -1;
}
if (!strcmp(p, "AUTO")){
ForceState = 0;
}
}
|
Pumpa juhib järgmine funktsioon mis kasutab ForceState väärtust:
int tempkontroll(float radikaC, float toaC, int c, int aeg, float pliidiveeC) {
aeg =Time.hour()*60+Time.minute();
if((toaC < 20.7 && radikaC > 39 && c == 0 && aeg < 1290 && aeg > 360 && ForceState == 0) || (ForceState == 1)) {
c = 1;
digitalWrite(relayRadiator, HIGH); //paneb relee "HIGH" asendisse
}
else if((((toaC > 21.4 || radikaC < 37) && c == 1 && radikaC < 88 && ForceState == 0) || (aeg > 1290 && radikaC < 88 && ForceState == 0)) || (ForceState == -1 && radikaC < 88) ) {
c = 0;
digitalWrite(relayRadiator, LOW); //paneb relee "LOW" asendisse
}
return c;
}
|
_________________ Väiksemagabariidilised trei, frees ning keevitustööd. PS. |
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
2 :: |
91 |
|
tagasi üles |
|
|
andre85
HV vaatleja
liitunud: 10.09.2006
|
27.10.2020 10:36:38
|
|
|
Sinu probleem on siin:
char p[length + 1];
See eraldab mälu magasinis ja seal ta kokku jookseb...
võiks olla midagi sellist, et eraldad mälu mujalt kui magasinist või on juba valmis eraldatud (vt Supliplexi vastust sulle teises teemas)
_________________ andres |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
|
Terror
HV veteran
liitunud: 08.11.2001
|
27.10.2020 11:03:28
|
|
|
See char p[length + 1]; on ka MQTT enda library näites sees, ei saa aru kuidas see võiks asja kokku jooksutada.
p ju nullitakse kogu aeg ära ka ( p[length] = NULL; ) ning mujal ta töötab.
Library näitekood:
void callback(char* topic, byte* payload, unsigned int length) {
char p[length + 1];
memcpy(p, payload, length);
p[length] = NULL;
if (!strcmp(p, "RED"))
RGB.color(255, 0, 0);
else if (!strcmp(p, "GREEN"))
RGB.color(0, 255, 0);
else if (!strcmp(p, "BLUE"))
RGB.color(0, 0, 255);
else
RGB.color(255, 255, 255);
delay(1000);
}
|
_________________ Väiksemagabariidilised trei, frees ning keevitustööd. PS. |
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
2 :: |
91 |
|
tagasi üles |
|
|
Supiplex
HV veteran
liitunud: 11.12.2002
|
27.10.2020 15:45:07
|
|
|
Kui sul on funktsiooni signatuur mis lubab tagastada floati ja sa seda funktsioonis tegelikult ei tee, siis võib juhtuda igasugu huvitavaid asju.
float callback(char* topic, byte* payload, unsigned int length) |
Rohkem norimise poolest - char array sisse ei tasu nullpointerit kirjutada. Ikka null-char '\0' või - mis veel lihtsam - 0.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
|
napoleon
Unknown virus
liitunud: 08.12.2008
|
27.10.2020 16:52:07
|
|
|
Supiplex kirjutas: |
Rohkem norimise poolest - char array sisse ei tasu nullpointerit kirjutada. Ikka null-char '\0' või - mis veel lihtsam - 0.
|
Pole see miskit norimine.
if (!strcmp(p, "ON")){
peale juhtub ka igasuguseid huvitavaid asju kui konkreetses vahendis NULL != 0.
|
|
Kommentaarid: 76 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
59 |
|
tagasi üles |
|
|
Terror
HV veteran
liitunud: 08.11.2001
|
27.10.2020 18:55:52
|
|
|
Kodeerimises olen ma võhik ning ei ole esimene kord kui ma millegist vaalesti aru olen saanud aga kirjutaksin lahti, kuidas mina seda lugesin:
char p[length + 1]; // char muutujale "p" määratakse tähemärkide pikkus mis saadakse funktsiooni callbacki tulevast infost. St antakse talle pikkus.
memcpy(p, payload, length); //memcpy( kuhu kohta kopeeritakse, kust kohast kopeeritakse, kui pikalt) ehk siis "p" väärtuseks kopeeritakse MQTT sissetuleva sõnumi väärtus ning selle pikkus on "length" määratud.
p[length] = NULL; // algul vaatasin, et "p" muutuja väärtus kirjtuatakse nulliks, või et ta pikkuseks kirjutatakse 0 mis oleks imo efektiivselt null väärtus. Kuid see ei saa siiski nii olla, kuna hiljem ju võrreldakse "p" "ON" jne väärtustega.
Seega kas "p" väärtuse lõppu lisatakse null? Mis see annaks?
Niipalju ma ühel hetkel päeval lugesin, et C++'s NULL != "0" 'ga jah.
Lähtunud olen ma muidugi sellest, et kui inimene on library valmis kirjutanud, siis ametlikus näites ei tohiks ta põhitõdede vastu eksida
Aga mis konkreetsed soovitused siis oleks?
p[length] = 0; // ???
_________________ Väiksemagabariidilised trei, frees ning keevitustööd. PS. |
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
2 :: |
91 |
|
tagasi üles |
|
|
napoleon
Unknown virus
liitunud: 08.12.2008
|
27.10.2020 19:29:20
|
|
|
p[length] = 0;
oleks korrektne jah. Aga 100% kindel pole, et see probleemi lahendab.
|
|
Kommentaarid: 76 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
59 |
|
tagasi üles |
|
|
Terror
HV veteran
liitunud: 08.11.2001
|
27.10.2020 19:34:57
|
|
|
Katsetasin veits ning hetkel tundub, et toimib (vähemasti siiani pole pange pannud).
Mis aitas oli "delay" lisamine.
float callback(char* topic, byte* payload, unsigned int length) {
char p[length + 1];
memcpy(p, payload, length);
p[length] = 0;
Serial.println("callback...");
if (!strcmp(p, "ON")){
if(radikaC > 39){
previousNow2 = Time.now();
ForceState = 1;
}
}
if (!strcmp(p, "OFF")){
previousNow2 = Time.now();
ForceState = -1;
}
if (!strcmp(p, "AUTO")){
ForceState = 0;
}
Alarm.delay(900);
}
|
Alarm.delay on ühe library funkts mida kasutan. Kas sellest võiks järeldada, et kuskil tekkis mingi lõputu "loop" mis asja kooma tõmbas?
_________________ Väiksemagabariidilised trei, frees ning keevitustööd. PS. |
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
2 :: |
91 |
|
tagasi üles |
|
|
napoleon
Unknown virus
liitunud: 08.12.2008
|
27.10.2020 19:42:12
|
|
|
See tähendab, et midagi kuskil tehakse asünkroonselt. Aga siinkohal tõstan käed üles. C/C++ on mulle tuttav teema, aga konkreetrselt Arduino-ga pole kokku puutunud.
|
|
Kommentaarid: 76 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
59 |
|
tagasi üles |
|
|
Supiplex
HV veteran
liitunud: 11.12.2002
|
27.10.2020 19:50:48
|
|
|
Terror kirjutas: |
Seega kas "p" väärtuse lõppu lisatakse null? Mis see annaks? |
C-s on kasutusel zero-terminated string. Bait väärtusega 0 tähistab stringi lõppu. Näiteks string "ON" peab koosnema kolmest baidist väärtustega 'O', 'N' ja 0.
Utiliidid nagu strcmp() otsivad seda 0-i ja kui ei leia, siis ketravad kasvõi terve mälu läbi. Noh, tavaliselt jääb mõni asjasse mittepuutuv 0 varem ette
tsitaat: |
Alarm.delay on ühe library funkts mida kasutan. Kas sellest võiks järeldada, et kuskil tekkis mingi lõputu "loop" mis asja kooma tõmbas? |
Veelkord. Su funktsioon "callback" peab tagastama float väärtuse, sest nii sa oled kompilaatorile lubanud. Palun tee seda - kasvõi "return 0.0;" - või korja see float sealt signatuuri algusest ära.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
|
NATAS999
HV Guru
liitunud: 02.04.2007
|
28.10.2020 08:52:20
|
|
|
Supiplex, kas long int peab kindlasti tagastama väärtuse kujul +0000000001?
|
|
Kommentaarid: 41 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
39 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
28.10.2020 11:11:48
|
|
|
NATAS999, võid ka 1L tagastada.
Aga antud hetkel oleks õige muuta funktsiooni signatuuris tagastatavaks tüübiks void, kuna ühtegi väärtust/pointerit ei tagastata.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
Supiplex
HV veteran
liitunud: 11.12.2002
|
28.10.2020 12:22:41
|
|
|
NATAS999 kirjutas: |
Supiplex, kas long int peab kindlasti tagastama väärtuse kujul +0000000001? |
Ehh? Ei. Funktsioon võib teoorias tagastada ükskõik mis tüüpi väärtuse, seni kui kompilaator on nõus selle tagastatavasse tüüpi ümber teisendama.
Lihtsalt oma koodi lugeja vaimset tervist tuleb hoida, tal seda tihtipeale niigi vähe alles Selleks on mikk36 nõu hea.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
|
NATAS999
HV Guru
liitunud: 02.04.2007
|
28.10.2020 13:03:54
|
|
|
mõtlesin üldisemalt seda asja. kui mul on funktsioon, mis peab mingil põhjusel vahest tagastama ujukoma väärtuse, siis mõningal juhul vastavalt sisendile võib ju tagastada ka lihtsalt 0, mitte ei pea tingimata 0.0 olema?
puht sportlikust huvist viskan sõna sekka. omale vahest kirjutan c++'ga tööriistu ja return väärtustega pole probleeme olnud. pigem aritmeetika, grammatika ja loogika vead.
|
|
Kommentaarid: 41 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
39 |
|
tagasi üles |
|
|
Supiplex
HV veteran
liitunud: 11.12.2002
|
28.10.2020 15:57:41
|
|
|
NATAS999 kirjutas: |
mõtlesin üldisemalt seda asja. kui mul on funktsioon, mis peab mingil põhjusel vahest tagastama ujukoma väärtuse, siis mõningal juhul vastavalt sisendile võib ju tagastada ka lihtsalt 0, mitte ei pea tingimata 0.0 olema? |
Jah, C ning C++ keeled lubavad seda ja käänavad tüübi õigeks. https://www.oreilly.com/library/view/c-in-a/0596006977/ch04.html#cinanut-CHP-4-SECT-1.4
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
|
napoleon
Unknown virus
liitunud: 08.12.2008
|
28.10.2020 16:02:10
|
|
|
Enamik keeli suudab tüübi õigeks keerata kui tüübid on teisaldatavad, hetkel ei meenugi ühtegi keelt mis selle osas väga pirtsakas oleks.
C/C++ puhul peab ainult sellega ettevaatlik olema, et see lubab ka endale jalga tulistada ning paremal juhul annab kompilaator hoiatuse, aga alati mitte ka seda.
|
|
Kommentaarid: 76 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
59 |
|
tagasi üles |
|
|
Ohohh
Kreisi kasutaja
liitunud: 13.09.2003
|
29.10.2020 00:27:42
|
|
|
Lihtsalt infoks, et Arduino puhul reaalselt NULL teisendub ikkagi 0'ks, kuigi kompilaator annab hoiatuse:
warning: converting to non-pointer type 'char' from NULL
Aga mulle tundub, et Supiplex'i välja pointitud probleem, et "float" funktsoonil ei ole return'i, võib vabalt antud kokkujooksmise põhjus olla.
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
29.10.2020 08:20:51
|
|
|
Lihtsaim oleks lihtsalt float -> void teha, kuna pole ju kavas tagastada midagi.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
Terror
HV veteran
liitunud: 08.11.2001
|
29.10.2020 09:42:03
|
|
|
Voidiga ma ei saanud seal callbacki sees globaalset muutujat kasutada.
_________________ Väiksemagabariidilised trei, frees ning keevitustööd. PS. |
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
2 :: |
91 |
|
tagasi üles |
|
|
Ohohh
Kreisi kasutaja
liitunud: 13.09.2003
|
29.10.2020 10:02:03
|
|
|
Terror kirjutas: |
Voidiga ma ei saanud seal callbacki sees globaalset muutujat kasutada. |
See tundub väga ebaloogiline.
Kas saaksid näidata, milline "mqtt.h" välja näeb?
Siis näeb, et millist callbacki "MQTT client(server, 1883, callback);" täpselt ootab.
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
|
Terror
HV veteran
liitunud: 08.11.2001
|
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
2 :: |
91 |
|
tagasi üles |
|
|
NATAS999
HV Guru
liitunud: 02.04.2007
|
29.10.2020 11:20:09
|
|
|
konsoolis ei kannata sellist asja jooksutada ja anduritest saadavad väärtused käsitsi hoopis ette sööta, kas siis hard coded või konsooli sisestades ja siis kuskile koodi kirjutada mingid punktid cout ja mõne muutuja väärtus, mida kahtlustad, et võib pange panna. mul muidugi jooksis esimeses postis spoileris oleva kogu koodi peale kuulid kokku, aga ega ei süvenend ka enam peale esimest 20 rida
|
|
Kommentaarid: 41 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
39 |
|
tagasi üles |
|
|
Ohohh
Kreisi kasutaja
liitunud: 13.09.2003
|
29.10.2020 13:22:11
|
|
|
Callback peaks ikkagi "void" olema, kuna library ootab void'i.
Mulle tundub praegu ohtlik see "byte" siin
byte server[] = { 192,168,1,223 };
MQTT client(server, 1883, callback);
|
MQTT libraries on kaks definitsiooni:
MQTT(char* domain, uint16_t port, void (*callback)(char*,uint8_t*,unsigned int));
ja
MQTT(uint8_t *ip, uint16_t port, void (*callback)(char*,uint8_t*,unsigned int));
Kuna "byte" on mingi Arduino platformi jaoks defineeritud tüüp, siis nüüd ei teagi, kummaks ta lahendub, kas "char* domain" või "uint8_t *ip", kuna char ja uint8_t on Arduinol põhimõtteliselt samad.
Esimene eeldab null terminated stringi ja teine nelja kohalist array'd
Äkki oleks kindlam, kui teeksid
uint8_t server[] = { 192,168,1,223 };
MQTT client(server, 1883, callback);
või võid proovda ka
char * server = "192.168.1.223";
MQTT client(server, 1883, callback);
Ja callback loomulikult
void callback(char* topic, byte* payload, unsigned int length);
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
|
Terror
HV veteran
liitunud: 08.11.2001
|
29.10.2020 13:47:08
|
|
|
Library oma muutmata kujul ei toiminud (void Callback..)
I trying to declare callbackstring as global, use it in the callback function and then display it in loop() but that didn't work. Displaying the value of callbackString inside the callback worked.
https://forum.arduino.cc/index.php?topic=400044.0
Sealt maalt lugema hakata. Ma sain vähemalt aru, et ei saa sealt callbacki seest infot kätte teise funktsiooni, kui üritasin seda library't muutmata kujul kasutada.
_________________ Väiksemagabariidilised trei, frees ning keevitustööd. PS. |
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
2 :: |
91 |
|
tagasi üles |
|
|
Ohohh
Kreisi kasutaja
liitunud: 13.09.2003
|
29.10.2020 20:07:26
|
|
|
Terror kirjutas: |
I trying to declare callbackstring as global, use it in the callback function and then display it in loop() but that didn't work. Displaying the value of callbackString inside the callback worked.
https://forum.arduino.cc/index.php?topic=400044.0
Sealt maalt lugema hakata. Ma sain vähemalt aru, et ei saa sealt callbacki seest infot kätte teise funktsiooni, kui üritasin seda library't muutmata kujul kasutada. |
Sellisel kujul nagu ta üritab teha seal foorumi postitusel ei saagi töötada.
"char callbackString;" on lihtsalt ühe baidine globaalne muutuja.
Ja nüüd callbacki sees ta skoobi mõttes varjutab selle lihtsalt ära tehes uue funktsooni sisese koahliku muutuja:
char *callbackString = (char *) payload; // see loob uue muutuja "*callbackString", mis ei ole kuidagi seotud globaalse muutujaga "callbackString"
callbackString[length] = '\0'; // siin väärtustab kohalikku muutjat "*callbackString"
Ehk siis tegelikult ta isegi ei anna midagi callbackist välja.
EDIT:
Kontrollisin. byte läheb ikkagi uint8_t'ks. Ehk siis selles osas probleemi ei ole
See kood väljastas teksti "uint8_t":
byte bytes [] = {1, 2, 3, 4};
void aa(char * a) {
Serial.println("char");
}
void aa(uint8_t * a) {
Serial.println("uint8_t");
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
aa(bytes);
}
void loop() {
// put your main code here, to run repeatedly:
} |
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
|
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|