#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
является таким модификатором длины и сообщает форматеру, что переменная, переданная, является along int
..
вводит точность и указываетint
, сколько цифр нужно напечатать по крайней мере (ld
имеет аналогичное значение: выровнять для двух символов и использовать0
в качестве символа заполнения; результат тот же…).4. @Марсельдомута
"S7:%ld.%.2ldV/S8:%ld.%.2ldV", v1/100, v10, v2/100, v20