Передать с аппаратного ком порта байт - считать и сравнить с массивом

ard-20
Offline
Зарегистрирован: 05.10.2020

Передать с аппаратного ком порта байт - считать и сравнить с массивом и согласно номеру в массиве зажечь светодиод на определенном пине.

sadman41
Offline
Зарегистрирован: 19.10.2016

Продолжайте, мы пристально следим за развитием событий.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Интересная тема, слежу с удовольствием.

Еще можно Не передавать байт и Не сравнивать его ни с чем и Тоже зажечь светодиод. 

ard-20
Offline
Зарегистрирован: 05.10.2020

Подскажите как с аппаратного ком порта можно послать байт в виде 0b00000001 затем его считать и сравнить с массивом байтов и согласно номеру в массиве зажечь светодиод. И как вывести его назад в ком порт.

Пока навоял только это:


const int ButtonPins[] = {23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53};   //Обозначаем порты кнопок
const int LedPins[] =    {22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52};              //Обозначаем порты светодиодов
const int NumButtons= 16;                                   //количество кнопок
const int NumledPins= 16;                                   //количество светодиодов   
                                             //Светодиод
int Button = 0;                                             //Кнопка
byte f;

byte lastButton[] =   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte currentButton[] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte ledOn[] =        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
byte ledoff[] =       {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte Floor[10]=
{
  0b00000001,//1
  0b00000010,//2
  0b00000011,//3
  0b00000100,//4
  0b00000101,//5
  0b00000110,//6
  0b00000111,//7
  0b00001000,//8
  0b00001001,//9
  0b00001011,//10
};


void setup() {
   setupButtons();               
   setupLimitSwitch();

   Serial.begin(9600);
}

void loop() {

  if (Serial.available() > 0)
  {
    f = Serial.read();
    Serial.print("I received: ");
    Serial.write(f);
    Serial.println();
  }

       // Работа кнопки А0  
       for   (int i = 10 ; i < NumButtons; i++){
  currentButton[i] = digitalRead(ButtonPins[i]);   
  if(currentButton[i]==LOW)
  {delay(50);
    if(currentButton[i]==LOW)
    {
    delay(50);
    digitalWrite(LedPins[i], ledOn[i]);
    }}}
  

          for   (int i = 0 ; i < 10; i++){
  currentButton[i] = digitalRead(ButtonPins[i]);   
    if(currentButton[i] == LOW) {
    delay(50);
    if(currentButton[i] == LOW)
    {
    digitalWrite(LedPins[i], ledOn[i]);
    delay(500);
    digitalWrite(LedPins[i], ledoff[i]);   
  }}}
}

void setupButtons () //Опрашивает порты кнопок
{
    for (int i = 0 ; i < NumButtons; i++){
    pinMode (ButtonPins[i], INPUT_PULLUP);}
}
void setupLimitSwitch () //Опрашивает порты светодиодов
{
    for (int i = 0 ; i < NumledPins; i++){
        pinMode (LedPins[i], OUTPUT);}
}

 
   

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Попкорн. И пиво. В студию!

sadman41
Offline
Зарегистрирован: 19.10.2016

Давайте на пальцах: 

1) Что послать (пример числа)?
2) С каким массивом и по каким правилам сравнить?
 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ard-20 пишет:

Подскажите как с аппаратного ком порта можно послать байт в виде 0b00000001 затем его считать и сравнить с массивом байтов и согласно номеру в массиве зажечь светодиод. И как вывести его назад в ком порт.

Да просто - с каждым элементом массива сделать "И", потом сложить  и в той строке,  где будет больше одного - включить.

ard-20
Offline
Зарегистрирован: 05.10.2020

послать 0b00000001;

сравнить  byte Floor[10]=

{
  0b00000001,//1
  0b00000010,//2
  0b00000011,//3
  0b00000100,//4
  0b00000101,//5
  0b00000110,//6
  0b00000111,//7
  0b00001000,//8
  0b00001001,//9
  0b00001011,//10
};

и вывести в ком порт в таком же виде 0b00000001;

Светодиод зажечь согласно byte Floor[10];

ard-20
Offline
Зарегистрирован: 05.10.2020

Как отправить вот это 0b00001011 - правильно считать и для начала хотя-бы вывести в ком порт в таком же виде.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

B00000001 - это 1, см. "двоичная форма записи числа"

Сравнить через if, пробежавши циклом по всем элементам массива.

Вывести в порт пробежавши по всем битам числа, проверяя их через, например, bitRead()

Какой светодиод соответствует элементу массива Floor[10]; неясно.

ard-20
Offline
Зарегистрирован: 05.10.2020

номер светодиода соответствует номеру массива.

А как отправить с порта - B00000001 так не работает

выдает 

I received: 0
I received: b
I received: 0
I received: 0
I received: 0
I received: 0
I received: 0
I received: 0
I received: 0
I received: 1
 
b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

Как отправить вот это 0b00001011 - правильно считать и для начала хотя-бы вывести в ком порт в таком же виде.

 

вы сами себя путаете. Разницы между b00000001 и просто 1 - нет никакой. Точно так же b00000010 и 2 - одно и то же.

Запишите свой массив вместо

byte Floor[10]=
{
  0b00000001,//1
  0b00000010,//2
  0b00000011,//3
  0b00000100,//4
  0b00000101,//5
  0b00000110,//6
  0b00000111,//7
  0b00001000,//8
  0b00001001,//9
  0b00001011,//10
};

просто как

byte Floor[10]= {1,2,3,4,5,6,7,8,9,20};
  

передавте по компорту обычные цифры от 1 до 10 и сравнивайте их оператором сравнения

 

b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

А как отправить с порта - B00000001

отправляйте 1
sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

ard-20 пишет:

А как отправить с порта - B00000001

отправляйте 1

Думаю, что он отправит из Serial Monitor '1'... Сдаётся мне, что это ещё один товарищ, не различающий ASCII, код символа и форму записи.

ard-20
Offline
Зарегистрирован: 05.10.2020

Пробую. 

 

ard-20
Offline
Зарегистрирован: 05.10.2020

при отправки 10 выводит 

I received: 1
I received: 0
 
b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

при отправки 10 выводит 

I received: 1
I received: 0
 

и что вас удивляет в этом? Вы небось в терминале набираете "10" - ну так это не число 10, а строка "10" - из двух символов '1' и '0'

sadman41
Offline
Зарегистрирован: 19.10.2016

Через Arduino IDE Serial Monitor вы не можете отправить число 1, только символ 1.

Но, если преподаватель требует преобразовать именно строку B00001000 в число, то всё гораздо сложнее, чем кажется.

ard-20
Offline
Зарегистрирован: 05.10.2020

да я так и понял что не все так просто 

В самом простом варианте должно прокатиь так.

 for ( int i=0; i < 10; i++)
    {
      if (Floor[i]==f)
      {digitalWrite(LedPins[f], ledoff[f]);
      }}
 
 сейчас прошьем и глянем че выйдет
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Включаем все - и говорим, что сбой программы...

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Сдаётся мне, что это ещё один товарищ, не различающий ASCII, код символа и форму записи.

нет, это вот кто:

http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/vremya-raboty-po-vklyucheniyu-i-vyklyucheniyu

В прошлый раз это был вопрос "как запустить старт-стоп на миллис" - безумно тупая ветка на шесть страниц. где этот же ТС никого не слушал, все время бубнил что-то невпопад, а потом обиделся и стал тереть свои сообщения, заменяя их тремя дефисами: "###"

вероятно это его новый подход к той же задаче :) Интересно, сейчас опять будет 6 страниц?

Будьте осторожны - весь смысла прихода ТС на форум - развести кого-то на готовый код

ard-20
Offline
Зарегистрирован: 05.10.2020

не не гаснет светодиод . Чет не так

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А считать с порта - сделать "И" с переданным значением и записать в порт. Задача не такая?

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

mykaida пишет:

Попкорн. И пиво. В студию!

https://vk.com/popkorn_dostavka

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

b707 пишет:

Запишите свой массив вместо

byte Floor[10]=
{
  0b00000001,//1
  0b00000010,//2
  0b00000011,//3
  0b00000100,//4
  0b00000101,//5
  0b00000110,//6
  0b00000111,//7
  0b00001000,//8
  0b00001001,//9
  0b00001011,//10
};

просто как

byte Floor[10]= {1,2,3,4,5,6,7,8,9,20};

С последним значение что-то явно не так - оно нечётное.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

b707 пишет:

Запишите свой массив вместо

byte Floor[10]=
{
  0b00000001,//1
  0b00000010,//2
  0b00000011,//3
  0b00000100,//4
  0b00000101,//5
  0b00000110,//6
  0b00000111,//7
  0b00001000,//8
  0b00001001,//9
  0b00001011,//10
};

просто как

byte Floor[10]= {1,2,3,4,5,6,7,8,9,20};

С последним значение что-то явно не так - оно нечётное.

Написано же "10".
Просто с откатами.
Коррупция мать ее итить

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ТС все гораздо проще.
Создаём массив с номерами пинов.
При получении значения переключаем указанный в элементе пин.