Считывание и регистрация данных с Arduino по времени

Здравствуйте! Если вы уже прочитали урок 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
else if (strcmp(str, "phS1") == 0)
{
val = analogRead(A1);
Serial.println(val);
}

Это всё, конечно, хорошо, но что, если нужно считывать данные с разных датчиков через разные интервалы времени? Добавить еще таймеров — вполне себе вариант, но в 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 часов] нужно для сброса флага.

На этом всё. Если у вас еще есть вопросы, оставляйте их в комментариях. =)

Добавить комментарий

Ваш адрес email не будет опубликован.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>