Взять сигнал с цифровых пинов и перевести в десятичное число ( ARDUINO)

martynovro@gmail.com
Offline
Зарегистрирован: 19.07.2017

Всем привет, народ в общем такая проблема, подключил прибор  на цифровые входы.

Прибор при подаче напряжения соотвественно выдаёт значения по на своих выходах соответственно либо 0 либо +5v (соответственно либо выводится значение в виде 0 или 1 ) 

void setup() 
{
  Serial.begin(9600);  // установка скорости работы серийного порта на 9600 бит/сек
}

void loop() {

      
   char output_string[25];      //создаём  массив
  
   sprintf ( output_string, "%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i", digitalRead(46), digitalRead(45), digitalRead(44), digitalRead(43), digitalRead(42), digitalRead(41), digitalRead(40), digitalRead(39), digitalRead(38), digitalRead(37), digitalRead(36), digitalRead(35), digitalRead(34), digitalRead(33), digitalRead(32), digitalRead(31), digitalRead(30), digitalRead(29), digitalRead(28), digitalRead(27), digitalRead(26), digitalRead(25), digitalRead(24), digitalRead(23), digitalRead(22)  );        //записываем в значение с pin 22, 23 и т.д
  
   Serial.println(output_string);                                              //вывести массив на экран

 
  delay(1000);                // задержка 1 сек.
}

выглядит это в работе вот так 

 

 

 

но хочется увидет нормальное число в десятичном виде , к примеру на 1 значении    

0010101010100100100101000     =  5589288 

помогите пожалуйста новичку в этом нелёгком деле)))))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Мда . Скоро будут спашивать на форуме как умножить 2 на 2. Эта нелегкая операция сломала мозг передовым новичкам Ардуино. Вы что школьник маладших классов?

  Теперь по теме. Есть бинарное число 0101 . Как это будет в десятичной системе 0*2(в степени)3+1*2(в степени)2+0*2(в степени)1+1*2(в степени)0

ПС: степень двойка это сдвиг влево (<<)

0*(0x1<<3)+1*(0x1<<2)+0*(0x1<<1)+1*(0x1<<0)

martynovro@gmail.com
Offline
Зарегистрирован: 19.07.2017

Я спрашиваю как это реализовать с помощью кода на arduino a  не сколько будет 2 на 2  

 

Теперь по теме, прибор  выводит число которое мне нужно преобразовать в десятичную систему счисления 

если тут сидят действительно умные ребята, подскажите КОД  а не примеры которые нужно решать и получать число 5

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
Serial.println((uint32_t)digitalRead(46) << 24 + digitalRead(45) << 23 + digitalRead(44) << 22 + digitalRead(43) << 21 + digitalRead(42) << 20 + digitalRead(41) << 19 + digitalRead(40) << 18 + digitalRead(39) << 17 + digitalRead(38) << 16 + digitalRead(37) << 15 + digitalRead(36) << 14 + digitalRead(35) << 13 + digitalRead(34) << 12 + digitalRead(33) << 11 + digitalRead(32) << 10 + digitalRead(31) << 9 + digitalRead(30) << 8 + digitalRead(29) << 7 + digitalRead(28) << 6 + digitalRead(27) << 5 + digitalRead(26) << 4 + digitalRead(25) << 3 + digitalRead(24) << 2 + digitalRead(23) << 1 + digitalRead(22));

 

martynovro@gmail.com
Offline
Зарегистрирован: 19.07.2017

qwone пишет:

Serial.println((uint32_t)digitalRead(46) << 24 + digitalRead(45) << 23 + digitalRead(44) << 22 + digitalRead(43) << 21 + digitalRead(42) << 20 + digitalRead(41) << 19 + digitalRead(40) << 18 + digitalRead(39) << 17 + digitalRead(38) << 16 + digitalRead(37) << 15 + digitalRead(36) << 14 + digitalRead(35) << 13 + digitalRead(34) << 12 + digitalRead(33) << 11 + digitalRead(32) << 10 + digitalRead(31) << 9 + digitalRead(30) << 8 + digitalRead(29) << 7 + digitalRead(28) << 6 + digitalRead(27) << 5 + digitalRead(26) << 4 + digitalRead(25) << 3 + digitalRead(24) << 2 + digitalRead(23) << 1 + digitalRead(22));

 

К сожалению код не работает, всегда выдает 0. И еще вопрос, как потом это число записать в переменную.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

martynovro@gmail.com пишет:

К сожалению код не работает, всегда выдает 0. И еще вопрос, как потом это число записать в переменную.

Начните с бета-тестирования. Возьмите код из 8 входов. Может у вас идет переполнение. Направление я вам дал. А дальше вы сами.

martynovro@gmail.com
Offline
Зарегистрирован: 19.07.2017

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

выводит совсем разные вещи:


void setup() 
{
  Serial.begin(9600);  // установка скорости работы серийного порта на 9600 бит/сек
}

void loop() {

      
   char output_string[25];      //создаём  массив
  
   sprintf ( output_string, "%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i", digitalRead(46), digitalRead(45), digitalRead(44), digitalRead(43), digitalRead(42), digitalRead(41), digitalRead(40), digitalRead(39), digitalRead(38), digitalRead(37), digitalRead(36), digitalRead(35), digitalRead(34), digitalRead(33), digitalRead(32), digitalRead(31), digitalRead(30), digitalRead(29), digitalRead(28), digitalRead(27), digitalRead(26), digitalRead(25), digitalRead(24), digitalRead(23), digitalRead(22)  );        //записываем в значение с pin 22, 23 и т.д
  
   Serial.println(output_string);                                              //вывести массив на экран

  int a =  digitalRead(46)*2^24 + digitalRead(45)*2^23 + digitalRead(44)*2^22; //+ digitalRead(43)*2^21 + digitalRead(42)*2^20 + digitalRead(41)*2^19 + digitalRead(40)*2^18 + digitalRead(39)*2^17 + digitalRead(38)*2^16 + digitalRead(37)*2^15 + digitalRead(36)*2^14 + digitalRead(35)*2^13 + digitalRead(34)*2^12 + digitalRead(33)*2^11 + digitalRead(32)*2^10 + digitalRead(31)*2^9 + digitalRead(30)*2^8 + digitalRead(29)*2^7 + digitalRead(28)*2^6 + digitalRead(27)*2^5 + digitalRead(26)*2^4 + digitalRead(25)*2^3 + digitalRead(24)*2^2 + digitalRead(23)*2 + digitalRead(22);
  Serial.println(a);  
  Serial.println((uint32_t)digitalRead(46) << 24 + digitalRead(45) << 23 + digitalRead(44) << 22); // + digitalRead(43) << 21 + digitalRead(42) << 20 + digitalRead(41) << 19 + digitalRead(40) << 18 + digitalRead(39) << 17 + digitalRead(38) << 16 + digitalRead(37) << 15 + digitalRead(36) << 14 + digitalRead(35) << 13 + digitalRead(34) << 12 + digitalRead(33) << 11 + digitalRead(32) << 10 + digitalRead(31) << 9 + digitalRead(30) << 8 + digitalRead(29) << 7 + digitalRead(28) << 6 + digitalRead(27) << 5 + digitalRead(26) << 4 + digitalRead(25) << 3 + digitalRead(24) << 2 + digitalRead(23) << 1 + digitalRead(22));
   
  delay(1000);                // задержка 1 сек.
}

Вот что рисует: 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Команда ^  в Си это исключающее ИЛИ . А вот и приходится 2 в степени n делать сдигом влево.

http://cppstudio.com/post/300/

https://habrahabr.ru/post/146793/ строка 14

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1. Порты подряд. поэтому проще.

uint32_t  zhopa = 0;

for (byte i=46; i>21;i++)    zhopa = (zhopa << 1) | digitalRead(i);

Serial.println (zhopa);

2. Квон, а зачем ты возишся с дураком, который тебе нахамил?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

2. Квон, а зачем ты возишся с дураком, который тебе нахамил?

Правильно! Пока не прочитал ответ, собирался уже было про скобки подсказать, но потом передумал.

Третий закон Ньютона никто не отменял: "Всякому взбрыкнувшему, да отбрыкнется, ибо нефиг!"

martynovro@gmail.com
Offline
Зарегистрирован: 19.07.2017

Спасибо большое!!!!

Только порты в обратном порядке обходить. Это все благодоря переменной zhopa, без нее ничего бы не получилось))

 


void setup() 
{
  Serial.begin(9600);  // установка скорости работы серийного порта на 9600 бит/сек
}

void loop() {

      
   char output_string[25];      //создаём  массив
  
   sprintf ( output_string, "%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i", digitalRead(46), digitalRead(45), digitalRead(44), digitalRead(43), digitalRead(42), digitalRead(41), digitalRead(40), digitalRead(39), digitalRead(38), digitalRead(37), digitalRead(36), digitalRead(35), digitalRead(34), digitalRead(33), digitalRead(32), digitalRead(31), digitalRead(30), digitalRead(29), digitalRead(28), digitalRead(27), digitalRead(26), digitalRead(25), digitalRead(24), digitalRead(23), digitalRead(22)  );        //записываем в значение с pin 22, 23 и т.д
  
   Serial.println(output_string);                                              //вывести массив на экран

 uint32_t  zhopa = 0;

for (byte i=46; i>21;i--)    zhopa = (zhopa << 1) | digitalRead(i);

Serial.println (zhopa);

   
  delay(1000);                // задержка 1 сек.
}

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

"Всякому взбрыкнувшему, да отбрыкнется, ибо нефиг!"

Хорошая формулировка! Главное - точная. Не удивлюсь, если сэр Исаак Ньютон примерно так и формулировал.