Отправка символа «А» посредством мигания светодиода

Как написать код для отправки символа «A» на Arduino через мигающий светодиод? Я работаю над проектом по передаче данных. Мне очень нужна помощь и руководство. Используемые материалы: Arduino Uno R3, белый светодиод и резистор.

МОЙ ВЫХОД В ПОСЛЕДОВАТЕЛЬНОМ МОНИТОРЕ

Вставьте букву:

01000001 65 - Символ A

00001010 10 - когда я отправляю/ввожу

КОД

 int LEDTrans = 13;
int timeWaitOn = 1000; //milisec (1 sec)
int timeWaitOff = 1000; // milisec (1 sec)
byte byteRead;

void setup() {                
// Turn the Serial Protocol ON
  Serial.begin(9600);


 Serial.print("Insert letter:");
 Serial.println(" ");
}

void loop() {

digitalWrite(LEDTrans,HIGH); //turn the led on
delay(timeWaitOn); //delay in millisec (1 sec)
digitalWrite(LEDTrans,LOW); //turn the led off
delay(timeWaitOff); //wait a sec


   /*  check if data has been sent from the computer: */
  if (Serial.available()) {


     byteRead = Serial.read();
    // will print the binary representation of 'byteRead' as 8 characters of '1's and '0's, MSB first.
for ( uint8_t bitMask = 128; bitMask != 0; bitMask = bitMask >> 1 ) {

      if ( byteRead & bitMask ) {

    Serial.write('1');
  } else {
    Serial.write('0');
  }  
}

Serial.write("    ");
Serial.println(byteRead);    //send back the actual ASCII code
}


}

, 👍1

Обсуждение

Вы забыли задать вопрос, @jsotola

Нет кода, предназначенного для отправки чего-либо через светодиод. Попробуйте погуглить что-то вроде Arduino light data transmission и подобные термины. Для этого есть библиотеки, @chrisl

Возможный дубликат [передача последовательности бит с помощью arduino uno](https://arduinoprosto.ru/q/52352/transmit-a-sequence-of-bit-using-arduino-uno), @Maximilian Gerhardt

Хм, я запутался. Вы задали этот же вопрос здесь https://arduinoprosto.ru/q/52352/transmit-a-sequence-of-bit-using-arduino-uno/52363#52363 и данный ответ также является точным функциональным эквивалентом, за исключением того, что данные поступают из последовательного монитора.., @Maximilian Gerhardt

Я многому научился на этом сайте. Я новичок и хочу многому научиться. Ваши объяснения и помощь были очень полезны :) Я очень благодарен за это. Большое спасибо., @Nyssa

Я хочу, чтобы вы очень четко указали, что вы хотите, чтобы код делал. Например: когда я отправляю "A", я ожидаю паузу в 1 секунду с выключенным светодиодом, затем светодиод будет гореть 1 секунду, затем светодиод будет выключен 5 секунд, затем будет гореть одну секунду, а затем будет выключен еще одну секунду (что в общей сложности дает 8 секунд на отправку буквы "A"). Если это не то, что вы хотите, пожалуйста, укажите, что вы **хочете**., @Nick Gammon

Теперь получите. Я видел, как светодиод загорался и гас, как вы описали выше. Поэтому отправка буквы «А» занимает всего 8 секунд. Спасибо вам большое, @Nyssa


1 ответ


Лучший ответ:

0

Вместо того, чтобы печатать «0» или «1», включите или выключите вывод светодиода, например:

const int LEDTrans = 13;
const int timeWaitOn = 1000;  // миллисекунда (1 секунда)
const int timeWaitOff = 1000; // миллисекунда (1 секунда)

void setup() {
  // Включить последовательный протокол
  Serial.begin(115200);
  Serial.println("Send letter:");
  pinMode (LEDTrans, OUTPUT);
}

void loop() {
  /*  check if data has been sent from the computer: */
  if (Serial.available()) {
    byte byteRead = Serial.read();
    // выведет двоичное представление 'byteRead' в виде 8 символов '1' и '0', старший байт первым.
    for ( uint8_t bitMask = 128; bitMask != 0; bitMask >>= 1 ) {
      if ( byteRead & bitMask ) {
        digitalWrite(LEDTrans, HIGH); //включаем светодиод
        delay(timeWaitOn); //задержка в миллисекундах (1 сек)
        digitalWrite(LEDTrans, LOW); //выключаем светодиод
      } else {
        delay(timeWaitOff); //подождать секунду
      } // конец if
    } // конец цикла for
  } // конец, если что-то доступно
} // конец цикла

как мне посчитать вспышки? это основано на двоичном коде 01000001?

Вот в чем проблема... судя по тому, что, кажется, просит ваш вопрос, вы хотите, чтобы светодиод мигал при 1 и гас при нуле. Поэтому результаты (которые предоставляет мой код) будут выглядеть так:

Пример 1

Итак, вы получаете две вспышки, первая через секунду после начала, затем промежуток в 5 секунд, а затем еще одна вспышка. Это будет 01000001.

Однако как узнать, когда начинать считать вспышки? Это может быть:

Пример 2

Это будет 00000001.

Или даже:

Пример 3

Это будет 10000010.

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


Итак, асинхронный последовательный порт (обычный последовательный порт на Arduino) имеет стартовый бит, который сигнализирует, когда начинать отсчет, например:

Последовательный с начальным битом

Обычно последовательный порт находится в высоком состоянии (непрерывные 1 с), а затем, когда приходит 0, это означает «начать подсчет». Итак, вы ждете 1½ бита времени, а затем делаете выборку с известной скоростью передачи данных. В вашем примере, где вы хотите 1 секунду на бит, скорость передачи данных будет 1 (один бит в секунду). Таким образом, вы делаете выборку каждую секунду. Обычно скорость передачи данных несколько выше, например 9600 или 115200 выборок в секунду.

Также имеется стоповый бит, который всегда равен 1. Это гарантирует, что в конце каждого байта будет как минимум одна 1, чтобы мы могли определить, когда прибудет следующий стартовый бит.


Есть другие способы сделать это, например, короткий импульс может представлять ноль, а более длинный импульс — единицу. В этом случае любой импульс может представлять начало байта, а затем вы просто измеряете, сколько коротких и сколько длинных импульсов вы получаете (для некоторого определения «короткого» и «длинного»).

,

спасибо большое, мигание произошло. но я немного запутался. Я считаю включение и выключение светодиода, чтобы увидеть символ «A» в двоичном коде, который равен 01000001. но этого не произошло., @Nyssa

Серьёзно? Я изменил скорость передачи данных на 115200, надеюсь, вы заметили. Если я отправлю "A", то светодиод будет мигать через 1 секунду и через 7 секунд, что верно: 01000001. Вы ожидаете две вспышки, одну через секунду и одну через семь секунд. В остальное время светодиод выключен (то есть ноль)., @Nick Gammon

О. Я это заметил, но я пытался изменить на 9600. Может быть, поэтому. Мне действительно нужно использовать скорость передачи данных 115200, чтобы получить 01000001? Какой тип библиотеки мне следует импортировать в эту кодировку? Где я могу получить библиотеку? Этот arduino действует как передатчик для отправки символа «A», а приемник — это приложение. Есть ли у вас какие-либо предложения, как мне синхронизировать их обоих? Могу ли я получить ваш адрес электронной почты. У меня есть много вопросов., @Nyssa

Скорость передачи данных нужна только для отправки символа в скетч из последовательного монитора. Скорость, с которой мигает светодиод, задается в вашем коде, в настоящее время один бит в секунду. Вам не нужна библиотека. Зачем она вам нужна? Если у вас есть еще вопросы, пожалуйста, задайте их здесь., @Nick Gammon

Я думал, что мне это нужно. Я просмотрел другие проекты, они импортируют библиотеки. Но сейчас я не понимаю, что вы имеете в виду под >> миганием через 1 секунду и через 7 секунд, что правильно: 01000001. Вы ожидаете двух вспышек, одну через секунду и одну через семь секунд. Остальное время светодиод выключен (то есть ноль)., @Nyssa

Мне любопытно узнать, что **вы** ожидаете. Пожалуйста, укажите, как часто, по вашему мнению, светодиод будет мигать и с какими интервалами. Конечно, 01000001 представляет два мигания? (Там две "1"). Что еще это может означать?, @Nick Gammon

Извините, что запутал вас. Как мне посчитать мигание светодиода, о котором вы упомянули ранее? Для 1 сколько вспышек и секунд это означает? И для 0 сколько секунд светодиод гаснет? Я хочу передать «A» в двоичном коде в течение 10 секунд. Если светодиод горит, представляет ли он 1? Я немного запутался. Когда светодиод выключен, он представляет 0?, @Nyssa

как мне посчитать вспышки? это основано на двоичном коде 01000001? как мне посчитать вспышки? это основано на двоичном коде 01000001? контакты, к которым я подключаю перемычку к светодиоду, должны быть контактами 13 и tx, правильно ли это? я хочу передать «A»., @Nyssa

Ник, я пытался посчитать мигание светодиода на плате Arduino. Он показывает мигание через 1 секунду и через 7 секунд. Но когда я подключил белый светодиод с помощью перемычек, мигание отличается. Я считаю мигание, когда светодиод начинает гаснуть как 0, а когда загорается как 1. Белый светодиод мигает 0 1 0 1 0 (от 5 до 6 секунд) 1 0 1. Или мне следует считать второе мигание, которое показывает 010000010?, @Nyssa

*контакты, к которым я подключаю перемычку к светодиоду, должны быть контактом 13 и tx, правильно ли это? * - Нет, контакт 13 и земля, с токоограничивающим резистором между светодиодом и землей, например, 330 Ом., @Nick Gammon

*как мне посчитать вспышки?* - что вы имеете в виду? Когда вы видите вспышку, вы ее считаете? Вы также отмечаете время между вспышками. Я совершенно не понимаю, после прочтения этих вопросов, чего вы ожидаете от кода, и если вы не можете этого сказать, то ни я, ни кто-либо другой (включая вас) не может заставить его сделать это, что бы это ни было., @Nick Gammon

Теперь я понял. Я ожидаю, что arduino будет передатчиком, который передает символ 'A' через контакт 13 на arduino. Ты мне очень помог, Ник. Спасибо тебе большое-пребольшое., @Nyssa