переменная float (температура) в отправленном смс

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

Приветствую!!!

Пишу прогу запроса температуры по смс - если во входящем сообщении содержится текс "Temp", считываю данные с датчика температуры ds18B20, присваиваю значение температуры переменной "Temp" - тип float

if (strcmp(message, "Temp") == 0) {
    byte data[2];
    ds.reset(); 
    ds.write(0xCC);
    ds.write(0x44);
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    for (byte i = 0; i < 5; i++) { data[i] = ds.read ();} 
    raw =  (data[1] << 8) | data[0]; 
    Temp =  (float)raw / 16.0;        // переменная Temp - float

Считал значение и в ответном смс должно приходить сообщение со значением температуры. Использую библиотеку "GPRS_Shield_Arduino.h". Никак не могу победить ошибку error: no matching function for call to 'GPRS::sendSMS(char [20], float&)' с преобразованием типа переменной 'float' to 'char*'

функция отправки смс 

gprsTest.sendSMS(phone, Temp);

конвертирую sprintf(Temp,"%f F", temp); и далее вывести уже конверт переменную дуина не понимает.

gprsTest.sendSMS(phone, temp);

та же ошибка

пробовал разложить в строку 

dtostrf(Temp, 4, 4, charVal);
char* temp = "";
for(int a=0;a < sizeof(charVal); a++) {temp += charVal[a];}

тоже не работает. Прошу помощи как еще можно конвертировать переменную для отправки командой sendSMS(phone, char* data); без ошибки 'float' to 'char*'

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sergeyksv45 пишет:

Пишу прогу ... не работает.

С прогами всегда так.

sergeyksv45 пишет:
error: no matching function for call to 'GPRS::sendSMS(char [20], float&)' с преобразованием типа переменной 'float' to 'char*'

Ну, нету в Вашей библиотеке такой функции, либо добавьте её в библиотеку, либо отправляйте через sendSMS(phone, char* data);

sergeyksv45 пишет:
конвертирую sprintf(Temp,"%f F", temp); и далее вывести уже конверт переменную дуина не понимает.

Это Вы, похоже, не понимаете, что делаете. Сам по себе подход имеет право быть и должен работать. Вы же, похоже, перепутали параметры sprintf, но точно сказать не могу ... если б Вы не экономили место на дисках сервера, а этот кусок полнстью привели, можно было бы смотреть

sergeyksv45 пишет:
пробовал разложить в строку 

dtostrf(Temp, 4, 4, charVal);
char* temp = "";
for(int a=0;a < sizeof(charVal); a++) {temp += charVal[a];}

Опять же. Блин, ну вот как у Вас описана charVal? Чего Вы, блин, секрет делаете из кода?

Если charVal описан правильно (типа char charVal[100500]), то выбросьте последнюю строку с for как гнусное извращение и просто используйте эту charVal в качестве второго параметра функции sendSMS(phone, char* data); и будет море счастья.

 

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

Вопрос можно снимать!!! Разобрался с кодом и теперь в ответнос смс приходит значение температуры в виде "25.38*C". Может кому пригодится преобразовать таким методом переменные пользуйтесь! код рабочий. 

может есть вариант и по проще, но код рабочий

if (strcmp(message, "Temp") == 0) {
        byte data[2];
        ds.reset(); 
        ds.write(0xCC);
        ds.write(0x44);
        ds.reset();
        ds.write(0xCC);
        ds.write(0xBE);
        for (byte i = 0; i < 5; i++) { data[i] = ds.read ();} 
        raw =  (data[1] << 8) | data[0]; 
        Temp =  (float)raw / 16.0;
        char buff[10];
        char temp[100] = "";
        for (int i=0; i<1; i++) {
        dtostrf(Temp, 4, 2, buff); 
        strcat(temp, buff);
        strcat(temp, "*C");}
        Serial.print("Temp: ");
        Serial.println(Temp);
        Serial.print("Temp sms str : ");
        Serial.println(temp);
        gprsTest.sendSMS(phone, temp);}

 

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

----Если charVal описан правильно (типа char charVal[100500]), то выбросьте последнюю строку с for как гнусное извращение и просто используйте эту charVal в качестве второго параметра функции sendSMS(phone, char* data); и будет море счастья.---

не знаю как цитировать(((( Выбросил это гнусное извращение и пустое приходило а потом вооще всё выбросил))) и стало счастье)))))))

уменьшил buff

char buff[10];

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Как Вы понимаете 14-ую строку Вашего т.н. "рабочего кода"? Вы ... типа извращенец? :))))

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

)))) Да может быть))) но если

for (int i=0; i<1; i++) {

то в сериал порту вижу 

Temp: 28.44
Temp sms str : 28.44*C
а если ставить i<2 и больше, то значения в сериал такие 
Temp: 28.44
Temp sms str : 28.44*C
Temp: 28.44
Temp sms str : 28.44*C

и в добавок почему то нет конца строки в сериал порту, бегунок убегает ..... 

 

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

Предложите вариант "не извращенца" буду благодарен Вам

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

У меня друг как то выстрелил неглядя из духовушки и убил воробья. Это примерно тоже самое...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ЕвгенийП пишет:

Как Вы понимаете 14-ую строку Вашего т.н. "рабочего кода"? Вы ... типа извращенец? :))))

Вы мне тут недавно про 2х2 сказали, теперь верю.

sergeyksv45

Научитесь скобки нормально ставить, читать не возможно.

По делу

for (int i=0; i<1; i++) {
	dtostrf(Temp, 4, 2, buff); 
	strcat(temp, buff);
	strcat(temp, "*C");
}

первая строка в переводе на русский язык означает - сделать то, что находится в скобках, 1 РАЗ !!!

то есть БЕССМЫСЛЕННА.

 

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

В поисках решения проблемы возникшей в данной ситуации на просторах инета нашел такое решение на англ. яз. сайте. У меня пока нет больших познаний в программировании так что приходится выходить из ситуации таким способом. Я "паяльник", а не программист и занимаюсь ремонтом сотовых, перепайка микрух "на шарах" для меня пустяк , а вот в программировании признаю пока что я "ноль"

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

xDriver пишет:

ЕвгенийП пишет:

Как Вы понимаете 14-ую строку Вашего т.н. "рабочего кода"? Вы ... типа извращенец? :))))

Вы мне тут недавно про 2х2 сказали, теперь верю.

sergeyksv45

Научитесь скобки нормально ставить, читать не возможно.

По делу

for (int i=0; i<1; i++) {
	dtostrf(Temp, 4, 2, buff); 
	strcat(temp, buff);
	strcat(temp, "*C");
}

первая строка в переводе на русский язык означает - сделать то, что находится в скобках, 1 РАЗ !!!

то есть БЕССМЫСЛЕННА.

 

Полностью с Вами согласен!!! Выбросил бессмысленную строку и всё работает. Сижу разбираю код по кирпичику что как работает -  надо понять что к чему и зачем именно так, это всё выдернул на англ. яз. сайте.