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

Здравствуйте! Если вы уже прочитали урок Arduino: Взаимодействие с компьютером, но вам уже надоело «общаться» с вашим микроконтроллером простыми текстовыми сообщениями, а захотелось, так сказать, романтики, то эта статья именно для Вас! =)

Думаю, из заголовка статьи уже можно понять, что мы будем делать. А вот для чего это нужно? Самый простой пример — система мониторинга температуры/влажности/освещения, а более сложный — умный дом. Некоторые вещи можно реализовать и без взаимодействия с компьютером (на одной только Ардуине), но это усложнит вам работу тем, что отлаживать такую систему будет трудновато. А использование компьютера в качестве сервера обработки данных дает нам возможность легко просматривать эти данные, легко изменять частоту запросов, события и т.д.

Философствовать на эту тему можно долго, но давайте уже приступим к реализации.

Код для Small Basic:

'Настройки окна
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:

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. Добавляем в подпрограмму для события таймера еще несколько строчек:

 CommPort.TXString("phS1")
  Program.Delay(150)
 
  txt = Clock.Hour + ":" + Clock.Minute + ":" + Clock.Second + ": Sensor1 = " + CommPort.RXAll() + Controls.GetTextBoxText(tbox) 
  Controls.SetTextBoxText(tbox, txt)

3.В код для ардуино добавляем еще одно условие:

else if (strcmp(str, "phS1") == 0)
{
   val = analogRead(A1);
   Serial.println(val);
}

Это всё, конечно, хорошо, но что, если нужно считывать данные с разных датчиков через разные интервалы времени? Добавить еще таймеров — вполне себе вариант, но в Small Basic есть только один таймер. Зато у нас на сайте есть статья о нескольких событиях для одного таймера, если вы ее прочитаете, то с легкостью сможете немного модифицировать код «сервера» так, чтоб считывать данные с разными интервалами времени.

А если считать данные надо в определенное время, например, в 9 утра? Этот вопрос решается еще проще, чем предыдущее. Нужно добавить условие в подпрограмму таймера, которое будет проверять, настало уже это время, или нет:

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 часов] нужно для сброса флага.

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

Похожие записи:

Если вам понравилась статья, вы можете подписаться на RSS или E-mail рассылку. Для получения обновлений по электронной почте, введите ваш e-mail адрес в эту форму (Доставка от FeedBurner):

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *