Главная » 2017 » Июль » 28 » Ардуино пишет письма. часть 2 ( Arduino, Processing, Serial, E-mail)
03:59
Ардуино пишет письма. часть 2 ( Arduino, Processing, Serial, E-mail)

Вторая часть. Исходя из нашего плана в первой части, следующее что нам нужно - это принимать данные с последовательного порта в наш компьютер. Для этого мы будем использовать язык PROCESSING. Это родственник ARDUINO IDE, поэтому не должно возникнуть сложностей в его освоении. Он открытый (Open Sourse), и бесплатный (Free). Конечно же желающие могут поддержать и внести свой вклад в его развитие. Скачать PROCESSING можно с официального сайта. Там же можно найти много полезной информации. Мы надеемся что вы самостоятельно сможете скачать и запустить среду PROCESSING. Если наши надежды напрасны, возвращайтесь после прокачки данных параметров.

  Надеемся вы не разобрали проект с прошлой части. И в Ардуино залит правильный скетч. Запускаем PROCESSING. Ни чего настраивать не надо. Все работает и так.

В появившемся окне пишем следующее, кстати программа на PROCESSING тоже называется скетч.


import processing.serial.*; // Импортируем библиотеку ПОСЛЕДОВАТЕЛЬНОГО ПОРТА

Serial Myport; // Создаем объект Myport. Serial указывает на тип объекта. 
// Типы объектов схожи с типами переменных, только более продвинутые.
// Если понимаете о чем речь. Если нет, это и не важно, пока.

void setup() {
  Myport = new Serial ( this, "COM17", 9600); // Создаем новый ПОСЛЕДОВАТЕЛЬНЫЙ ПОРТ
// COM17 это имя USB (эмулированного COM) порта на котором висит Ардуино.
// 9600 это скорость передачи.
// Скорость должна быть одинаковой в Ардуино и здесь. 9600 довольно распространенное значение. 
}

void draw() {
  print (Myport.readStringUntil('\n')); // Печатаем в консоль данные с ПОСЛЕДОВАТЕЛЬНОГО ПОРТА
}


Создавая новый Serial (последовательный) порт нам необходимо указать его физическое имя. То есть имя порта (USB) к которому подключен Ардуино. Оно указано в правом нижнем углу ARDUINO IDE.

Теперь подключим плату и запустим скетч на PROCESSING. Именно в таком порядке. Сначала подключаем Ардуино, после запускаем скетч. В консоль (КОНСОЛЬ - это черный прямоугольник под редактором кода) PROCESSING начинаем получать данные от Ардуино.

ВОТ ТАК...   

ИЛИ ТАК...

Почему может быть разный результат? Причина этого - задержка в выполнении программы на Ардуино. Во многих тестовых скетчах для температурных датчиков присутствует задержка выполнения программы. Это строка delay ( [количество миллисекунд] ). Введенная для замедленного отображения данных в МОНИТОРЕ ПОРТА, для удобного чтения информации.

 

И если в вашем скетче на Ардуино нет этой задержки то в консоли последовательно выводятся данные температуры.

А если задержка присутствует это приводит к тому, что наша программа на PROCESSING считывает данные чаще, чем их предоставляет Ардуино. И поэтому вместо ожидаемых цифр мы видим null - то есть ничего (Словом null обозначается ничего, не путать с нулём).

Нас устраивают оба результата. Но прежде чем продолжать обратим внимание на следующее:

1) Если запустим скетч на PROCESSING прежде чем подключим Ардуино - это вызовет ошибку и зависание приложения.

2) Если Ардуино будет подключен в другой USB - это также вызовет ошибку.

На стадии разработки приложения с этим можно мериться. Но нам придется к этому возвращаться, так как подобные ошибки недопустимы в скомпилированном приложении. Тем более очень маловероятно что пользователь нашего приложения будет использовать то же USB (COM) что и мы, да и у вас COM порт скорее всего отличается от нашего. Поэтому нам нужно будет автоматически определять подключена ли Ардуино, и если да, то к какому USB (COM порту). 

Вернемся к этому чуть позже. Пока продолжим, далее по плану - создание окна приложения. 

Окно приложения в PROCESSING создается автоматически и при прошлых запусках скетча вы наверняка его видели.

Оно создавалось, но нами не использовалось. Запустим на PROCESSING код приведенный ниже. Предполагается что Артуино подключен к компьютеру и ошибки последовательного порта не возникнет. 


import processing.serial.*; 
int temperature = 0;
Serial Myport; 


void setup() {
  size(400,300); 
  Myport = new Serial ( this, "COM17", 9600); 
  Myport.bufferUntil('\n');
  textSize(100);
  textAlign(CENTER);
}

void draw() {
  background(0);
  text (temperature + "°C",200,200);
}

void serialEvent (Serial Myport) {
  temperature = int (Myport.readStringUntil('\n'));
}


Если вы не скопировали код программы, а переписываете вручную, что для новичков желательно. Для вас может оказаться загадкой как писать знак градусов [ ° ]. Для этого нужно удерживая ALT на дополнительной клавиатуре ввести 0176 и отпустить ALT.  

Результат выполнения программы.

Теперь разберем код построчно. Кто уже разобрался или не желает разбираться, может переходить к следующей части.

Все остальные... - продолжаем.

import processing.serial.*;

Этой строкой мы импортируем программные компоненты которые будут участвовать в создании СЕРИАЛ СОЕДИНЕНИЯ.

Мы их не увидим в программе, но они безусловно нужны.

int temperature = 0; 

Далее мы создаем целочисленную переменную TEMPERATURE и присваиваем ей значение НОЛЬ. Тип INT указывает на то, что переменная будет в себе хранить целые числа. INT - это сокращение от INTEGER, что переводится как ЦЕЛОЕ.

Serial Myport;

Здесь мы создаем объект MYPORT. И подобно переменной, тип SERIAL указывает на принадлежность объекта. MYPORT - это имя переменной и может быть любым. Если последовательных портов будет несколько, для удобства лучше давать осмысленные имена. Так наш порт мы могли бы назвать TERMOMETR. 

Далее функция VOID SETUP. В ней задаются стартовые установки приложения. Так же программным вызовом этой функции можно организовать РЕСТАРТ приложения, например при сбое.

 size(400,300);

Этим оператором задаем размер окна нашего приложения в пикселях. 400 это ширина, 300 это высота.

Myport = new Serial ( this, "COM17", 9600);

Здесь мы назначаем нашему MYPORT задачу. Создаем из него последовательный порт. COM17 - это имя порта, оно должно совпадать с именем USB куда подключен Ардуино. 9600 - это скорость передачи информации. 9600 самое распространенное значение для проводных соединений такого рода. THIS - переводится - ЭТОТ. Это "родитель" порта (обычно используется именно THIS). 

Myport.bufferUntil('\n');

Устанавливаем символ, после получения которого будет срабатывать SERIAL EVENT. В нашем случае это -"перевод строки".  

textSize(100);

Устанавливаем размер шрифта, которым будем выводить информацию на экран. 

textAlign(CENTER); 

Этим оператором  определяем выравнивание текста. Относительно какой точки он будет располагаться в окне приложения.

Далее следует функция VOID DRAW. Так называемый основной цикл. операторы внутри него выполняются по очереди, без перерыва.   

background(0);

Задаем цвет фона. В данном синтаксисе доступны значения от 0 (черный) до 255 (белый).

text (temperature + "°C",200,200);

Пишем текст на экране. Выводим значение переменной TEMPERATURE, следом за ней печатаем символ градусы Цельсия. + это логическое И. За ним идут координаты точки окна нашего приложения, в которой будет размещен данный текст.

void serialEvent (Serial Myport) {  

 temperature = int (Myport.readStringUntil('\n'));

}    

Последним в нашем скетче стоит функция SERIAL EVENT. Она выполняется когда на последовательный порт поступает что-то отличное от NULL (то ничего) и прекращает прием при получении знака указанного в скобках. И когда это происходит, оператор внутри функции присваивает полученные данные переменной TEMPERATURE. В нашем случае это число соответствующее градусам Цельсия. Именно из-за того что мы получаем данные только при их наличии. Нас больше не волнует задержка передачи данных, delay, в скетче Ардуино (описывалось в начале этой части).

Вторая часть на этом не заканчивается.

В продолжении будет много интересного.

Категория: ЖЕЛЕЗО/ПРОГРАММИРОВАНИЕ. | Просмотров: 1174 | Добавил: phom1 | Теги: программирование ардуино, Serial Port, ардуино, электронная почта, обработка ошибок в Processing, Email, Send Email, Processing
Всего комментариев: 0
Добавить комментарий