Передать с аппаратного ком порта байт - считать и сравнить с массивом
- Войдите на сайт для отправки комментариев
Втр, 26/01/2021 - 22:50
Передать с аппаратного ком порта байт - считать и сравнить с массивом и согласно номеру в массиве зажечь светодиод на определенном пине.
Продолжайте, мы пристально следим за развитием событий.
Интересная тема, слежу с удовольствием.
Еще можно Не передавать байт и Не сравнивать его ни с чем и Тоже зажечь светодиод.
Подскажите как с аппаратного ком порта можно послать байт в виде 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);} }Попкорн. И пиво. В студию!
Давайте на пальцах:
1) Что послать (пример числа)?
2) С каким массивом и по каким правилам сравнить?
Подскажите как с аппаратного ком порта можно послать байт в виде 0b00000001 затем его считать и сравнить с массивом байтов и согласно номеру в массиве зажечь светодиод. И как вывести его назад в ком порт.
Да просто - с каждым элементом массива сделать "И", потом сложить и в той строке, где будет больше одного - включить.
послать 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];
Как отправить вот это 0b00001011 - правильно считать и для начала хотя-бы вывести в ком порт в таком же виде.
B00000001 - это 1, см. "двоичная форма записи числа"
Сравнить через if, пробежавши циклом по всем элементам массива.
Вывести в порт пробежавши по всем битам числа, проверяя их через, например, bitRead()
Какой светодиод соответствует элементу массива Floor[10]; неясно.
номер светодиода соответствует номеру массива.
А как отправить с порта - B00000001 так не работает
выдает
Как отправить вот это 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 и сравнивайте их оператором сравнения
А как отправить с порта - B00000001
А как отправить с порта - B00000001
Думаю, что он отправит из Serial Monitor '1'... Сдаётся мне, что это ещё один товарищ, не различающий ASCII, код символа и форму записи.
Пробую.
при отправки 10 выводит
при отправки 10 выводит
и что вас удивляет в этом? Вы небось в терминале набираете "10" - ну так это не число 10, а строка "10" - из двух символов '1' и '0'
Через Arduino IDE Serial Monitor вы не можете отправить число 1, только символ 1.
Но, если преподаватель требует преобразовать именно строку B00001000 в число, то всё гораздо сложнее, чем кажется.
да я так и понял что не все так просто
В самом простом варианте должно прокатиь так.
Включаем все - и говорим, что сбой программы...
Сдаётся мне, что это ещё один товарищ, не различающий ASCII, код символа и форму записи.
нет, это вот кто:
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/vremya-raboty-po-vklyucheniyu-i-vyklyucheniyu
В прошлый раз это был вопрос "как запустить старт-стоп на миллис" - безумно тупая ветка на шесть страниц. где этот же ТС никого не слушал, все время бубнил что-то невпопад, а потом обиделся и стал тереть свои сообщения, заменяя их тремя дефисами: "###"
вероятно это его новый подход к той же задаче :) Интересно, сейчас опять будет 6 страниц?
Будьте осторожны - весь смысла прихода ТС на форум - развести кого-то на готовый код
не не гаснет светодиод . Чет не так
А считать с порта - сделать "И" с переданным значением и записать в порт. Задача не такая?
Попкорн. И пиво. В студию!
https://vk.com/popkorn_dostavka
Запишите свой массив вместо
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};С последним значение что-то явно не так - оно нечётное.
Запишите свой массив вместо
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".
Просто с откатами.
Коррупция мать ее итить
ТС все гораздо проще.
Создаём массив с номерами пинов.
При получении значения переключаем указанный в элементе пин.