Конвертация float в массив char

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

Здравствуйте! Сразу опишусь что я новичок в C++. Сейчас занимаюсь с модулем SIM900, библиотека такая http://github.com/amperka/gprs-shield/releases. И какой уже день не могу разобраться с отправкой температуры, записанной в переменную float.

void get_atmosph() {
unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    h = dht.readHumidity();          // читаем влажность
    //   temp_f = dht.readTemperature(true);     // читаем температуру в фаренгейтах
    t = dht.readTemperature(false);     // читаем температуру в цельсиях
    // проверяем, что считалось
    pa = bmp.readPressure();
    mmHg = pa / 133,32236842;
  }  
}

Дело в том что библиотека воспринимает текст смс-ки только в массиве char, размером до 160 символов.

else if (!String(message).compareTo("Temperature") && unread == true) {
      get_atmosph();
      Serial.println("New message");
      gprs.sendSMS(phone, message);
      unread = false;
      Serial.println("Message send");
     }

Если кто-то знает хоть какую-то ссылку на ресурс или даст кусок кода, то буду очень Вам благодарен.

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

dtostrf

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

dtostrf

Конечно, можно и через класс String, раз уж Вы им всё равно пользуетесь (суде по показанному кусочку).

А чего, првда, через String не сделали?

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

   Евгений, спасибо большое за помощь! Если подскажете как сделать через String это будет ещё лучше. Я просто этот код по кусочкам собирал и вместе с этим C++ учил, поэтому много ещё не знаю.

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

Алексей Кабанов пишет:

через String это будет ещё лучше

Я то покажу, мне не жалко, но лучше не будет - точно! String непростая вещь и для своего использования требует квалификации, которой Вы пока не обладаете. Но дело Ваше ...

А там, собственно и делать-то нечего. Создаёте строку, передав в конструктор Ваш float и количество знаков после запятой, а потом берёте её c_str - вот Вам и массив char'ов

#include <math.h>

void setup(void) {
	Serial.begin(115200);
	//
	// Как-то вычисляем float
	//
	const float radius = 1.5;
	const float len = 2.0 * M_PI * radius;
	//
	// Теперь преобразуем len  в строку с тремя 
	// знаками после запятой и получаем массив char
	//
	{
		String sLen(len, 3);
		const char * szLen = sLen.c_str();
		// szLen ссылается на массив char - печатаем
		Serial.println(szLen);
	}
}

void loop(void) {}

Скобки в строках 14 и 19, можно и опустить, на вид ничего не изменится, но лучше их ставить. Открывающую перед описанием String, а закрывающая тогда, когда созданный String больше не нужен и его можно выбросить. Подробности.

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

Ну всё равно спасибо! Хоть какая-то информация. Попробую её применить в своём скетче.

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

Евгений, спасибо, всё получилось! Теперь мой последний вопрос. Как склеить char равную "Temperature: " и char равную "27.51" в char равную "Temperature: 27.51"?

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

А что по отдельности передавать нельзя?

А чтобы Вам ответить, надо знать как Вы её собрались клеить? Из String'ов или из символьных массивов?

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

Клеить я буду из char'ов , а по отдельности передавать нельзя, потому что задача стоит сделать сообщение которое будет удобно читать пользователю.

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

Нет, давайте толком. Вы для преобразования используете String или dtostrf?

Просто, если там уж всё равно есть String, то проще им и склеить. А если нет (если сразу через dtostrf, то гуглите функции strcpy и strcat

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

Евгению и DIYMan'у огромное спасибо за помощь! Забыл я что-то выложить сюда свой готовый код. Ну вообщем вот он:

else if (!String(message).compareTo("Sensor") && unread == true) {
      Serial.println("New message");
      h = dht.readHumidity();      
    //   temp_f = dht.readTemperature(true);    
      t = dht.readTemperature(false);     
      pa = bmp.readPressure();
      mmHg = pa / 133,32236842;
      Serial.println(t);
      String sT(t, 1);
      char * szT = sT.c_str();
      String sH(h, 1);
      char * szH = sH.c_str();
      String sMmHg(mmHg, 2);
      char * szMmHg = sMmHg.c_str();
      const char *Temperature  = "Temperature ";
      const char *degr  = "*C ";
      const char *Humiduty  = "Humiduty ";
      const char *perc = "% ";
      const char *Pressure  = "Pressure ";
      const char *Hg  = " mm Hg ";
      char data[512];
      snprintf(data, sizeof data, "%s%s%s%s%s%s%s%s%s", Temperature, szT, degr, Humiduty, szH, perc, Pressure, szMmHg, Hg);
      gprs.sendSMS(phone, data);
      unread = false;
      Serial.println("Message send");
     }

Извините что без комментариев в коде. Просто пока он не такой сложный я комментарии не пишу, да и вообще я не люблю комментарии. Думаю что кому-то из начинающих ардуинщиков мой код поможет!

Спасибо ещё раз за помощь и удачи!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Алексей Кабанов пишет:

 Просто пока он не такой сложный я комментарии не пишу, да и вообще я не люблю комментарии. 

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

// читаем с датчика движения

// если сработал
// и мотор ещё не работает, то
// выключаем помаргивающий светодиод
// включаем мотор
// запоминаем время начала работы мотора
// выставляем флаг, что мотор работает
// и выходим из обработчика

// если не сработал
// помаргиваем светодиодом, сигнализируя о готовности

Потом - начинаете между комментариями писать код, это становится проще сделать, т.к. вы уже человечьим языком описали алгоритм ;)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

DIYMan пишет:

Не брезгуйте комментариями. Небольшой жизненный секрет, существенно облегчающий написание кода, помогающий сразу его комментировать и структурировать: сначала - вы не пишете ни строчки кода, совсем. Вместо этого пишете комментарии, примерно вот так:

// читаем с датчика движения

// если сработал
// и мотор ещё не работает, то
// выключаем помаргивающий светодиод
// включаем мотор
// запоминаем время начала работы мотора
// выставляем флаг, что мотор работает
// и выходим из обработчика

// если не сработал
// помаргиваем светодиодом, сигнализируя о готовности

Потом - начинаете между комментариями писать код, это становится проще сделать, т.к. вы уже человечьим языком описали алгоритм ;)

Люто, бешено плюсую.  Без комментариев через 2 года проще всё с нуля написать, чем разбираца. 

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

 Спасибо за жизненный совет! Как только найду свободное время займусь комментариями в коде (он у меня всего 530 строк).

kalapanga
Offline
Зарегистрирован: 23.10.2016

DetSimen пишет:

Люто, бешено плюсую.  Без комментариев через 2 года проще всё с нуля написать, чем разбираца. 

Увы, есть "крутые программисты", твёрдо уверенные, что "хороший код сам себя комментирует". Вот и думаю то и дело - это я тупой или таки код "не хороший" :)

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

    Ну это Вы зря) Просто для меня легче учиться когда комментариев нету, да и весь код целиком я пока что никуда не выкладывал.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Алексей Кабанов пишет:

    Ну это Вы зря) Просто для меня легче учиться когда комментариев нету, да и весь код целиком я пока что никуда не выкладывал.

Я это вовсе не о Вас говорил. Мне по работе часто приходится разбираться со старым чужим кодом. И вот там бывает очень озадачиваешься...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Алексей Кабанов пишет:

    Ну это Вы зря) Просто для меня легче учиться когда комментариев нету...

Это Вы пока просто не поняли, как на самом деле легче учиться.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Сложно писать комментарии тем , кто программирует , как играет в рулетку. Пошло- не пошло. А почему и как это за пределами сознания.  Вот как ему писать комментарии , если у него сплошная угадайка. Или когда кто-то пишет за него код, например на каком-то форуме. 

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

Ладно, объясню проще. Зачем я буду писать коментарий например на pinMode(9, OUTPUT); если там и так все понятно, что мы настраиваем 9 пин как выход. Да и в соих скетчах я пока максимум if else использую.

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

Алексей Кабанов пишет:

Ладно, объясню проще. Зачем я буду писать коментарий например на pinMode(9, OUTPUT); если там и так все понятно, что мы настраиваем 9 пин как выход. Да и в соих скетчах я пока максимум if else использую.

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

Например:

digitalWrite(LED2, HIGH); // Подаём HIGH на LED2

комментарий совершенно мудацкий и бесполезный.

А вот если так:

digitalWrite(LED2, HIGH); // Включаем световой сигнал превышения температуры

то комменетарий говорит о том, что на самом деле делается и что совершенно не очевидно из кода.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
//#1
pinMode(9, OUTPUT);//что за пин 9 и почему он выход
//#2
pinMode(Led2Pin, OUTPUT);//так понятнее это светодиод и он выход
//#3
Led2.init();//а так еще понятнее есть светодиод и он иницируется

Но что делать если у вас это шаговый двигатель или последовательный порт

 

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

 Теперь Вы мне наконец объяснили что это такое) Спасибо!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Алексей Кабанов пишет:

Ладно, объясню проще. Зачем я буду писать коментарий например на pinMode(9, OUTPUT); если там и так все понятно, что мы настраиваем 9 пин как выход. Да и в соих скетчах я пока максимум if else использую.

Алексей Кабанов, из кода видно, что Вы делаете, а комментарий должен отражать, зачем Вы это делаете.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Затюкали человека! ;) Про меня ведь никто не скажет, что я не программист? ;)

Я очень мало комментирую. И до сих пор спокойно читаю свои еще учебные примеры от конца 80-х годов. и помню тип монитора, и даже наклейки на нем, а также как и почему у меня переменные i, j и k, уж простите.  Это называется эйдетическая память... люди разные бывают. Хотя вообще, в среднем, - комментарии полезны и даже необходимы.

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

Дык, классику  никто не отменял: «Настоящие программисты не нуждаются в комментариях : текст      программы все объясняет» 

b707
Offline
Зарегистрирован: 26.05.2017

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

Дык, классику  никто не отменял: «Настоящие программисты не нуждаются в комментариях : текст      программы все объясняет» 

мне оттуда понравилось -  "компиляторы с проверкой границ массива душат творчество"

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

А что, нет?

Алексей Кабанов
Offline
Зарегистрирован: 20.01.2018

Сейчас почти доделал другой код с SIM900. Там уже он нам говорит по телефону а не строчит смс-ки. Получилось что-то вроде DTMF управления. Код будет уже с комментариями)