5rScheduler

Чтобы разобраться как приложение работает с микроконтроллером рассмотрим простой пример. Суть примера продемонстрировать распознавание приложением подключение микроконтроллера и обработка микроконтроллером команд поступающих из приложения. Для этого воспользуемся платформу ардуино NANO, пьезо динамик, 5(шт.) светодиодов, 6(шт.) резисторов. Платформа ардуино NANO уже интегрирована с USB UART контролером и имеет USB разъем. Первым делом подключим NANO с помощью USB кабеля к нашему андроид устройству. При запуске приложения или если оно запущено система андроид у нас запросит разрешение для работы приложения с USB UART. На данном этапе не важно подтвердите или откажете этот запрос. Далее перейдите на экран управления и нажмите на пункт “Список USB устройств”. В открывшемся окне вы увидите строку с именем USB UART контролера (см. рис.). Следующим шагом необходимо собрать схему показанную на рисунке и подключить к соответствующим выводам ардуино NANO. Необходимо загрузить программу в микроконтроллер. Для этого воспользуемся “Arduino IDE”.

Ознакомится с скетчем можно ниже. После загрузки скетча в ардуино NANO его можно подключить к нашему андроид устройству. Питание для ардуино NANO будет поступать с андроид устройства. Теперь необходимо утвердить запрос системы о разрешении приложению работать с USB UART. После этого значок нот-сообщения сменится на “v”, а пьезо динамик подключенный к ардуино NANO выдаст звуковой сигнал. Как видно из скетча работа приложения с микроконтроллером осуществляется на скорости 115200 bit. При обнаружении USB UART контролера приложение отправляет запрос – stmA и ожидает ответ в виде — rtmA. После получения ответа приложение считает соединение с микроконтроллером установленным и готова отправлять запланированные команды. Прежде, чем запланировать задачу можно проверить как микроконтроллер реагирует на команды. После установления соединеня с микроконтроллером на экране управления выбираем пункт “Тестирование команд”. В открывшемся списке выбираем необходимую команду. Она сразу будет передана микроконтроллеру. Например “Commanda2 = 000011A” означает что будет передано — 000011A. В нашем примере это означает, что загорятся два светодиода и через 2 секунды погаснут.

 

Скетч для загрузки (здесь):

//
const int piezo_pin = 4;
//
const String inOtklik = «stm»;
const String outOtklik = «rtmA»;
const String outOtklik2 = «rtmB»;
//
String command = «»;
boolean statusCommand = false;
//
String inputString = «»;
boolean strimAudio = false;
//
int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;
int ledState4 = LOW;
int ledState5 = LOW;
//
int led1 = 6;
int led2 = 7;
int led3 = 8;
int led4 = 9;
int led5 = 10;
//
unsigned long startTime = 0;
unsigned long curTime = 0;
long delta = 2000;
//
void toLedOn (String str){
if (str.length()>5){
char *chars = str.c_str();
//
if(chars[1]==’1′)ledState1 = HIGH;
if(chars[2]==’1′)ledState2 = HIGH;
if(chars[3]==’1′)ledState3 = HIGH;
if(chars[4]==’1′)ledState4 = HIGH;
if(chars[5]==’1′)ledState5 = HIGH;
//
digitalWrite(led1, ledState1);
digitalWrite(led2, ledState2);
digitalWrite(led3, ledState3);
digitalWrite(led4, ledState4);
digitalWrite(led5, ledState5);
}
return;
}
void toLedOff (){
//
ledState1 = LOW;
ledState2 = LOW;
ledState3 = LOW;
ledState4 = LOW;
ledState5 = LOW;
//
digitalWrite(led1, ledState1);
digitalWrite(led2, ledState2);
digitalWrite(led3, ledState3);
digitalWrite(led4, ledState4);
digitalWrite(led5, ledState5);
return;
}
void sound1(int l) {
tone(piezo_pin,600);
delay(500);
if (l==2){
tone(piezo_pin,900);
delay(500);
}
noTone(piezo_pin);
return ;
}
//
void setup() {
Serial.begin(115200);
inputString.reserve(200);
//
pinMode(piezo_pin, OUTPUT);
//
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
sound1(1);
Serial.print(outOtklik2);
}

void loop() {
if(statusCommand){
statusCommand=false;
if(command == inOtklik){
delay(2200);
Serial.print(outOtklik);
sound1(2);
}else{
toLedOn (command);
startTime = millis();
}
}
if(startTime != 0){
curTime = millis();
if(curTime > startTime+delta){
startTime=0;
toLedOff ();
}
}
}
void serialEvent() {
while (Serial.available()) {
//
char inChar = (char)Serial.read();
//
if (inChar == ‘A’) {
command = inputString;
statusCommand = true;
inputString=»»;
} else {
inputString += inChar;
}
}
}