Здравствуйте! Если вы уже прочитали урок Arduino: Взаимодействие с компьютером, но вам уже надоело «общаться» с вашим микроконтроллером простыми текстовыми сообщениями, а захотелось, так сказать, романтики, то эта статья именно для Вас! =)
Думаю, из заголовка статьи уже можно понять, что мы будем делать. А вот для чего это нужно? Самый простой пример — система мониторинга температуры/влажности/освещения, а более сложный — умный дом. Некоторые вещи можно реализовать и без взаимодействия с компьютером (на одной только Ардуине), но это усложнит вам работу тем, что отлаживать такую систему будет трудновато. А использование компьютера в качестве сервера обработки данных дает нам возможность легко просматривать эти данные, легко изменять частоту запросов, события и т.д.
Философствовать на эту тему можно долго, но давайте уже приступим к реализации.
Код для Small Basic:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 'Настройки окна GraphicsWindow.Width = 320 GraphicsWindow.Height = 300 GraphicsWindow.Title = "Arduino" GraphicsWindow.CanResize = "False" GraphicsWindow.BrushColor = "Black" tbox = Controls.AddMultiLineTextBox(10, 10) Controls.SetSize(tbox, 300, 280) 'Настройка таймера Timer.Interval = 2000 Timer.Tick = send_read_time Timer.Pause() 'Коннектимся к порту и включаем таймер CommPort.OpenPort("COM5", 9600) Timer.Resume() Sub send_read_time CommPort.TXString("gS1") Program.Delay(150) txt = Clock.Hour + ":" + Clock.Minute + ":" + Clock.Second + ": Sensor1 = " + CommPort.RXAll() + Controls.GetTextBoxText(tbox) Controls.SetTextBoxText(tbox, txt) EndSub |
Код для Arduino:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | int inSize=0; char str[128]; void setup() { Serial.begin(9600); // Открываем порт } void loop() { int val; inSize=0; memset(str, '\0', 128); if(Serial.available() > 0) { //Читаем данные с порта delay(150); inSize = Serial.available(); for (int i = 0; i < inSize; i++) { str[i] = Serial.read(); } //"Обработка" данных if (strcmp(str, "gS1") == 0) { val = analogRead(A0); //читаем значение с датчика Serial.println(val); } else { Serial.println(-1); } } } |
Ничего сложного в этих исходниках нет, если вы что-то не понимаете, перечитайте еще раз статью о взаимодействии Arduino с компьютером.
В примере есть всего один датчик и один таймер, по которому мы запрашиваем данные. А что, если датчиков много? Да ничего страшного. Вот простая инструкция для добавления еще одного датчика:
1. Придумываем имя/команду для датчика. Например, фоторезистор — phS1.
2. Добавляем в подпрограмму для события таймера еще несколько строчек:
1 2 3 4 5 | CommPort.TXString("phS1") Program.Delay(150) txt = Clock.Hour + ":" + Clock.Minute + ":" + Clock.Second + ": Sensor1 = " + CommPort.RXAll() + Controls.GetTextBoxText(tbox) Controls.SetTextBoxText(tbox, txt) |
3.В код для ардуино добавляем еще одно условие:
1 2 3 4 5 |
Это всё, конечно, хорошо, но что, если нужно считывать данные с разных датчиков через разные интервалы времени? Добавить еще таймеров — вполне себе вариант, но в Small Basic есть только один таймер. Зато у нас на сайте есть статья о нескольких событиях для одного таймера, если вы ее прочитаете, то с легкостью сможете немного модифицировать код «сервера» так, чтоб считывать данные с разными интервалами времени.
А если считать данные надо в определенное время, например, в 9 утра? Этот вопрос решается еще проще, чем предыдущее. Нужно добавить условие в подпрограмму таймера, которое будет проверять, настало уже это время, или нет:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | gsFlag = "False" Sub send_read_time If Clock.Hour >= 9 And gsFlag = "False" Then CommPort.TXString("gS1") Program.Delay(150) txt = Clock.Hour + ":" + Clock.Minute + ":" + Clock.Second + ": Sensor1 = " + CommPort.RXAll() + Controls.GetTextBoxText(tbox) Controls.SetTextBoxText(tbox, txt) gsFlag = "True" EndIf If Clock.Hour <> 9 And gsFlag = "True" Then gsFlag = "False" EndIf EndSub |
gsFlag здесь нужен для того, чтоб не считать данные один раз, где-то в районе 9 часов, а не читать их весь час. А условие для [НЕ 9 часов] нужно для сброса флага.
На этом всё. Если у вас еще есть вопросы, оставляйте их в комментариях. =)