1

Topic: Вопрос по "текстовой строке"

Подскажите, как корректно вывести на экран температуру со значком градусов цельсия, например:  «t=-10.1 °С»?

2

Re: Вопрос по "текстовой строке"

Можно так

  
  float val = -10.1;
  char sval[7];  // сюда поместим число как строку, уесть максимально возможное 
                 // количество символов числа + один завершающий 0
  dtostrf(val, 0, 1, sval); // преобразуем число в строку
  sprintf (RemoteXY.text_1, "t=%s °С", sval); // собираем результирующую строку

3

Re: Вопрос по "текстовой строке"

В данный момент текстовая строка поддерживает 3 типа данных (текст, целое, вещественное). Мне кажется, было бы неплохо добавить варианты "дата" и "время". Либо м.б. вообще выделить в отдельный элемент управления с возможностью синхронизации времени с мобильного устройства?

4

Re: Вопрос по "текстовой строке"

klen wrote:

В данный момент текстовая строка поддерживает 3 типа данных (текст, целое, вещественное).

Вообще то вы не совсем правы. В текстовую строку вы можете вывести абсолютно любую информацию. И текстовая строка поддерживает только текст. Если вы хотите что то в нее вывести вам просто надо значение преобразовать в текст. Хоть числа, хоть время хоть вообще что угодно.

5

Re: Вопрос по "текстовой строке"

Прошу прощения, спутал тему, имел в виду не индикатор типа текстовая строка, а элемент управления "поле ввода".

6

Re: Вопрос по "текстовой строке"

Да, тогда вы правы. Все это запланировано.

7

Re: Вопрос по "текстовой строке"

remotexy wrote:

Можно так

  
  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.

8

Re: Вопрос по "текстовой строке"

Похоже ругается на какую то скобку. Проверьте.
}
^

9

Re: Вопрос по "текстовой строке"

remotexy wrote:

Похоже ругается на какую то скобку. Проверьте.
}
^


Эх, если бы было все так просто.
Попробовал я убрать из кода все лишнее...

Вот вариант А
____________________________________________________

//////////////////////////////////////////////
//        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!!!
Я могу отправить листинг на емайл, который указан в контактах? Поможете разобраться?

10

Re: Вопрос по "текстовой строке"

отправьте полный  первый листинг который не компилируется, на info@remotexy.com

11

Re: Вопрос по "текстовой строке"

Действительно непонятно.
Во многих местах пишут что ошибка компилятора. Но будем изучать эту штуку.
Вот такой код работает:

  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

12

Re: Вопрос по "текстовой строке"

Здравствуйте. А где можно прочитать про текстовые строки, с подробным описанием элементов? Например,
sprintf (temp, "t=%s °С", sval);, что такое t=%s ?

13

Re: Вопрос по "текстовой строке"

Добрый день. Сразу прошу прощения за простой вопрос, но что-то я совсем запутался.
Есть две переменные типа float (GPS координаты) и есть желание вывести их в одно тестовое поле с точностью в 4 знака после запятой, разделив символом ":".
Если честно я совсем запутался. Помогите пожалуйста.

14

Re: Вопрос по "текстовой строке"

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); // собираем результирующую строку

Что я делаю не так?

15

Re: Вопрос по "текстовой строке"

Что вы делаете не так:
1. Вы не учитываете количество символов, которое должно поместиться в строку после преобразования числа + завершающий 0. Выводимое число 10.1111 имеет 7 знаков + завершающий 0, итого требуется 8 байт для его хранения как строка. После такого преобразования у вас происходит затирание памяти которое расположено после переменной sval_1 , а что там располагается известно только компилятору, по этому скорее всего программа у вас будет непонятно глючить или просто виснуть. Это особенность языка С++ который не контролирует доступ к памяти, за этим должен следить программист. Выход, вы должны определить какое максимальное количество символов может иметь число после преобразования и добавить еще один символ для завершающего нуля. Возможно char sval_1 [8] будет достаточно если целая часть числа у вас всегда будет не более чем двузначная.
2. Из вашего примера не видно длину поля RemoteXY.text_1. Возможно ошибка та же что и описана в предыдущем пункте.

16 (edited by sergibus0 2018-11-08 17:22:38)

Re: Вопрос по "текстовой строке"

Спасибо, про завершающий символ я забыл:( теперь все работает.
Еще вопрос. А возможно организовать перенос строки?

17

Re: Вопрос по "текстовой строке"

sergibus0 wrote:

Еще вопрос. А возможно организовать перенос строки?

Текстовая строка в RemoteXY не поддерживает перенос. Но вы можете разместить на экране 2 строки друг под дружкой и реализовать перенос программно, т.е. разделить текст между этими строками на стороне Arduino.

18

Re: Вопрос по "текстовой строке"

Пытаюсь вывести данные с датчика 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 );

19

Re: Вопрос по "текстовой строке"

Victor Gokh wrote:

Пытаюсь вывести данные с датчика 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;

20

Re: Вопрос по "текстовой строке"

Доброго времени суток, я только начал осваивать 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'

21

Re: Вопрос по "текстовой строке"

Наверное так

 float Lat =  gps.location.lng();
 RemoteXY.Lat = Lat;

22

Re: Вопрос по "текстовой строке"

remotexy wrote:

Наверное так

 float Lat =  gps.location.lng();
 RemoteXY.Lat = Lat;

Помогло спасибо большое!!!!!

23

Re: Вопрос по "текстовой строке"

Добрый день. В элементах "Индикация" появились "фиксированные строки". Что они позволяют?

24

Re: Вопрос по "текстовой строке"

vmf0396 wrote:

Добрый день. В элементах "Индикация" появились "фиксированные строки". Что они позволяют?

Позволяют отображать заданные в редакторе строки по ее номеру. То есть в редакторе вы задаете несколько заранее определенных строк, каждой строке присваивается номер. Далее отображение строки осуществляется по ее номеру. В самой программе вам не нужно манипулировать строками, только присвоить в соответствующую переменную номер строки. Так же у этого элемента есть возможность отображать строки разными цветами и с мерцанием.