ARDUINO НЕ получается перевести int в 16ричный код

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
Никак не могу перевести массив, в 16ричный код (HEX) пробывал разные функции atoi(), print(int d, HEX), Не получается, видать еще знаний не хватает. Помогите написать код при котором можно было бы перевести целый массив из {int} в {HEX}.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
int, он же int16_t это 2 байта, аналоги word и uint16_t , просто так перевести не получиться, т.к. будет на выходе 2 байта
пример (могут быть очепятки)
int a=1234;
Serial.println(hibyte(a),HEX);
Serial.println(lobyte(a),HEX);

пардону просим
highByte и lowByte
 
Изменено:

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
@Старик Похабыч, а что означают hibyte и lobyte ?? как их объявить чтобы ардуино ошибку не выдавала

@Старик Похабыч, даже если это непросто, надо это какнибуть сделать, может надо перевести int в другой тип данных а потом уже в HEX Т.е. перевести "1" в "2" и потом "2" в "3" если "1" в "3" не получается.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
код покажи
для чего нужно переводить в хекс
что конкретно не получается
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Сейчас подумалось.. ты же собираешься передавать массив куда то по ИР ? Тогда его не надо никуда переводить. примерно так надо делать
Пример побайтового получения массива любого типа при его известной длине
C++:
void setup() {
  Serial.begin(115200);

  int16_t a[10];
  for (int i = 0; i < 10; i++) a[i] = i + 0xF00;

  for (int i = 0; i < 10; i++)
  {    
    Serial.print(i * 2); Serial.print(" ");
    Serial.println(lowByte(a[i]), HEX);
    Serial.print(i * 2 + 1); Serial.print(" "); 
    Serial.println(highByte(a[i]), HEX);
  }


  void  *p;
  byte  *b;
  for (int i = 0; i < 20; i++)
  {
    p = &a;
    b = p + i;
    Serial.print(i); Serial.print(" "); Serial.println(*b, HEX);
  }
}

void loop() {

}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
число из 2-х байт состоит соотв из 2-х байт . В памяти машины идет сначала младший байт, потом старший. подряд. Вот lowByte берет и возвращает младший байт из 2-х, а highByte сотв. старший из них
Если взять число 1234 десятичной, то в 16-тиричном (HEX) это будет 0x4D2, или 0x04D2 , первые 2 символа после х будут старшим байтом, вторые младшим.
Надо почитать про типы данных, про приведение типов данных, в ардуино это важно.
 

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
@kalobyte, идея была сделать универсальный ИК пульт для теликов для этого я создал массив с кнопкой (вкл/выкл) всеми кодами всех моделей самых популярных фирм(производящих теливизоры). И теперь когда у меня есть массив с 262 кодами мне осталось сделать скетч который будет отправлять все коды сразу по нажатию кнопки, 1на из команд должна совпасть с моделью и фирмой телика и он включится, вот и все.
Вот скетч с массивом в котором нет перевода команд в 16-ричный код:только это с другой библиотекой <iarduino_IR_TX.h> но с<IRremote.h> все также
Код:
#include <iarduino_IR_TX.h> // Подключаем библиотеку для работы с ИК-передатчиком

iarduino_IR_TX VD(3);                           // Объявляем объект VD, с указанием вывода к которому подключён ИК-передатчик

#define KNOPKA 4
int i;

long IRKOD[262] = {1886400719,2060,2104283268,1748927655,1886441519,1343725261,3760134375,150464535,1347471415,1253111735,2139103455,1489765503,1513021984,4040217529,1342195895,3508483647,231122154,1605908995,1253111734,3225389175,2151645311,1886394599,3453223426,3001999165,37011519,2160054829,948321234,33772793023,760177215,521148,2151627716,3204497471,765,2139099375,1036,266,1159799096,551489775,1353664695,808513551,5261495,1886398679,484653255,// Skyworth
50153655,439282747,2279751656,16599223,33706159,83611695,57920,1253111733,2640,3632348110,1005081847,1227075914,150465300,404236503,1086128893,3661031989,2154776759,3406284169,1637937167,3523411613,284139615,268926924,948321216,4119634611,269494487,150465045,404275263,16767780,2314,24735,3852,// Changhong
1785214238,2163993364,3458190813,638357837,2718,1000942312,1399796941,12419199,15900885,251,670174664,2367646678,538988719,3293339691,1784189340,3463797075,269531207,5327595,3492688343,1694209891,266129557,715691574,25500,10,26953732,1728190415,1113853081,1834108717,587707462,1739866022,3715417204,// TCL
16625743,2964377647,578188867,3739558593,1886449679,2964334807,2021932000,284147775,3687369586,183887895,269537327,3017984774,4044791248,15,1485126606,5100,417796335,2155870725,3144356351,1811833503,126951420, 3495159679,1437219015,1746124356,3292251450,// Hisense 
4294967295,2558737358,12,6900075,3213233058,2700226522,632192736,1585441465,2450777483,2400927396,1748927652,2322927855,316608446,2973446341,1886435399,1180920037,1886439479,1804,1666702765,16747125,// Konka
2953034022,14565567,22661,2573258210,23460,2511533658,3485903126,1347469375,8415,1162296347,3520202813,80977303,357597875,607247483,63616,3225407535,3071,146077703,3095542774,948321270,8338372,50153910,1347432655,117030975,601626855,2832429418,32893,861715983,1347473455,3656214832,// Haier
2063,1988738625,16203967,16722135,2667420038,65548,53295,2070630320,2771826017,48173295,2213170915,1988713125,3515671822,2904342265,// LG
4105841032,591444258,599379270,760337332,3571254145,22440,2218112003,2159240733,83484703,1207170375,2425372863,1014218515,2104,3369595,50137335,269541407,1886404799,1886412959,// Samsung
4045713590,2704,83577015,3005124158,949214399,2415644012,443635959,63723,// Sony
902678031,16711935,// LeTV
1834818995,1663209486,2124,361280051,1107511479,13894652,1641433271,4084651061,1907846131,988077253,1012752676,106876078,3700375706,3810277575,1695869754,4252373472,550584925,252938136,// Sharp
9705150,1831695434,314209047,2678192276,1319450119,56,2062,2085,100,1931967485,4170951387,63,4121759424,3812099359,// Philips
4129172055,4094,1732705879,403429887,2568604917,1722856977,16582903,2558578416};  //Panasonic

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); // подключаем монитор порта
pinMode(KNOPKA,INPUT_PULLUP);

Serial.println(IRKOD[0]);

}
void loop() {
  // put your main code here, to run repeatedly:

//irsend.sendNEC(9050,38);
if(KNOPKA,HIGH)
{
if(IRKOD[i]=="2558578416")
{//ничего не происходит
  }else{
  VD.begin();                 // Инициируем работу с ИК-передатчиком
  VD.send(IRKOD[i]);  //отправка каждого кода массива
  i++;
}
}
}


Вот код с библиотекой <IRremote.h>
Код:
#include <IRremote.h>
IRsend irsend;                         // Объявляем объект VD, с указанием вывода к которому подключён ИК-передатчик

#define KNOPKA 4
int i;

unsigned int IRKOD[262] = {1886400719,2060,2104283268,1748927655,1886441519,1343725261,3760134375,150464535,1347471415,1253111735,2139103455,1489765503,1513021984,4040217529,1342195895,3508483647,231122154,1605908995,1253111734,3225389175,2151645311,1886394599,3453223426,3001999165,37011519,2160054829,948321234,33772793023,760177215,521148,2151627716,3204497471,765,2139099375,1036,266,1159799096,551489775,1353664695,808513551,5261495,1886398679,484653255,// Skyworth
50153655,439282747,2279751656,16599223,33706159,83611695,57920,1253111733,2640,3632348110,1005081847,1227075914,150465300,404236503,1086128893,3661031989,2154776759,3406284169,1637937167,3523411613,284139615,268926924,948321216,4119634611,269494487,150465045,404275263,16767780,2314,24735,3852,// Changhong
1785214238,2163993364,3458190813,638357837,2718,1000942312,1399796941,12419199,15900885,251,670174664,2367646678,538988719,3293339691,1784189340,3463797075,269531207,5327595,3492688343,1694209891,266129557,715691574,25500,10,26953732,1728190415,1113853081,1834108717,587707462,1739866022,3715417204,// TCL
16625743,2964377647,578188867,3739558593,1886449679,2964334807,2021932000,284147775,3687369586,183887895,269537327,3017984774,4044791248,15,1485126606,5100,417796335,2155870725,3144356351,1811833503,126951420, 3495159679,1437219015,1746124356,3292251450,// Hisense 
4294967295,2558737358,12,6900075,3213233058,2700226522,632192736,1585441465,2450777483,2400927396,1748927652,2322927855,316608446,2973446341,1886435399,1180920037,1886439479,1804,1666702765,16747125,// Konka
2953034022,14565567,22661,2573258210,23460,2511533658,3485903126,1347469375,8415,1162296347,3520202813,80977303,357597875,607247483,63616,3225407535,3071,146077703,3095542774,948321270,8338372,50153910,1347432655,117030975,601626855,2832429418,32893,861715983,1347473455,3656214832,// Haier
2063,1988738625,16203967,16722135,2667420038,65548,53295,2070630320,2771826017,48173295,2213170915,1988713125,3515671822,2904342265,// LG
4105841032,591444258,599379270,760337332,3571254145,22440,2218112003,2159240733,83484703,1207170375,2425372863,1014218515,2104,3369595,50137335,269541407,1886404799,1886412959,// Samsung
4045713590,2704,83577015,3005124158,949214399,2415644012,443635959,63723,// Sony
902678031,16711935,// LeTV
1834818995,1663209486,2124,361280051,1107511479,13894652,1641433271,4084651061,1907846131,988077253,1012752676,106876078,3700375706,3810277575,1695869754,4252373472,550584925,252938136,// Sharp
9705150,1831695434,314209047,2678192276,1319450119,56,2062,2085,100,1931967485,4170951387,63,4121759424,3812099359,// Philips
4129172055,4094,1732705879,403429887,2568604917,1722856977,16582903,2558578416};  //Panasonic

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); // подключаем монитор порта
pinMode(KNOPKA,INPUT_PULLUP);

Serial.println(IRKOD[0]);

}
void loop() {
  // put your main code here, to run repeatedly:

//irsend.sendNEC(9050,38);
if(KNOPKA,HIGH)
{
if(IRKOD[i]=="2558578416")
{//ничего не происходит
  }else{                 // Инициируем работу с ИК-передатчиком
  irsend.sendRaw(IRKOD[i]);  //отправка каждого кода массива
  i++;
}
}
}
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
нет, я имею ввиду тип данных. unsigneb int НЕ подходит.
https://alexgyver.ru/lessons/variables-types/#переменные
попробуй вывести в монитор порта несколько 1-ых элементов массива и сравни с тем, что ты хотел получить

@veniamin,
@Старик Похабыч, вы имеете виду посавить long IRKOD[262] =…..
Да , тут лонг должно помочь
я последнее время и для совместимости с другими контроллерами предпочитаю вместо byte int писать uiny8_t int16_t
long будет int32_t, но т.к. знака быть не должно лучше uint32_t
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
у тебя это не будет работать, даже если ты правильно выведеш код
есть несколько систем кодов с разными стандартами и разными частотами несущих
поэтому нельзя все коды сваливать в одну кучу

потом у тебя все коды хранятся в озу и тип данных в 2 байта * 262 = 1048 байт озу займет, что уже половина
такие массивы надо хранить во флеш памяти и для этого ставят модифиатор прогмем, в адруине вроде там это упрощено, что-то я не помню уже
вроде макрос был целый

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

так же это не будет работать по причине разной длины кодов, точнее технически там впереди стоят нули и длина одинаковая, но вроде как я ни разу не видел нулей впереди, как раз все забивается фф

т.е. длина кода одного стандарта пультов всегда одинакова
вот коды с одного пульта ргб светодиодного контроллера, система кодирования нек

C++:
on              0xFFB04F
off             0xFFF807
bright down     0xFFB847
bright up       0xFF906F
red             0xFF9867
green           0xFFD827
blue            0xFF8877
white           0xFFA857
flash           0xFFB24D
strobe          0xFF00FF
fade            0xFF58A7
smooth          0xFF30CF       

colors
r                     g                         b
0xFFE817                0xFF48B7                0xFF6897
0xFF02FD                0xFF32CD                0xFF20DF
0xFF50AF                0xFF7887                0xFF708F
0xFF38C7                0xFF28D7                0xFFF00F
 

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
@kalobyte, я вас понял, но если уменьшить число кодов до допустимого (или подключить флешку) и создать несколько массивов под каждого производителя и с соответствующим производителю протоколом, поочереди выводить через ИК светодиод. коды в этом случае будут уже 16ричном виде. ведь так должно сработать ??
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
1) Возможность излучать на определенной частоте зависит от типа ик излучателя. если он рассчитан на 38 кгц, то на 25 уже работать не заставишь
2) пусть а=16, b=0xF , тогда a будет равна всегда. Перевод из системы в систему нужен только для человека, внутри все храниться одинаково.

А вообще посылать все возможные коды мне не кажется правильной идеей.
 
  • Лойс +1
Реакции: te238s

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
эх Идея была очень даже хорошой.
ее можно воплотить имея передатчики разных частот и протоколы производителей, покачто оставлю этот проект, когда знаний наберусь попробую его воплотить.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
там нет передатчиков разных частот
несущие частоты генерируются самим контроллером и для разных моделей теликов могут быть разными
недостаточно знать коды пультов, надо знать протокол и несущую
https://www.radiokot.ru/articles/14/
 

CBEY

✩✩✩✩✩✩✩
25 Сен 2022
6
0
@Старик Похабыч, приветствую, снова я. Еще не поможете с переводом в 16-ю систему. В общем из последовательного порта в переменную i приходит число от 0 до 12 в десятичном формате. Далее эту переменную нужно вставить на место третьего элемента в том же формате (тобишь перевести это i в 16ричную систему) и передать в массив. Подскажите пожалуйста, как это можно осуществить ?
Далее весь массив передается на устройство, которое считывает и выполняет эту команду.
C++:
byte message_2[] = {0xE0, 0x83, сюда, 0x69};
int i; // число от 0 до 12
Serial_2.write(message_2, sizeof(message_2));
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Если i гарантировано от 0 до 12, то ничего никуда переводить не надо. В машине все числа (если они числа, а не строковое представление чисел) хранятся в одном формате. Достаточно просто написать:
message_2[2]=(byte)i;
Или
message_2[2]=(byta)i%256;
если есть подозрение, что число вдруг будет больше 255
 

CBEY

✩✩✩✩✩✩✩
25 Сен 2022
6
0
@Старик Похабыч, спасибо сколько искал не натыкался на подобное,а ну значит в том числе и этот элемент придет на драйвер в 16ричном формате. А вообще если массив из
byte например в десятичной системе, то есть ли метод для перевода в туже 16ю например?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Машины все (мк, пк, телефоны) все хранят в двоичном виде в принципе. Все остальное -представления для нас, человеков.
Что бы выводить в нудном формате например в монитор порта пишут так:
Serial.println(число, фомат);
Но опять же - это то только формат вывода, число не меняется физически.... кажется я это уже несколько раз говорил.
 
  • Лойс +1
Реакции: CBEY и te238s