Topic: Вопрос по "текстовой строке"
Подскажите, как корректно вывести на экран температуру со значком градусов цельсия, например: «t=-10.1 °С»?
You are not logged in. Please login or register.
RemoteXY community → Программирование → Вопрос по "текстовой строке"
Подскажите, как корректно вывести на экран температуру со значком градусов цельсия, например: «t=-10.1 °С»?
Можно так
float val = -10.1;
char sval[7]; // сюда поместим число как строку, уесть максимально возможное
// количество символов числа + один завершающий 0
dtostrf(val, 0, 1, sval); // преобразуем число в строку
sprintf (RemoteXY.text_1, "t=%s °С", sval); // собираем результирующую строкуВ данный момент текстовая строка поддерживает 3 типа данных (текст, целое, вещественное). Мне кажется, было бы неплохо добавить варианты "дата" и "время". Либо м.б. вообще выделить в отдельный элемент управления с возможностью синхронизации времени с мобильного устройства?
В данный момент текстовая строка поддерживает 3 типа данных (текст, целое, вещественное).
Вообще то вы не совсем правы. В текстовую строку вы можете вывести абсолютно любую информацию. И текстовая строка поддерживает только текст. Если вы хотите что то в нее вывести вам просто надо значение преобразовать в текст. Хоть числа, хоть время хоть вообще что угодно.
Прошу прощения, спутал тему, имел в виду не индикатор типа текстовая строка, а элемент управления "поле ввода".
Да, тогда вы правы. Все это запланировано.
Можно так
float val = -10.1; char sval[7]; // сюда поместим число как строку, уесть максимально возможное // количество символов числа + один завершающий 0 dtostrf(val, 0, 1, sval); // преобразуем число в строку sprintf (RemoteXY.text_1, "t=%s °С", sval); // собираем результирующую строку
с "dtostrf" - все нормально. а вот "sprintf" - в листинге программы подсвечивается ... и при компиляции выдает ошибку:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill in class 'NO_REGS'
}
^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: this is the insn:
(insn 1326 1323 1329 123 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8])
(subreg:QI (reg/f:HI 1365) 1)) W:\Users\KRV\Documents\2017\SharePoint\Внутренний сайт - Файлы\Умный дом\Arduino\ArdM\ArdM.ino:707 1 {pushqi1}
(expr_list:REG_ARGS_SIZE (const_int 5 [0x5])
(nil)))
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing out
lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status
c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
Похоже ругается на какую то скобку. Проверьте.
}
^
Похоже ругается на какую то скобку. Проверьте.
}
^
Эх, если бы было все так просто.
Попробовал я убрать из кода все лишнее...
Вот вариант А
____________________________________________________
//////////////////////////////////////////////
// RemoteXY include library //
//////////////////////////////////////////////
... для экономии места на форуме убрал
/////////////////////////////////////////////
// END RemoteXY include //
/////////////////////////////////////////////
void setup()
{
RemoteXY_Init ();
}
void loop() {
RemoteXY_Handler ();
float val = -10.1;
char sval[7]; // сюда поместим число как строку, уесть максимально возможное
// количество символов числа + один завершающий 0
dtostrf(val, 0, 1, RemoteXY.text_temp_int);
// dtostrf(val, 0, 1, sval); // преобразуем число в строку
// sprintf (RemoteXY.text_temp_int, "t=%s °С", sval); // собираем результирующую строку
}
_______________________________________________
в таком варианте все ок
Две последние строчки снимаем открываем, получаем вариант B:
_______________________________________________
//////////////////////////////////////////////
// RemoteXY include library //
//////////////////////////////////////////////
... для экономии места на форуме убрал
/////////////////////////////////////////////
// END RemoteXY include //
/////////////////////////////////////////////
void setup()
{
RemoteXY_Init ();
}
void loop() {
RemoteXY_Handler ();
float val = -10.1;
char sval[7]; // сюда поместим число как строку, уесть максимально возможное
// количество символов числа + один завершающий 0
// dtostrf(val, 0, 1, RemoteXY.text_temp_int);
dtostrf(val, 0, 1, sval); // преобразуем число в строку
sprintf (RemoteXY.text_temp_int, "t=%s °С", sval); // собираем результирующую строку
}
__________________________________________
и после компиляции получаем следующее сообщение
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill in class 'NO_REGS'
}
^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: this is the insn:
(insn 819 816 822 48 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8])
(subreg:QI (reg/f:HI 470) 1)) D:\Документы\Arduino\Test\Test\Test.ino:189 1 {pushqi1}
(expr_list:REG_ARGS_SIZE (const_int 5 [0x5])
(nil)))
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing out
lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status
c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: error: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
______________________________________________
Капаем дальше. Теперь решил вообще с 0 собрать маленький проект
_______________________________________________
//////////////////////////////////////////////
// RemoteXY include library //
//////////////////////////////////////////////
... Тут другой текст
/////////////////////////////////////////////
// END RemoteXY include //
/////////////////////////////////////////////
void setup()
{
RemoteXY_Init ();
}
void loop() {
RemoteXY_Handler ();
float val = -10.1;
char sval[7]; // сюда поместим число как строку, уесть максимально возможное
// количество символов числа + один завершающий 0
dtostrf(val, 0, 1, sval); // преобразуем число в строку
sprintf (RemoteXY.text_temp_int, "t=%s °С", sval); // собираем результирующую строку
}
______________________________________________________
В таком варианте все работает.
А это значит, что ошибка где то во фрагменте RemoteXY include!!!
Я могу отправить листинг на емайл, который указан в контактах? Поможете разобраться?
отправьте полный первый листинг который не компилируется, на info@remotexy.com
Действительно непонятно.
Во многих местах пишут что ошибка компилятора. Но будем изучать эту штуку.
Вот такой код работает:
float val = -10.1;
char sval[7];
char temp[20];
dtostrf (val, 0, 1, sval); // преобразуем число в строку
sprintf (temp, "t=%s °С", sval); // собираем результирующую строку
strcpy (RemoteXY.text_temp_int, temp); // копируем строку в переменную RemoteXYЗдравствуйте. А где можно прочитать про текстовые строки, с подробным описанием элементов? Например,
sprintf (temp, "t=%s °С", sval);, что такое t=%s ?
Добрый день. Сразу прошу прощения за простой вопрос, но что-то я совсем запутался.
Есть две переменные типа float (GPS координаты) и есть желание вывести их в одно тестовое поле с точностью в 4 знака после запятой, разделив символом ":".
Если честно я совсем запутался. Помогите пожалуйста.
float val_1 = 10.1111;
float val_2 = 20.22221;
char sval_1 [7];
char sval_2 [7];
dtostrf (val_1, 7, 4, sval_1); // преобразуем число в строку
dtostrf (val_2, 7, 4, sval_2);
sprintf (RemoteXY.text_1, "%s : %s ", sval_1, sval_2); // собираем результирующую строку
Что я делаю не так?
Что вы делаете не так:
1. Вы не учитываете количество символов, которое должно поместиться в строку после преобразования числа + завершающий 0. Выводимое число 10.1111 имеет 7 знаков + завершающий 0, итого требуется 8 байт для его хранения как строка. После такого преобразования у вас происходит затирание памяти которое расположено после переменной sval_1 , а что там располагается известно только компилятору, по этому скорее всего программа у вас будет непонятно глючить или просто виснуть. Это особенность языка С++ который не контролирует доступ к памяти, за этим должен следить программист. Выход, вы должны определить какое максимальное количество символов может иметь число после преобразования и добавить еще один символ для завершающего нуля. Возможно char sval_1 [8] будет достаточно если целая часть числа у вас всегда будет не более чем двузначная.
2. Из вашего примера не видно длину поля RemoteXY.text_1. Возможно ошибка та же что и описана в предыдущем пункте.
Спасибо, про завершающий символ я забыл:( теперь все работает.
Еще вопрос. А возможно организовать перенос строки?
Еще вопрос. А возможно организовать перенос строки?
Текстовая строка в RemoteXY не поддерживает перенос. Но вы можете разместить на экране 2 строки друг под дружкой и реализовать перенос программно, т.е. разделить текст между этими строками на стороне Arduino.
Пытаюсь вывести данные с датчика DS18B20 через облако.
В сериале данные вижу, но они не попадают в рамку индикации текста на смартфон
подскажите где ошибаюсь :
// char temp1 ; // это лишнее
char text_1[6]; \
uint8_t connect_flag;
RemoteXY_Handler();
sensors.requestTemperatures();
float temp1 = sensors.getTempC(sensor );
Serial.println(temp1);
//преобразование данных датчика в строку:
dtostrf( temp1, 6, 2, RemoteXY.text_1 );
Пытаюсь вывести данные с датчика DS18B20 через облако.
В сериале данные вижу, но они не попадают в рамку индикации текста на смартфон
подскажите где ошибаюсь :// char temp1 ; // это лишнее
char text_1[6]; \
uint8_t connect_flag;RemoteXY_Handler();
sensors.requestTemperatures();
float temp1 = sensors.getTempC(sensor );
Serial.println(temp1);
//преобразование данных датчика в строку:
dtostrf( temp1, 6, 2, RemoteXY.text_1 );
Проверьте какой тип переменной вы назначили для RemoteXY.text_1.
Сейчас можно назначить тип Float и не делать преобразование в строку. Достаточно будет так:
RemoteXY.text_1 = temp1;Доброго времени суток, я только начал осваивать arduino, в простой форме можете мне рассказать как вывести показания широты и долготы gps модуля в текстовые строки, заранее благодарен!!!
Вот скетч:
#define REMOTEXY_MODE__WIFI_CLOUD
#include <ESP8266WiFi.h>
// настройки соединения
#define REMOTEXY_WIFI_SSID "Xiaomi_A95D"
#define REMOTEXY_WIFI_PASSWORD "15052021"
#define REMOTEXY_CLOUD_SERVER "cloud.remotexy.com"
#define REMOTEXY_CLOUD_PORT 6376
#define REMOTEXY_CLOUD_TOKEN "3845eb606e03b44c8809bdb236878518"
#define REMOTEXY_ACCESS_PASSWORD "76k76k87Kk/"
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
// Define the RX and TX pins for Software Serial 2
#define RX 12
#define TX 14
#define GPS_BAUD 9600
// The TinyGPS++ object
TinyGPSPlus gps;
// Create an instance of Software Serial
SoftwareSerial gpsSerial(RX, TX);
#include <RemoteXY.h>
// конфигурация интерфейса RemoteXY
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] = // 145 bytes
{ 255,3,0,17,0,138,0,19,0,0,0,75,97,116,101,114,0,0,1,200,
84,1,1,7,0,5,127,7,68,68,35,1,26,31,73,3,3,7,17,4,
128,0,2,26,0,0,0,0,0,0,200,66,0,0,0,0,72,16,4,20,
20,12,166,140,2,26,0,0,0,0,0,0,200,66,0,0,0,0,67,2,
35,67,8,78,2,26,7,67,2,48,67,8,78,2,26,7,2,5,69,25,
10,0,2,26,31,31,79,78,0,79,70,70,0,71,37,253,36,36,56,0,
2,24,135,0,0,0,0,0,0,240,65,0,0,160,65,0,0,32,65,0,
0,0,64,24,0 };
// структура определяет все переменные и события вашего интерфейса управления
struct {
// input variables
int8_t joystick_01_x; // oт -100 до 100
int8_t joystick_01_y; // oт -100 до 100
uint8_t switch_01; // =1 если переключатель включен и =0 если отключен
// output variables
float linearbar_01; // oт 0 до 100
int8_t circularBar_01; // oт 0 до 100
float Lat; //текстовое поле
float Long; //текстовое поле
float instrument_01; // oт 0 до 30
// other variable
uint8_t connect_flag; // =1 if wire connected, else =0
} RemoteXY;
#pragma pack(pop)
/////////////////////////////////////////////
// END RemoteXY include //
/////////////////////////////////////////////
void setup()
{
RemoteXY_Init ();
// Serial Monitor
Serial.begin(115200);
// TODO you setup code
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD);
Serial.println("Software Serial started at 9600 baud rate");
}
void loop()
{
RemoteXY_Handler ();
// TODO you loop code
// используйте структуру RemoteXY для передачи данных
// не используйте функцию delay(), вместо нее используйте RemoteXY_delay()
// This sketch displays information every time a new sentence is correctly encoded.
unsigned long start = millis();
while (millis() - start < 1000) {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (gps.location.isUpdated()) {
float Lat = gps.location.lng();
char sLat[7]; // сюда поместим число как строку, уесть максимально возможное
// количество символов числа + один завершающий 0
dtostrf(float, 0, 1, Lat); // преобразуем число в строку
sprintf (Lat, "Latitude", sLat); // собираем результирующую строку
}
}
}
Постоянно ругается:
C:\Users\dabyleman\AppData\Local\Temp\.arduinoIDE-unsaved2025021-16964-6xsvqq.u1brt\sketch_jan21a\sketch_jan21a.ino: In function 'void loop()':
C:\Users\dabyleman\AppData\Local\Temp\.arduinoIDE-unsaved2025021-16964-6xsvqq.u1brt\sketch_jan21a\sketch_jan21a.ino:130:15: error: expected primary-expression before 'float'
130 | dtostrf(float, 0, 1, Lat); // преобразуем число в строку
| ^~~~~
C:\Users\dabyleman\AppData\Local\Temp\.arduinoIDE-unsaved2025021-16964-6xsvqq.u1brt\sketch_jan21a\sketch_jan21a.ino:131:16: error: cannot convert 'float' to 'char*'
131 | sprintf (Lat, "Latitude", sLat); // собираем результирующую строку
| ^~~
| |
| float
In file included from C:\Users\dabyleman\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266/Arduino.h:32,
from C:\Users\dabyleman\AppData\Local\arduino\sketches\5611DCF2603067C3E34744011A86139B\sketch\sketch_jan21a.ino.cpp:1:
c:\users\dabyleman\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\3.1.0-gcc10.3-e5f9fec\xtensa-lx106-elf\include\stdio.h:244:14: note: initializing argument 1 of 'int sprintf(char*, const char*, ...)'
244 | int sprintf (char *__restrict, const char *__restrict, ...)
| ^~~~~~
exit status 1
Compilation error: expected primary-expression before 'float'
Наверное так
float Lat = gps.location.lng();
RemoteXY.Lat = Lat;Наверное так
float Lat = gps.location.lng(); RemoteXY.Lat = Lat;
Помогло спасибо большое!!!!!
Добрый день. В элементах "Индикация" появились "фиксированные строки". Что они позволяют?
Добрый день. В элементах "Индикация" появились "фиксированные строки". Что они позволяют?
Позволяют отображать заданные в редакторе строки по ее номеру. То есть в редакторе вы задаете несколько заранее определенных строк, каждой строке присваивается номер. Далее отображение строки осуществляется по ее номеру. В самой программе вам не нужно манипулировать строками, только присвоить в соответствующую переменную номер строки. Так же у этого элемента есть возможность отображать строки разными цветами и с мерцанием.
RemoteXY community → Программирование → Вопрос по "текстовой строке"
Powered by PunBB, supported by Informer Technologies, Inc.