Запись длинного целого числа в строку в виде символа* в функции Arduino

#c #arduino #nodemcu

Вопрос:

я борюсь с этой проблемой всю ночь напролет, и у меня ничего не получается… Я пробовал множество методов, основанных на Интернете, но я все еще заперт здесь.

Все, что я хочу, это написать число в середине строки символов, чтобы отобразить его на oled-экране с помощью nodemcu v3 на основе ESP8266. Это то, что я хочу видеть на своем экране: S7:3.55V

3.55 может быть числом от 3.02 до 4.87.

Фактическая ошибка заключается в: invalid conversion from 'long int' to 'char*' [-fpermissive]

 #include <Wire.h>
#include "OLED.h"
#include <sstream>
#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <locale>
        
OLED display(2, 14); //OLED Declarare SDA, SCL
long randNumber;

void setup() {
  Serial.begin(9600);
  Serial.println("OLED test!");

  // Initialize display
  display.begin();
  //display.off();
  //display.on();
  display.clear();
  delay(3*1000);
}

void loop() {
  randNumber = random(3.02, 4.87);

  display.print("S7:", 5);
  display.print(randNumber, 5);
  display.print("V", 5);
  //display.print("Banc: ", 7);
  //display.print(randNumber1, 7);
  //display.print("V", 7);
  delay(3*200);
}
 

Комментарии:

1. пожалуйста, добавьте ссылку на библиотеку OLED. хорошие библиотеки поддерживают печать номеров

2. Вы пробовали std::to_string()? display.print( ("S7:" std::to_string(5)).c_str()); ?

3. @AdrianMaire не работает

Ответ №1:

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

 randNumber = random(302, 487);
 

Не беспокойтесь о десятичных знаках, мы вернем их соответствующим форматированием (в любом случае, избегая плавающей точки, полностью избегаем в то же время целого ряда проблем, в основном связанных с округлением).

 char buffer[16];
snprintf
(
    buffer, sizeof(buffer),
    "S7:%ld.%.2ldV", randNumber / 100, randNumber % 100
//      ^3^ ^55 ^    ^------ 3 -----^  ^----- 55 -----^
);
 

Теперь просто распечатайте buffer

Альтернативы включают, например std::ostringstream , но они не так удобны (и не так эффективны), как старый добрый API C stdio:

 std::ostringstream buffer;
buffer << "S7:" << randNumber / 100 << '.'
       << std::setw(2) << std::setfill('0') << randNumber % 100 << 'V';
print(buffer.str().c_str());
 

Комментарии:

1. Спасибо, приятель, это потрясающе, я потратил более 12 часов, чтобы получить эту работу, я работаю с веб-кодами, но у вас нет проблем с такого рода конверсиями…

2. можете ли вы объяснить мне, что представляет собой «S7:%ld.%.2ldV» %.ld и %.2ld? Я хочу работать с примером: S7:3,55 В/S8:3,62 В, но я не могу заставить его работать.

3. @MarcelDomuta См. ссылку на вопрос: % вводит формат, в который будет вставлен текст ( %% вставляет знак процента), и d означает «десятичный вывод», если модификатор длины не используется int , должен быть передан. l является таким модификатором длины и сообщает форматеру, что переменная, переданная, является a long int . . вводит точность и указывает int , сколько цифр нужно напечатать по крайней мере ( ld имеет аналогичное значение: выровнять для двух символов и использовать 0 в качестве символа заполнения; результат тот же…).

4. @Марсельдомута "S7:%ld.%.2ldV/S8:%ld.%.2ldV", v1/100, v10, v2/100, v20