Обсуждаем контроллеры компании Atmel.
Ответить

Преобразование String to char не работает (

Сб сен 16, 2023 16:45:27

Доброго всем добрым.
Суть вопроса. Есть 7 сегментник, на который должна выводиться инфа в виде значения величины и названия этой величины, типа 120*С. Для управления 7сегментником используется библиотека ардуино SevSeg. Все это запихивается в Атмегу16. И собственно с выводом char на дисплей проблем нет. Проблема появляется когда я пытаюсь преобразовать строку в массив char, который должен передаться библиотеке для вывода на дисплей. В loop'e вот такой кусок кода не желает работать (
Код:
 static byte val =100;
 //char pointer[6] = "PAUSE";
 myString = "ESUAP";
  // Cycle to the next string every one second
  if (millis() > (timer + 1000)) {
    val ++;   
   myString = String(val+myString); 
   const char* pointer = myString.c_str(); 
    Serial.println(pointer);   
  sevseg.setChars(pointer);
    timer = millis();
  }
    sevseg.refreshDisplay(); // Must run repeatedly

преобразования из строки в символы не происходит, что видно (вернее не видно) и на дисплее и в выводе в консоль разумеется. Если строки со стрингами комменчу, а char раскомменчу -- вывод идет.
Буду очень благодарен за конструктивные мысли. Второй день бьюсь как рыба об асфальт.

Re: Преобразование String to char не работает (

Сб сен 16, 2023 17:49:01

с функции класа String? (5 + 1 символов)
Код:
if (millis() > (timer + 1000)) {
  val ++;
 
  myString = String(val + myString);
 
  char buf[6];
  myString.toCharArray(buf, 6);
 
  Serial.println(buf);
  sevseg.setChars(buf);
 
  timer = millis();
}

Re: Преобразование String to char не работает (

Сб сен 16, 2023 18:28:50

veso74, увы, нет (
Мистика какая-то...

Re: Преобразование String to char не работает (

Вс сен 17, 2023 11:20:07

В симуляторе работает.
Возможно, стек переполняется от таких тяжёлых операций.
Или UB может быть даже не в этом куске кода.

Re: Преобразование String to char не работает (

Вс сен 17, 2023 12:18:29

mont-oriol, да, в симуляторе работает. И про переполнение стека я уже подумал (
тогда вопрос по другому стоит, как к значению переменной прицепить строку символов и вывести это на дисплей. Пока не справился (((

Re: Преобразование String to char не работает (

Вс сен 17, 2023 12:53:41

https://wokwi.com/projects/376108925066553345

Re: Преобразование String to char не работает (

Вс сен 17, 2023 13:15:04

Если я правильно понял задачу из темы (ру->бг), то у меня либ. SevSeg работает и на симулятор, и на реальном устройстве. С классом String проблем нет - с внутренними функциями Arduino. Добавил знак C, использовал символа '^'. При "oC" по 7 seg LCD било "OC". Теперь "oC".

Тест: 12oC
Изображение
Вложения
temp_oC.zip
(41.03 KiB) Скачиваний: 16

Re: Преобразование String to char не работает (

Вс сен 17, 2023 15:36:27

mont-oriol, на строку strcpy(position, myString); ругается: Compilation error: invalid conversion from 'u8* {aka unsigned char*}' to 'char*' [-fpermissive]
а в вокви все компилируется и собирается.

Добавлено after 1 minute 6 seconds:
veso74, вот а у меня похоже на железе не желает работать со строками. Но такого быть не может.
как я понимаю, вся проблема в использовании MightyCore + Atmega16a

Re: Преобразование String to char не работает (

Вс сен 17, 2023 20:20:06

Работает на симуляторе и на ATmega16.

Думаю, первая возможная причина неработы в Вашем случае:
разница между реальными и относительными выводами МК в MightyCore: PIN_PA0, PIN_PA ...
Код:
// byte digitPins[] = {A0, A1, A2, A3};
byte digitPins[] = {PIN_PB0, PIN_PB1, PIN_PB2, PIN_PB3};

// byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};  // a, b, c, d, e, f, g, h
byte segmentPins[] = {PIN_PA0, PIN_PA1, PIN_PA2, PIN_PA3, PIN_PA4, PIN_PA5, PIN_PA6, PIN_PA7};  // a, b, c, d, e, f, g, h

Изображение
Вложения
atmega16.zip
(39.89 KiB) Скачиваний: 17

Re: Преобразование String to char не работает (

Пн сен 18, 2023 10:16:20

Ну и сложностей то для 7-сегментника...
Может достаточно сделать *.h файлик с объявлениями(или соответственно вставку в *.h файле класса индикатора), да использовать его "кодовую таблицу" в конкретном случае?
К примеру:
Спойлер
Код:
#define s_A 1 // значение номера сегмента A
#define s_B 7 // значение номера сегмента B
#define s_C 5 // значение номера сегмента C
#define s_D 4 // значение номера сегмента D
#define s_E 2 // значение номера сегмента E
#define s_F 0 // значение номера сегмента F
#define s_G 3 // значение номера сегмента G
#define s_H 6 // значение номера сегмента H

/* "кодовая страница кракозябр 7-сегментных"
 раскладка сегментов по символам определяется стандартной разметкой A-H
 по условию, что активный уровень(сегмент астивен/светится) принят за 1 */

#define fnt_bl 0
#define fnt_0 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F) // цифра 0 или символ "О"
#define fnt_1 (1<<s_B | 1<<s_C) // цифра 1
#define fnt_2 (1<<s_A | 1<<s_B | 1<<s_D | 1<<s_E | 1<<s_G) // цифра 2
#define fnt_3 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // цифра 3 или символ "Э/З"
#define fnt_4 (1<<s_B | 1<<s_C | 1<<s_F | 1<<s_G) // цифра 4 или символ "Ч"
#define fnt_5 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // цифра 5 или символ "S"
#define fnt_6 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // цифра 6
#define fnt_7 (1<<s_A | 1<<s_B | 1<<s_C) // цифра 7
#define fnt_8 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // цифра 8
#define fnt_9 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // цифра 9
#define fnt_A (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "A"
#define fnt_b (1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "b"
#define fnt_C (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F) // символ "C" (прямая скобка '[' )
#define fnt_d (1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_G) // символ "d"
#define fnt_E (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "E"
#define fnt_F (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G) // символ "F"
#define fnt_P (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G | 1<<s_B) // символ "P"
#define fnt_L (1<<s_E | 1<<s_F | 1<<s_D) // символ "L"
#define fnt_H (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "H"
#define fnt_U (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_D) // символ "U"
#define fnt_I (1<<s_E | 1<<s_F) // левая 1 или латинская I
#define fnt_S (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // аналог цифры 5
#define fnt_J (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E) // символ "J"
#define fnt_G (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F) // символ "G"
#define fnt_r (1<<s_G | 1<<s_E) // символ "r"
#define fnt_n (1<<s_G | 1<<s_E | 1<<s_C) // символ "п"
#define fnt_c (1<<s_G | 1<<s_E | 1<<s_D) // символ "с" или '<'
#define fnt_o (1<<s_G | 1<<s_E | 1<<s_D | 1<<s_C) // нижний кружок "о"
#define fnt_u (1<<s_C | 1<<s_E | 1<<s_D) // символ "u"
#define fnt_h (1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "h"
#define fnt_rusg (1<<s_A | 1<<s_E | 1<<s_F) // символ "Г"
#define fnt_rusP (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_B | 1<<s_C) // символ "П"
#define fnt_rus_iE (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // символ Э/З/цифра 3 (инверсное Е)
#define fnt_rusY (1<<s_F | 1<<s_G | 1<<s_B | 1<<s_C | 1<<s_D) // символ "У"
#define fnt_qest (1<<s_A | 1<<s_B | 1<<s_E | 1<<s_G) // символ "?"
#define fnt_rC (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D) // символ ']' (обратная скобка/"вывернутая С")
#define fnt_rc (1<<s_G | 1<<s_C | 1<<s_D) // символ '>'
#define fnt_gradus (1<<s_A | 1<<s_B | 1<<s_F | 1<<s_G) // верхний кружок "символ грвдуса"
#define fnt_minus (1<<s_G) // символ "-" (средняя черта)
#define fnt_aplin (1<<s_A) // символ "верхняя черта"
#define fnt_dnlin (1<<s_D) // символ "_" (нижняя черта)
#define fnt_trlin (1<<s_A | 1<<s_G | 1<<s_D) // символ "три черты"
#define fnt_coma (1<<s_H) // символ "," (децимальная точка)

Мне такой вариант больше нравится (и практически в своих конструкциях используется).
:tea:

Re: Преобразование String to char не работает (

Пн сен 18, 2023 21:16:58

В общем я так и не понял, с чем столкнулся. Но через sprintf все заработало и все выводится. Тема закрыта.
veso74, да, спасибо, я знаю, как выводы в MightyCore прописываются, когда-то прошел и по этим граблям )
BOB51, хм, да, может так и лучше и проще было бы. Надо будет как-то попробовать. Благодарю!

Re: Преобразование String to char не работает (

Ср сен 20, 2023 12:47:28

Никогда так
Код:
if (millis() > (timer + 1000)) ...

не делай. Делай так
Код:
if (millis() - timer > 1000) ...
Ответить