Мигаем встроенным светодиодом с частотой, определяемой компьютером.

sergeevalex
Offline
Зарегистрирован: 15.10.2012

Приветствую сообщество любителей и профессионалов!

Буквально на днях приехала ко мне из Китая ардуина нано. Так как пока не определился в какой проект её засунуть (столько всего сделать хочется, аж жуть), просто решил помигать светодиодом. Собрал из нескольких примеров скетч, и написал в VS маленькую прогу на C# для управления портом.

Цель: Заставить мигать светодиод на микроконтроллере в зависимости от команд с ББ.
На МК есть интегрированный в плату светодиод на 13-й ноге. С ББ отправляется частота включения/отключения 13-го пина путём изменения положения ползунка (выбрано 5-ть значений, от 1 до 5).
 

/*
  Моргаем светодиодом
  Управление частотой моргания светодиода из интерфейса программы через COM-порт.
 
  Пример кода и программы размещён в свободном доступе:
  http://hoplik.ru
 */
 
// На 13 пине сидит светодиод в большинстве Arduino.
const int ledPin = 13;               // присваиваем имя
int ledState = LOW;              // состояние светодиода 
unsigned long lastMillis = 0;   // время последнего моргания светодиода 
int blinkTime = 1000;          // время моргания светодиода по умолчанию
String inputString=""; // обнуляем строку

// Установка запускается однократно, при нажатии reset:
void setup() {                
// Устанавливает цифровой пин как выходной.
  pinMode(ledPin, OUTPUT);
// инициализация порта:
  Serial.begin(9600);
}

/*
  SerialEvent выполняется при получении новых данных на
 порт serial RX. Эта часть выполняется перед каждым периодом
 выполнения loop(). Задержка в секции LOOP () даёт задержку 
 при чтении порта.
 */
void serialEvent() {
   inputString = "";
  while (Serial.available()) {
    // получен новый байт:
    char inChar = (char)Serial.read(); 
    // добавили знак к строке inputString:
    inputString += inChar;
   }
   
   // устанавливаем новую частоту мигания при получении данных с порта
   switch (inputString.toInt()){
     case 1:
     blinkTime = 1000;
     break;
     case 2:
     blinkTime = 700;
     break;
     case 3:
     blinkTime = 500;
     break;
     case 4:
     blinkTime = 300;
     break;
     case 5:
     blinkTime = 100;
     break;
   }
   Serial.print(inputString.toInt()); // вернули в порт полученное значение (для контроля)
}

// Операция loop выполняется постоянно, по кругу.
void loop() {
  unsigned long curMillis = millis();    // присваиваем переменной текущее время работы программы
 
    // проверяем не прошёл ли наш интервал
  if (curMillis - lastMillis > blinkTime){
    lastMillis = curMillis; //сохраняем время последнего переключения светодиода
    // если светодиод не горит, включаем и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
  digitalWrite(ledPin, ledState);   // включаем или выключаем светодиод
  } 
}

Базовый код формы для ББ (написан на С# для платформы Windows CE .NET CF 2.0):

using System;
using System.Windows.Forms;

namespace Blink
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();  // Инициализация компонентов
            string[] ports = System.IO.Ports.SerialPort.GetPortNames();
            foreach (string port in ports)
                comboBox1.Items.Add(port);  //Отображение доступных портов в комбобоксе
        }
        //При изменении ползунка записываем новые данные в порт 
        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            string sendMess = trackBar1.Value.ToString() + "\r\n";
            if (serialPort1.IsOpen == false)
                textBox1.Text = "Необходимо выбрать порт";
            else serialPort1.WriteLine(sendMess);
            textBox1.Text = "Частота моргания - " + sendMess + textBox1.Text;
        }
        //При выборе СОМ-порта назначаем его и открываем
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try//Ловим ошибки работы с портом
            {
                serialPort1.Close();
                serialPort1.PortName = comboBox1.Text.ToString();
                serialPort1.Open();
            }
            catch { }
        }
    }
}

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Несмотря на то, что вопрос приема чисел из ком-порта поднималась уже стопитсот раз, пост считаю полезным, ибо сразу в одно место сложены и котлеты и мухи... сорри, и ардуино скетч и программа на VB

 

sergeevalex
Offline
Зарегистрирован: 15.10.2012

AlexFisher пишет:

Несмотря на то, что вопрос приема чисел из ком-порта поднималась уже стопитсот раз, пост считаю полезным, ибо сразу в одно место сложены и котлеты и мухи... сорри, и ардуино скетч и программа на VB

 

Спасибо. Я ещё не все темы успел прочитать. Из того, что заметил, когда пробовал разные варианты скетча, если не в стринг, а в чар загонять данные из порта, то памяти в два раза меньше отъедает. Но решил уже не переписывать правильно, оставив возможность развиваться. :)

std
Offline
Зарегистрирован: 05.01.2012

были танцы с бубном пока просто так посылал с компа в порт.
потом перед посыланием дописал установку скорости, четности и чего-то еще, тогда начало работать.
кстати, а где вопрос? 

sergeevalex
Offline
Зарегистрирован: 15.10.2012

std пишет:
а где вопрос? 


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