Монитор сердечного ритма с помощью arduino и платформы thingspeak iot — arduino+

Пульсометр на Arduino

Сегодня мы собираемся подключить датчик пульса к Arduino и измерять сердечный ритм человека через последовательный монитор.
 
Шаг 1: Элементы:
Требуется электроника:Датчик пульсаArduinoЗуммерСветодиодМакетная платаПеремычки

Шаг 2: Подключение датчика к Arduino

 Монитор сердечного ритма — это устройство, которое позволяет измерять частоту сердечных сокращений в реальном времени. Вы можете легко использовать данные сердечных ритмов в своих проектах.Импульсный датчик состоит из трех контактов:Контакт VCCGND-контактВывод OUT или Сигнальный выводПодключение датчика выглядит следующим образом:Контакт VCC подключается к «+» макетной платы.Контакт GND подключается к «-» макетной платы.Контакт OUT подключается к аналоговому выводу A0 Arduino.

Давайте теперь подключим зуммер и светодиод.

Шаг 3: Подключение зуммера

 Зуммер имеет два провода, выходящих из корпуса, который называется анодом и катодом.Подключение зуммера выглядит следующим образом:Красный провод или анод зуммера подключается к цифровыму выводому 13 Arduino.Черный провод или катод зуммера подключается к «-» макетной платы.Последним интерфейсом является светодиод.
Шаг 4: Подключение светодиода

 Более длинная ножка является анодом, а более короткая — катодом.Соединение светодиода выглядит следующим образом:Анод светодиода к цифровому выходу 10Катод к «-» макетной платыШаг 5: Код

int pulsePin = 0;
int blinkPin = 10;

int buzzer = 13;

int BPM;

int Signal;

int IBI = 600;

boolean Pulse = false

boolean QS = false;

boolean serialVisual = true;

volatile int rate[10];

long sampleCounter = 0;

long lastBeatTime = 0;

int P = 512;

int T = 512;

int thresh = 525;

int amp = 100;

boolean firstBeat = true;

void setup() {

pinMode(blinkPin,OUTPUT);

pinMode(buzzer,OUTPUT);

Serial.begin(9600);

interruptSetup();

analogReference(EXTERNAL); }

void loop() {

serialOutput();

if (QS == true)

serialOutputWhenBeatHappens();

QS = false;

}

ledFadeToBeat();

delay(20);

}

void ledFadeToBeat() {

digitalWrite(blinkPin, HIGH); }

void interruptSetup() {

TCCR2A = 0x02;

TCCR2B = 0x06;

OCR2A = 0X7C;

TIMSK2 = 0x02;

sei();

}

void serialOutput() {

if (serialVisual == true) {

arduinoSerialMonitorVisual('-', Signal);

} else { sendDataToSerial('S', Signal);

}

}

void serialOutputWhenBeatHappens() {

if (serialVisual == true) {

Serial.print(«Heart-Beat Happened «);

Serial.print(«BPM: «);

Serial.println(BPM); }

else {

sendDataToSerial('B',BPM);

sendDataToSerial('Q',IBI);

}

}

void arduinoSerialMonitorVisual(char symbol, int data ) {

const int sensorMin = 0;

const int sensorMax = 1024;

int sensorReading = data;

int range = map(sensorReading, sensorMin, sensorMax, 0, 11); value: switch (range) {

case 0:

Serial.println(«»);

break;

case 1:

Serial.println(«—«);

break;

case 2:

Serial.println(«——«);

break;

case 3:

Serial.println(«———«);

break;

case 4:

Serial.println(«————«);

break;

case 5:

Serial.println(«—————|-«);

break;

case 6:

Serial.println(«—————|—«);

break;

case 7:

Serial.println(«—————|——-«);

break;

case 8:

Serial.println(«—————|———-«);

break; case 9:

Serial.println(«—————|—————-«);

break; case 10:

Serial.println(«—————|——————-«);

break;

case 11:

Serial.println(«—————|————————«);

break; } }

void sendDataToSerial(char symbol, int data ) {

Serial.print(symbol);

Serial.println(data); }

ISR(TIMER2_COMPA_vect) {

cli();

Signal = analogRead(pulsePin);

sampleCounter += 2;

int N = sampleCounter — lastBeatTime;

if(Signal < thresh && N > (IBI/5)*3) {

if (Signal < T) { T = Signal; } }

if(Signal > thresh && Signal > P) { P = Signal; }

if (N > 250) {

if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ) { Pulse = true;

digitalWrite(blinkPin,HIGH); IBI = sampleCounter — lastBeatTime;

lastBeatTime = sampleCounter;

if(secondBeat) {

if secondBeat == TRUE

secondBeat = false;

for(int i=0; i

Источник: https://ngin.pro/arduino/298-pulsometr-na-arduino.html

Урок 27. Пульсометр

В этом уроке мы научимся получать данные с датчика пульса и выводить их на TFT дисплей в виде графика и среднего значения пульсаций в минуту.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека iarduino_SensorPulse для работы с датчиком пульса.
  • Библиотека UTFT для работы с цветными TFT дисплеями(в данную библиотеку нами добавлена поддержка текущего дисплея)

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE.

Видео:

Принцип действия датчика пульса:

Pulse Sensor — это аналоговый датчик позволяющий фиксировать пульс.

На датчике установлены светодиод и фотоприемник, расположенные так, что луч света излучаемый светодиодом, попадает на фотоприёмник только отразившись от препятствия, которым должна выступать подушечка пальца или мочка уха.

Сосуды, наполняясь кровью, меняют свою оптическую плотность, что влияет на изменение количества отражённого света. Следовательно, при постоянном уровне светового потока, излучаемого светодиодом, интенсивность света регистрируемая фотоприемником, будет зависеть от наполняемости сосудов кровью.

Электрическая схема датчика устроена так, чтобы регистрировать только динамическое изменение интенсивности принимаемого светового потока.

При неизменном световом потоке (независимо от его интенсивности), напряжение на выходе датчика находится в районе половины напряжения питания.

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

Схема подключения:

TFT дисплей реализован в виде shield и использует следующие выводы arduino Uno: A0-A4 (управление), 2-9 (данные), 10-13 (SD-карта), питание. Датчик пульса подключается к аналоговому входу A5. Trema зуммер подключается к цифровому выводу 1.

Так как цифровой вывод 1 является линией TX шины UART, то при загрузке скетча будет слышен звук.

Код программы:

// Подключаем библиотеки:
#include // подключаем библиотеку для работы с датчиком пульса
#include // подключаем библиотеку для работы с TFT дисплеями
// Объявляем переменные и константы:
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
const uint16_t colorBG = VGA_BLACK; // цвет фона
const uint16_t colorGR = VGA_GREEN; // цвет графика
const uint16_t colorCD = VGA_WHITE; // цвет текста и символа пульса
const uint16_t colorER = VGA_RED; // цвет текста об ошибке uint16_t graphY0; // положение предыдущей точки графика по оси Y uint16_t graphY; // положение текущей точки графика по оси Y uint16_t graphX; // положение текущей точки графика по оси X uint16_t screenW; // ширина дисплея uint16_t screenH; // высота дисплея
UTFT myGLCD(TFT28UNO, A2,A1,A3,A4,A0); // подключаем дисплей TFT28UNO
iarduino_SensorPulse Pulse(A5,1); // подключаем сенсор к 5 аналоговому входу, а зуммер к 1 цифровому выводу
void setup(){ Pulse.begin(); // инициируем сенсор myGLCD.InitLCD(); // инициируем дисплей myGLCD.clrScr(); // стираем всю информацию с дисплея screenW = myGLCD.getDisplayXSize()-1; // получаем ширину дисплея screenH = myGLCD.getDisplayYSize()-1; // получаем высоту дисплея
}
void loop(){
// определяем координаты текущей точки графика graphX++; if(graphX>=screenW){graphX=0;} // сдвигаем точку графика по оси X graphY = map(Pulse.check(ISP_ANALOG),1024,0,0,screenH); // определяем точку графика по оси Y
// если состояние сенсора изменилось, то … if(Pulse.check(ISP_VALID)==ISP_CHANGED){ myGLCD.clrScr(); // стираем всю информацию с дисплея graphX=0; // сбрасываем координату текущей точки по оси X }
// если сенсор подключён, то … if(Pulse.check(ISP_VALID)==ISP_CONNECTED){
// выводим график myGLCD.setColor(colorBG); myGLCD.drawLine(graphX, 30, graphX, screenH ); if(graphX>0){ myGLCD.setColor(colorGR); myGLCD.drawLine(graphX, graphY0, graphX, graphY ); myGLCD.setColor(colorGR); myGLCD.drawLine(graphX-1,graphY0-1,graphX-1,graphY-1); // утолщаем линию }
// выводим пульс и сердце if(Pulse.check(ISP_BEEP)==0){myGLCD.setColor(colorCD); myGLCD.fillCircle(20, 20, 4);} if(Pulse.check(ISP_BEEP)==1){myGLCD.setColor(colorBG); myGLCD.fillCircle(20, 20, 4);} if(Pulse.check(ISP_BEEP)==2){myGLCD.setColor(colorCD); myGLCD.setFont(SmallFont); myGLCD.printNumI(Pulse.check(ISP_PULSE),24,16,3);}
// иначе, если сенсор отключён, то выводим сообщение об ошибке }else {myGLCD.setColor(colorER); myGLCD.setFont(BigFont); myGLCD.print(«DISCONNECTED», CENTER,100);}
// присваиваем координату текущей точки графика, координате предыдущей точки graphY0 = graphY; delay(5);
}
/* описание функции check() библиотеки iarduino_SensorPulse * Pulse.check(ISP_ANALOG); — возвращает число от 0 до 1024 — данные с аналогового входа, к которому подключён датчик * Pulse.check(ISP_PULSE); — возвращает число от 0 до 999 — пульс (количество пульсаций в минуту) * Pulse.check(ISP_BEEP); — возвращает число от 0 до 2621 — количество десятых долей секунды, прошедшее после последнего пика пульса * Pulse.check(ISP_VALID); — возвращает состояние датчика — ISP_DISCONNECTED — отключён (данные не соответствуют пульсу) * ISP_CONNECTED — подключён (данные похожи на пульс) * ISP_CHANGED — состояние сенсора изменилось (с подключён на отключён или наоборот) */

Алгоритм работы:

В начале кода:

  • подключаются библиотеки: iarduino_SensorPulse и UTFT;
  • подключаются шрифты: SmallFont и BigFont для вывода текста на TFT дисплей;
  • создаются константы: colorBG, colorGR, colorCD, colorER, которым присваиваются цвета в формате RGB565;
  • создаются переменные, для вывода графика: graphY0, graphY, graphX, screenW и screenH;
  • создаются объекты библиотек: myGLCD — для работы с дисплеем и Pulse — для работы с датчиком пульса.

В функции setup:

  • инициируем дисплей и датчик пульса;
  • стираем всю информацию с дисплея;
  • сохраняем ширину и высоту дисплея в переменные screenW и screenH, вычитая по единице из каждого параметра, так как координаты для графических функций начинаются с 0, а не с 1.

В функции loop:

  • определяем координаты конечной точки графика: graphX, graphY;
  • если сенсор подключен, то выводим график и показания пульса;
  • если сенсор отключен, то выводим сообщение «DISCONNECTED»;
  • если сенсор изменил своё состояние (с подключен на отключен или наоборот), то стираем всю информацию с дисплея;
  • в конце кода устанавливается задержка на 5 мс., чем больше значение задержки, тем больше пульсаций уместится на графике.

Получение данных:

Данные датчика пульса возвращает функция check() библиотеки iarduino_SensorPulse, которая принимает в качестве аргумента 1 из 4 параметров: ISP_ANALOG, ISP_PULSE, ISP_BEEP, ISP_VALID.

  • Pulse.check(ISP_ANALOG); — возвращает число от 0 до 1024 — данные с аналогового входа, к которому подключён датчик;
  • Pulse.check(ISP_PULSE); — возвращает число от 0 до 999 — пульс (количество пульсаций в минуту);
  • Pulse.check(ISP_BEEP); — возвращает число от 0 до 2621 — количество десятых долей секунды, прошедшее после последнего пика пульса;
  • Pulse.check(ISP_VALID); — возвращает состояние датчика — ISP_CONNECTED, ISP_DISCONNECTED, ISP_CHANGED:
    • ISP_CONNECTED — подключён (данные похожи на пульс);
    • ISP_DISCONNECTED — отключён (данные не соответствуют пульсу);
    • ISP_CHANGED — состояние сенсора изменилось (с подключён на отключён или наоборот).

Вывод данных:

С функциями библиотеки UTFT, для вывода данных на TFT дисплей, можно ознакомиться в разделе wiki — Работа с цветным графическим дисплеем.

  • График выводится прорисовкой линий от предыдущей (graphX-1,graphY0), до текущей (graphX,graphY) точки.
    • Координата graphX сдвигается от 0 до screenW, при каждом цикле loop.
    • Координата graphY число возвращенное функцией Pulse.check(ISP_ANALOG) и преобразованное функцией map() от диапазона 1024-0 к диапазону 0-screenH;
    • Координата graphY0 соответствует значению graphY предыдущего цикла loop.
    • Перед прорисовкой линий графика, выводится чёрная вертикальная линия, стирающая точку предыдущего графика.

  • Символ пульса (белый круг) выводится и стирается через определённый промежуток времени после фиксации пульса.
    • если Pulse.check(ISP_BEEP)==0 (пульс только что зафиксирован), то выводим белый закрашенный круг.
    • если Pulse.check(ISP_BEEP)==1 (после фиксации пульса прошла 0,1 сек), то закрашиваем белый круг, черным кругом.
  • Значение пульса возвращается функцией Pulse.check(ISP_PULSE) и выводится на дисплей через 0,2 сек после фиксации пульса Pulse.check(ISP_BEEP)==2.

Ссылки:

Источник: https://lesson.iarduino.ru/page/urok-27-pulsometr/

Send Data to ThingSpeak with Arduino

In order to send data to ThingSpeak™ using an Arduino®, you need an Arduino with network connectivity either onboard or with a shield. We have an official library for ThingSpeak and we require Arduino 1.6.x or above running on Windows®, MAC OS X®, and Linux®. This library needs to be installed and used by the Arduino device in order to send data to ThingSpeak using one of our examples.

Setup ThingSpeak

ThingSpeak requires a user account and a channel. A channel is where you send data and where ThingSpeak stores data. Each channel has up to 8 data fields, location fields, and a status field. You can send data every 15 seconds to ThingSpeak, but most applications work well every minute.

  • Sign up for new User Account – https://thingspeak.com/users/sign_up
  • Create a new Channel by selecting Channels, My Channels, and then New Channel
  • Note the Write API Key and Channel ID

Full REST Interface API information for ThingSpeak is available in the documentation.

Install ThingSpeak Communication Library for Arduino

In the Arduino IDE, choose Sketch/Include Library/Manage Libraries. Click the ThingSpeak Library from the list, and click the Install button.

Setup Arduino Sketch

We have provided a few Arduino sketch examples with the ThingSpeak library. They are designed to work right away with no changes.  To make the examples work with your ThingSpeak channel, you will need to configure the myChannelNumber and myWriteAPIKey variables.

unsigned long myChannelNumber = 31461; const char * myWriteAPIKey = «LD79EOAAWRVYF04Y»;

Send an Analog Voltage to ThingSpeak

The WriteSingleField Arduino sketch example reads an analog voltage from pin 0, and writes it to a channel on ThingSpeak every 20 seconds. Load the example in the Arduino IDE. Make sure to select the correct Arduino board and COM port. Then, upload the code to your Arduino.

Sending Multiple Values to ThingSpeak

Since ThingSpeak supports up to 8 data fields, you might want to send more than one value to ThingSpeak. To send multiple value to ThingSpeak from an Arduino, you use ThingSpeak.

setField(#,value) for each value to send and then use ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey) to send everything to ThingSpeak.

Use the WriteMultipleFields Arduino sketch example to send multiple pin voltages to ThingSpeak.

Examples

The library includes several examples organized by board type to help you get started. These are accessible in Examples > ThingSpeak menu of the Arduino IDE.

  • ReadField: Reading from a public channel and a private channel on ThingSpeak.
  • WriteSingleField: Writing a value to a single field on ThingSpeak.
  • WriteMultipleFields: Writing values to multiple fields and status in one transaction with ThingSpeak.

Complete source code and examples for the ThingSpeak Library are available on GitHub.

MATLAB Visualization

Now that your data is on ThingSpeak you can see this data on ThingSpeak using the MATLAB Visualizations app. On ThingSpeak, select Apps and then MATLAB Visualizations. Click “New”, select “Custom (no starter code), and click “Create”.

Enter the following MATLAB code and click Run and Save:

readChannelID = 93156; fieldID1 = 1; readAPIKey = 'MCI6XM81ZFOY8UCE'; %% Read Data %% [data, time] = thingSpeakRead(readChannelID, 'Field', fieldID1, 'NumPoints', 10, 'ReadKey', readAPIKey); %% Visualize Data %% plot(time, data);

Resources

Источник: https://community.thingspeak.com/tutorials/arduino/send-data-to-thingspeak-with-arduino/

Heart Rate Monitor on ThingSpeak IoT Platform

In this project we are going to make a heart beat detection and onitoring system using Arduino that will detect the heart beat using the pulse sensor and will show the readings in BPM (Beats Per Minute).

It will also send the readings to ThingSpeak server using the WiFi Bee module ESP8266, so that heart beats can be monitored from anywhere in the world over the internet.

ThingSpeak is a great source for displaying the data online and you can access the data from ThingSpeak at any time and at any place.

Components Required

Hardware:

  • I/O Expansion Shield for Arduino

Software or online services:

Setting up the ThingSpeak

1 / 2 • ThingSpeak.com Homepage

ThingSpeak provides very good tool for IoT based projects. By using ThingSpeak site, we can monitor our data and control our system over the Internet, using the Channels and webpages provided by ThingSpeak.

ThingSpeak ‘Collects’ the data from the sensors, ‘Analyze and Visualize’ the data and ‘Acts’ by triggering a reaction. We have previously used ThingSpeak in Weather station project using Raspberry Pi and using Arduino, check them to learn more about ThingSpeak.

Here we are briefly explaining to use ThingSpeak for this beat detection and monitoring system. The ThingSpeak service is operated by MathWorks.

  • First of all, user needs to Create a Account on ThingSpeak.com, then Sign In and click on Get Started.
  • After creating an account, go to channels and create a new channel. Now write the name of the Channel and name of the Fields. Also tick the check box for ‘Make Public’ option below in the form and finally Save the Channel. Now your new channel has been created.

Creating the channel.

  • After this go to API keys and copy your Write API key. You will need this in the code. Check the Full Code at the end.

Note the API Key of the channel.

Circuit and Explanation

ESP8266 WiFi Bee

WiFi Bee-ESP8266 is a Serial-to-WiFi module using XBee design in a compact size, compatible with XBee slot, applicable to a variety of 3.3V single-chip system. It can be used for Arduino, wireless data transfer, remote control.

On-board switch can be used to easily select the Startup module or Upgrade firmware. ESP8266 arduino module has a powerful on-chip processing and storage capacity, built-in 32-bit processor, built-in Lwip protocol stack.

Support AP+STA mode co-exist.

Heart Rate Sensor Module

The DFRobot heart rate sensor is a thumb-sized heart rate monitor designed for Arduino microcontrollers.

Источник: https://www.hackster.io/techmirtz/heart-rate-monitor-on-thingspeak-iot-platform-4977a8

Сеть беспроводных устройств на Arduino

Микро-контроллер на платформе Arduino — отличная платформа для хобби-проектов различной степени сложности и полезности. Не буду утверждать, что платформа Arduino есть наилучший выбор для профессиональных решений (скорее соглашусь с обратным), но для моих любительских «поделок» в области домашней автоматики это оптимальный вариант. Т.е.

контроллер хорош сам по себе, но, если к тому же он перестанет быть «самим по себе», а будет уметь «общаться» с себе подобными, при этом не обрастая дополнительными проводами, то его полезность и применимость может многократно вырасти. Итак, начнём строить наш домашний SkyNet…

За основу нашей сети возьмём бюджетные радио-модули, работающие на частоте 433.90MHz.

Стоимость одного такого модуля составляет порядка $2.5, так что невелики затраты для того, чтобы организовать связь с внешним миром. Конечно, для связи можно использовать и готовые ethernet-модули и даже делать симбиоз с беспрводными роутерами на базе альтернативных прошивок, но во многих случаях проще и дешевле всё сделать на вот таких радио-модулях.

Передатчик:Приёмник:Качество работы и дальность связи этих модулей оставляет желать лучшего, и я бы не стал верить оптимистичным заявлениям продавцов о радиусе действия «>500m». В лучшем случае 100 метров на открытой местности, ну и гораздо меньше при наличии бетонных перегородок. Тем не менее, для квартиры или небольшого загородного участка их хватит.

Можно использовать и более качественные (соответственно, более дорогие) радио-модули, поэтому статья может рассматриваться как идейная концепция, применимая к многим возможным вариантам реализации.

Важный момент: в данном руководстве я не буду рассматривать вариант создания сети с контролем качества передачи данных.

Если сравнение с ethernet-протоколами можно считать уместным, то мы не будем строить сеть передачи TCP-пакетов, а, скорее, UDP.

Каждый из модулей подключается к контроллеру элементарно — питание через Vcc/Gnd и вывод Data подключается к свободному цифровому входу на микро-контроллере. Для повышения качества приёма/передачи рекомендуется дополнительно подключить антенну в виде провода размером 10-15 см.

Кстати, дальность связи зависит ещё и от подающегося на модуль питания — если их запитать от 12В, то дальность и надёжность связи значительно возрастает.

Приёмник и передатчик подключенный к микро-контроллеру Arduino UNO R3:Таким образом, мы сделали два устройства: первое — передатчик, который будет «вещать» в эфир какую-то информацию; второе — приёмник, который, соответственно, будет эфир «слушать». Далее, дело за тем, что бы и передача и приём были осмысленными и полезными для нас.

Библиотека VirtualWire

Чем хороша платформа Arduino, так это наличием огромного количества готовых библиотек для работы с всевозможными устройствами. Можно, конечно, с радио-модулями работать и без каких-либо библиотек, но тогда нужно разрабатывать свой протокол связи с контрольными суммами и прочими вещами.

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

Принцип использования: на передатчике формируем набор данных для пересылки (в виде строки символов либо байт-кодов), а на приёмнике, при получении «корректного» пакета данных, их отображаем. Проще всего это увидеть на примерах, которые идут с самой библиотекой. Код передатчика с использованием VirtualWire (из примеров использования библиотеки):Посмотреть код// transmitter.

pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
#include void setup()
{ Serial.begin(9600); // Debugging only Serial.

println(«setup»); // Initialise the IO and ISR vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); // Bits per sec
} void loop()
{ const char *msg = «hello»; digitalWrite(13, true); // Flash a light to show transmitting vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Wait until the whole message is gone digitalWrite(13, false); delay(200);
}
Код приёмника:Посмотреть код// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
#include void setup()
{ Serial.begin(9600); // Debugging only Serial.println(«setup»); // Initialise the IO and ISR vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); // Bits per sec vw_rx_start(); // Start the receiver PLL running
} void loop()
{ uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) // Non-blocking { int i; digitalWrite(13, true); // Flash a light to show received good message // Message with a good checksum received, dump it. Serial.print(«Got: «); for (i = 0; i < buflen; i++) { Serial.print(buf[i], HEX); Serial.print(" "); } Serial.println(""); digitalWrite(13, false); } }

Протокол обмена данными

Следующим шагом у нас будет выход на новый уровень абстракции, а именно разработка типовой структуры пакета, которыми будут обмениваться все наши устройства. Это позволит в будущем подключать к нашей сети новое оборудование, которое сможет использовать сигналы от уже имеющихся устройств.

Я приведу ту структуру данных, которая показалась мне оптимальной при имеющихся возможностях оборудования. Итак, ниже по тексту список основных параметров, которые отправляются в эфир с каждым пакетом:

device_id — идентификатор устройства, отправившего пакет.

Тип данных: unsigned int (длина 2 байта, диапазон значений от 0 до 65535) — как мне кажется, вполне достаточно для домашней сети.

destination_id — идентификатор устройства, кому предназначен пакет. Тип данных тот же, что и у device_id. Важно отметить, что пакеты всё равно будут получаться всеми приёмниками, но уже программой на самом приёмнике можно «отсекать» пакеты, которые устройству не предназначены. Так же можно принять в качестве правила то, что значение «0» в данном поле означает широковещательный пакет.

packet_id — идентификатор пакета. Тип тот же unsigned int.

По замыслу, при отправке пакет «помечается» случайным числом, что может быть использовано для повторной отправки одного и того же пакета несколько раз с каким-то интервалом — ввиду ненадёжности протокола это имеет смысл, но принимающее устройство должно фильтровать повторные команды дабы не выполнять одно и то же действие в качестве реакции на пакет данных.

command — тип команды. Тип данных byte (длина 1 байт, диапазон значений от 0 до 255). Это так называемый «класс команды», а по сути информация о том, что за данные мы посылаем.

Например, мы можем составить собственную таблицу команд, отведя для команды управления открытием/закрытием номер 10, а для команды передачи данных о температуре номер 15. Главное, чтобы эта таблица у нас была постоянной.

А можно поступить ещё хитрее — подсмотреть возможные команды в том же протоколе ZWave и использовать у себя их таблицу, чтобы было всё «как у взрослых», и не нужно было заботиться о сохранности этих ценных сведений.

data — собственно данные. Тип данных int (длина 2 байта, диапазон значений от -32,768 до 32,767. В этом поле мы передаём непосредственно данные в виде одного числа. Мало? Ну мне показалось достаточным.

Температуру можно передать (например усвловившись, что она умножена на 100), статус датчика движения — легко, команду для приёмника с реле — проще простого.

Текстовые данные на внешний дисплей, конечно, не отправишь, но такой цели и не ставилось, а для моих настоящих и будущих устройств хватит за глаза и пары десятков чисел, чтобы описать все возможные команды.

В итоге мы имеем длину пакета равную 9 байт. Короткий пакет, на самом деле, очень хорошо — во-первых, меньше вероятность, что он по дороге «сломается»; во-вторых, меньше время на пересылку, что уменьшает вероятность совместного использования эфира несколькими устройствами. Кстати, последнее обстоятельства потребует «экономно», т.е.

не часто слать информацию. При этом желательно, чтобы при переодической отправке показаний промежуток между сеансами несколько варьировался. Но это всё надо уже предусматривать при интеграции конкретного устройства.

Как бы то ни было, я бы не советывал слишком налегать на универсальность структуры в ущерб минимального размера пакета передаваемых данных.

Итак, мы определились со структурой пакета, теперь нужно реализовать обмен. Тут нам на помощь приходит ещё одна полезная библиотека под названием EasyTransfer.

Собственно, она работает «поверх» VirtualWire, позволяя описать структуру данных на приёмнике/передатчике и вести обмен уже не набором байт-кодов, а указанной структурой целиком.

В нашем случае структура данных будет иметь следующий вид:struct SEND_DATA_STRUCTURE{ unsigned int device_id; unsigned int destination_id; unsigned int packet_id; byte command; int data;
};
Крайне важно, чтобы структура на приёмнике и передачтике была один-в-один, иначе мы будем получать некорректную информацию. Собственно, поэтому и важно заранее определиться со структурой пакета. Пару слов про поле device_id. Его можно задавать вручную для каждого устройства, но я пошёл по более простому пути — при первом запуске генерирую это значений случайным образом и записываю в энерго-независимую область памяти EEPROM. Вероятность того, что разные устройства получают одинаковые идентификаторы из дипазона значений поля unsigned int крайне мала и, опять же, в моём случае риск вполне оправдан. Применим полученные знания, для написания примера реализации на нашем протоколе обмена. Передатчик у нас будет отправлять значение внутреннего счётчика, а приёмник его отображать. Код передатчика:Посмотреть код#include
#include
#include // эта библиотека нужна для работы с энерго-независимой памятью const int led_pin = 13;
const int transmit_pin = 2;
unsigned int unique_device_id = 0;
unsigned int count = 1; //create object
EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE{ //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire) unsigned int device_id; unsigned int destination_id; unsigned int packet_id; byte command; int data;
}; //переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata; //ниже пару функций для записи данных типа unsigned int в EEPROM
void EEPROMWriteInt(int p_address, unsigned int p_value) { byte lowByte = ((p_value >> 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } unsigned int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } unsigned int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } unsigned int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte

Источник: https://habr.com/post/182068/

Передача данных в инфракрасном диапазоне при помощи Arduino

        Всем доброго времени дня (или ночи, как вам удобно), начнём пожалуй с лирического вступления. Сейчас у многих дома есть телевизор с пультом ДУ(дистанционного управления), тюнер, DVD проигрыватель.

Многие люди(и семьи) не представляют свой домашний быт без пульта ДУ в руке. Согласитесь — как здорово быть властелином домашней техники, и в любой момент диктовать этим железякам свою волю.

В этой статье, мы бы хотели рассмотреть технологию дистанционного управления более углубленно, и привести некоторые примеры применения для своих нужд.

        Итак, что же нам потребуется в качестве компонентов для нашего эксперимента? Как вариант продаются готовые модули ИК-пульта и ИК-приёмника. Но нам не хочется ждать и платить деньги, поэтому будет действовать более хардкорно.

Возьмём за основу пульт ДУ неизвестного происхождения, также у нас имеется кусок платы от китайского тюнера на котором распаян инфракрасный приёмник. На фото ниже вы можете видеть эти комплектующие.

Если признаться честно — пульт ДУ был найден среди ненужного барахла в столе офиса, а плата с ИК-приёмником была взята в ближайшей радиомастерской. 

        Ну так что же, как говаривал Ганнибал — «Вперед, на Карфаген». Нам нужно просто выпаять приёмник и подключить его к плате Arduino по нижеследующей схеме…

        ИК-приёмник который был выпаян из платы не имеет какой либо маркировки, это просто очередной неизвестный китайский радиокомпонент, каких выпущено было тысячи. Вкратце можно сказать — в одном корпусе он объединяет фотодиод, предусилитель и формирователь.

На выходе формируется обычный ТТЛ-сигнал без заполнения, пригодный для дальнейшей обработки микроконтроллером. Несущая частота возможно(!) 36 кГц, но сейчас это не так важно… Просто попробуем его подключить к плате Arduino, условная схема даст нужную распиновку данного девайса.

На схеме ниже, выделенное красным — это форма корпуса в котором выполнен наш ИК-приёмник, выделенное зеленым — распиновка по которой он подключен к плате Arduino. 

        Итак, всё подключено. Чтобы прочитать коды с пульта ДУ существует библиотека IRremote.h, именно с её помощью будем изучать наш пульт, а точнее коды кнопок. В дальнейшем используем прочитанные коды в своих целях.

Скетч, при помощи которого будут прочитаны коды кнопок, представлен в примерах этой библиотеки, называется он IRrecvDemo.

Внимание !!! Скетч при компиляции выдаёт ошибку, в  самом начале  нужно добавить еще две подключаемые библиотеки:

#include «boarddefs.h»   //Добавочная библиотека #include «IRremote.h» #include «IRremoteInt.h» //Добавочная библиотека int RECV_PIN = 2;        //Пин подключения выходного сигнала с ИК-приёмника //Создаём экземпляр класса IRrecv, в качестве параметра передаём пин подключения сигнала ИК-приёмника IRrecv irrecv(RECV_PIN);   decode_results results;   //Переменная для сохранения полученного кода нажатой кнопки void setup() {   Serial.begin(9600);   irrecv.enableIRIn();     //Включение ИК-приёмника в работу } void loop() {   if (irrecv.decode(&results))             //Если произошло событие/кнопка была нажата   {     Serial.println(results.value, HEX);    //Выводим в монитор порта код нажатой кнопки в шестнадцатиричном виде     irrecv.resume();                       //Считываем следующую значение/кнопку   }   delay(100); } 

        После того как скетч был залит в плату Arduino(мы используем Arduino Nano на шилде I/O Wireless Shield for Nano), можно открыть монитор порта и посмотреть какие появляются коды при нажатии кнопок на пульте ДУ. Результат работы скетча представлен на скриншоте ниже:

        Кстати, в качестве монитора порта мы используем свой проверенный софт, если кому интересно — почитать статью и скачать Serial Monitor Pro можно здесь. 

Далее, нужно оформить полученные коды кнопок в виде констант, сделано это будет примерно так:

#define KEY_ONOFF 0x807F807F    //Кнопка Включения/Выключения #define KEY_MUTE  0x807F48B7    //Кнопка Mute #define KEY_1     0x807F00FF    //Кнопка 1 #define KEY_2     0x807FE01F    //Кнопка 2 #define KEY_3     0x807F609F    //Кнопка 3 #define KEY_4     0x807F20DF    //Кнопка 4 #define KEY_5     0x807FD02F    //Кнопка 5 #define KEY_6     0x807F50AF    //Кнопка 6 #define KEY_7     0x807F10EF    //Кнопка 7 #define KEY_8     0x807FF00F    //Кнопка 8 #define KEY_9     0x807F708F    //Кнопка 9 #define KEY_0     0x807FC837    //Кнопка 0

        И вот теперь, в общем то всё готово для финального теста — это будет элементарный тест управления включением/выключением релейных модулей. Приведем небольшое задание:

  • Используем два релейных модуля
  • Реле №1 привязываем к кнопке «1» пульта
  • Реле №2 привязываем к кнопке «2» пульта 
  • Включение любого из релейных модулей производится нажатием на кнопку к которой он привязан
  • Выключение любого из релейных модулей также производится нажатием на кнопку к которой он привязан
  • Нажатие на кнопку On/Off безусловно выключает оба релейных модуля(если они были включены, либо один из них включеный) 

Скетч, который реализует вышеописанное задание:

#include «boarddefs.h»   //Добавочная библиотека #include «IRremote.h» #include «IRremoteInt.h» //Добавочная библиотека #define KEY_ONOFF 0x807F807F    //Кнопка Включения/Выключения #define KEY_1     0x807F00FF    //Кнопка 1 #define KEY_2     0x807FE01F    //Кнопка 2 #define RELOUT1 3               //Выходной порт для реле 1 #define RELOUT2 4               //Выходной порт для реле 2 int RECV_PIN = 2; IRrecv irrecv(RECV_PIN); decode_results results; static boolean REL1_ONOFF = false; static boolean REL2_ONOFF = false; void setup() {   pinMode(RELOUT1, OUTPUT);   pinMode(RELOUT2, OUTPUT);     Serial.begin(9600);   irrecv.enableIRIn(); // Start the receiver } void loop() {   if (irrecv.decode(&results))   {     switch(results.value)     {       case(KEY_ONOFF):         REL1_ONOFF = false;         REL2_ONOFF = false;         break;       case(KEY_1):         if(REL1_ONOFF)           REL1_ONOFF = false;         else           REL1_ONOFF = true;         break;       case(KEY_2):         if(REL2_ONOFF)           REL2_ONOFF = false;         else           REL2_ONOFF = true;         break;     }     irrecv.resume();   }   digitalWrite(RELOUT1, REL1_ONOFF);   digitalWrite(RELOUT2, REL2_ONOFF);     delay(100); }

        И в конце статьи — видео, которое демонстрирует работу обоих скетчей. При желании и наличии творческой фантазии, можно расширить парк подключаемых модулей и управлять этим всем более продвинуто. Мы же в своей статье, постарались привести базовый пример применения этой технологии. Спасибо за внимание и приятного просмотра !!!

Источник: http://arduino.on.kg/peredacha-dannyh-v-infrakrasnom-diapazone-pri-pomoshchi-Arduino

Платформа датчиков e-Health для Arduino и Raspberry Pi

Cooking Hacks запустил новую версию первого биометрического шилда для iArduino и Raspberry Pi: платформа датчиков e-Health V2.0 (биометрические/медицинские применения).

Платформа датчиков e-Health V2.

0 позволяет пользователям Arduino и Raspberry Pi выполнять биометрические и медицинские измерения, в которых необходимо мониторить тело с помощью 10 различных датчиков: пульса, кислорода в крови (SPO2), воздушного потока (дыхание), температуры тела, ЭКГ (ECG), глюкометра, кожно-гальванической реакции (GSR — потливость), артериального давления (тонометр), положение пациента (акселерометр) и датчика мышц/электромиографии (EMG).

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

Собранная биометрическая информация может быть передана беспроводной сетью с использованием любого из 6 доступных вариантов передачи: Wi-Fi, 3G, GPRS, Bluetooth, 802.15.4 и ZigBee, в зависимости от применения.

Если необходимо диагностическое изображение в режиме реального времени , то можно присоединить камеру к модулю 3G для отправки фотографий и видео пациента в медицинский центр диагностики.

Данные могут быть отправлены «в облако» для постоянного хранения или визуализированы в реальном времени, отправив их непосредственно на ноутбук или смартфон. Были разработаны приложения для iPhone и Android, чтобы легко увидеть информацию о пациенте.

Это открывает новую эру изделий медицинского назначения с открытым исходным кодом. RPi предоставляет новые приложения e-Health и продукты концепции быстрой диагностики с необходимыми инструментами. Однако, одним из ключевых моментов в таких приложениях является конфиденциальность и несколько уровней безопасности, предоставленные с платформой.

Уровни линий связи используют WPA2 для Wi-Fi и AES 128 для ZigBee и 802.14.5. На прикладном уровне используется защищенный протокол (HTTPS) для обеспечения защищенного туннеля точка-точка между веб-сервером и каждым узлом датчика. Банки используют этот тип безопасных протоколов связи для своих транзакций.

Для Arduino:

Платформу датчиков e-Health можно получить на Cooking Hacks. По сравнению с дорогими и проприетарными решениями медицинского рынка, Cooking Hacks обеспечивает сравнительно дешевую и открытую альтернативу.

Cooking Hacks также обеспечивает мост для подключения RPi к шилд Arduino, который включает возможность подключения аналоговых и цифровых датчиков для обеих плат. Это позволяет совместное использование мощности и способности RPi с выводами Arduino.

Кроме того, также предоставляется библиотека arduPi, что позволяет использовать RPi с тем же кодом, который используется для Arduino.

Библиотека arduPi позволяет быть взаимозаменяемыми беспроводным модулям, датчикам, шилдам и электронным модулям или приводам как для Rpi, так и для Arduino.

Для Raspberry Pi:

  

Примечание: Платформа датчиков e-Health еще не имеет медицинской справки. Таким образом, она не должна использоваться для мониторинга пациентов в критическом состоянии и которые должны находиться под наблюдением более точных медицинских методов или тех, чьи условия требуют мониторинг для скрытой профессиональной диагностики.

(По материалам EN: internetmedicine.com)

Источник: http://isearch.kiev.ua/ru/searchpracticeru/-science-ru/1805

Arduino IoT с новым набором от Амперки – Age of Geeks

Arduino — пусть не сильно новая, но проверенная временем платформа, на базе которой можно делать простые надежные решения, в том числе для умного дома. Собрать схему с парой датчиков и реле — дело нехитрое.

Мы не раз писали об этом, в том числе на примере набора «Матрешка» от «Амперки». Когда приходит понимание, возникает желание связать воедино несколько устройств и подключить свое решение к интернету. А классическая Arduino Uno не имеет встроенных средств ни для того, ни для другого.

Ответить на вопрос «Как?» призвано расширение набора «Матрешка» — «Интернет вещей».

В легкой коробочке находится весомое содержимое — 5 важных компонентов, которые однозначно пригодятся при создании умного дома:

  • Troyka Slot Shield — специальная плата расширения для Arduino Uno и Iskra JS для установки Troyka-модулей;
  • электромеханическое реле для управления нагрузкой, например, светом;
  • SD-кардридер и карта памяти формата microSD к нему для хранения данных или настроек;
  • король набора — Wi-Fi модуль.

Вот такой «бутерброд» можно соорудить с помощью Troyka Slot Shield

Важно отметить, что все компоненты выполнены в форм-факторе Troyka-модулей. Это сильно упрощает монтаж, правда, кого-то может немного запутать при попытке сборки схем на макетке. Но если следовать прилагаемому руководству, то принцип работы и размещения модулей на Troyka-шилде становятся понятными.

А руководство в этом наборе — одно из главных его достоинств. Инженеры «Амперки» подошли к делу основательно и креативно. В 97-страничном красочном мануале в бодрой и информативной форме рассказывается об основах работы протокола HTTP, особенностях Serial интерфейса и других фундаментальных понятиях, на которых строятся современные сети и интернет вещей (тот самый IoT).

На протяжении 8 экспериментов руководство предлагает создавать простые и более сложные устройства, так или иначе взаимодействующие с сервисами в интернете. Термометр, отправляющий показания на dweet.

io, напоминалка, работающая в связке с сервисом IFTTT, Telegram-бот и полноценное сердце будущего умного дома, подключенное к сервису Blynk, — все это собирается в ходе опытов на базе Arduino и набора «Интернет вещей».

Мой любимый компонент — Wi-Fi модуль. Он сделан на базе микроконтроллера ESP8266. Это решение, набравшее большую популярность в последнее время. Контроллеры ESP — неплохая альтернатива Arduino.

Они обладают достаточной мощностью и большим числом входов/выходов, что позволяет использовать их вместо Arduino и даже программировать из Arduino IDE. Но об этом мы обязательно расскажем в отдельной статье.

А пока что «Амперка» предлагает использовать данный контроллер в качестве Wi-Fi интерфейса. Который, кстати, можно перепрошивать, чему в руководстве посвящена целая глава.

Руководство выполнено на отлично

Пожалуй, единственное, чего мне не хватило в этом наборе — пары RS-485 модулей. В конце концов, иногда 2 «ардуинки» просто нужно соединить кабелями, не усложняя себе жизнь беспроводными решениями.

RS-485 — очень популярный промышленный стандарт, применяющийся в огромном количестве устройств, работающих в составе современных АСУТП.

С его помощью устройства на базе Arduino можно подключать даже к серьезным SCADA-системам.

Другое дело, что поверх сети RS-485 в промышленных системах часто работают специализированные протоколы, по которым устройства и обмениваются информацией, например, ModBus. И эта тема уже несколько выходит за рамки простого умного дома.

Будем надеяться, что со временем для «Матрешки» появится расширение с подзаголовком «АСУТП», содержащее модули и азы работы с более серьезными устройствами для тех, кто всерьез заинтересовался темой.

С другой стороны, никто не мешает самостоятельно докупить пару модулей и начать изучение.

Дополнение «Интернет вещей» содержит не так много новых электронных компонентов, зато использует их на полную. Что важнее, в комплекте имеется руководство, дающее массу полезной информации о том, как подключить Arduino к интернету и использовать популярные сервисы вроде Telegram, Blynk и IFTTT для управления своим умным домом. Остальное — дело техники.

Вместе с набором к нам также попал Zelo-модуль от «Амперки».

Это компактная плата, совмещающая в себе небольшой блок питания, преобразующий 220 В переменного тока в 5 В постоянного, и электромеханическое реле.

Идеально для ситуаций, когда требуется запитать контроллер с Wi-Fi модулем, но нет желания тянуть к нему кабеля. Подробнее об этом модуле мы обязательно расскажем в одном из следующих материалов.

Zelo-модуль

Источник: https://ageofgeeks.com/technology/arduino-iot-amperka/

Метеостанция на Arduino с беспроводным датчиком температуры

Как-то прогуливаясь по городу увидел новый открывшийся магазин радиоэлектроники. Зайдя в него обнаружил большое количество шилдов для Ардуины т.к. у меня дома была Arduino Uno и Arduino Nano сразу пришла мысль поиграться с передатчиками сигнала на расстоянии. Решил купить самый дешевый передатчик и приемник на 433 МГц:

Передатчик сигнала.

Приемник сигнала.

Записав простейший скетч передачи данных (пример взят от сюда), выяснилось, что передающие устройства могут вполне подойти для передачи простейших данных, таких как температура, влажность.

Передатчик имеет следующие характеристики:
1. Модель: MX -FS — 03V
2. Радиус действия (зависит от наличия преграждающих предметов): 20-200 метров
3. Рабочее напряжение: 3.5 -12В
4.

Размеры модуля : 19 * 19 мм
 5. Модуляция сигнала : AM
6. Мощность передатчика: 10 мВт
7. Частота: 433 МГц
8. Необходимая длина внешней антенны : 25см
9.

Простота подключения (всего три провода): DATA ; VCC ; земля.

Характеристики приемного модуля:
1. Рабочее напряжение: DC 5В
2. Ток: 4мA
3. Рабочая частота: 433,92 МГц
4. Чувствительность : — 105дБ
5. Размеры модуля : 30 * 14 * 7 мм
6. Небходима внешняя антенна: 32 см.

В просторах интернета сказано, что дальность передачи информации на 2Кб/сек может доходить до 150м. Сам не проверял, но в двухкомнатной квартире принимает везде.

Аппаратная часть домашней метеостанции

После нескольких экспериментов решил подключить к Arduino Nano датчик температуры, влажности и передатчик.

Подключение датчика температуры, влажности и передатчика

Датчик температуры DS18D20 подключается к ардуино следующим образом:

1) GND к минусу микроконтроллера.
2) DQ через подтягивающий резистор к земле и к выводу D2 Ардуины
3) Vdd к +5В.

Более детально почитать о работе датчика можно здесь.

Модуль передатчика MX -FS — 03V питается от 5 Вольт, вывод данных (ADATA) подключен к выводу D13.

К Ардуино Уно подключил LCD дисплей и барометр BMP085.

Схема подключение к ардуино уно

Приемник сигнала подключен к выводу D10.

Модуль BMP085 — цифровой датчик атмосферного давления. Датчик позволяет измерять температуру,давление и высоту над уровнем моря. Интерфейс подключения: I2C. Напряжение питания датчика 1.8-3.6 В

Подключается модуль к Arduino также, как и другие I2C устройства:

  • VCC — VCC (3,3 В); 
  • GND — GND; 
  • SCL — к аналоговому выводу 5;
  • SDA — к аналоговому выводу 4.

DHT11:

  • Очень низкая стоимость
  • Питание и I/O 3-5 В
  • Определение влажности 20-80% с 5% точностью
  • Определение температуры 0-50 град. с 2% точностью
  • Частота опроса не более 1 Гц (не более раза в 1 сек.)
  • Размеры 15.5мм x 12мм x 5.5мм
  • 4 вывода с расстоянием между ножками 0.1″

DHT имеет 4 вывода:

  1. Vcc (3-5V питание)
  2. Data out — Вывод данных
  3. Не используется
  4. Общий

Подключается к D8 Ардуины.

Программная часть домашней метеостанции

Передающий модуль измеряет и передает температуру раз в 10 минут.

Ниже привожу программу:

/*
Версия скетча 1.0
Отсылаем температуру каждые 10мин. */
#include #include #include #define ONE_WIRE_BUS 2 //Пин подключения датчика Даллас OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer; void setup(void)
{ //Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) sensors.begin(); if (!sensors.getAddress(insideThermometer, 0)); printAddress(insideThermometer); sensors.setResolution(insideThermometer, 9); } void printTemperature(DeviceAddress deviceAddress)
{ float tempC = sensors.getTempC(deviceAddress); //Serial.print(«Temp C: «); //Serial.println(tempC); //Формирование данных для для отправки int number = tempC; char symbol = 'c'; //Служебный символ определения что это датчик String strMsg = «z «; strMsg += symbol; strMsg += » «; strMsg += number; strMsg += » «; char msg[255]; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay(200); } void loop(void)
{ for (int j=0; j

Источник: http://cxem.net/arduino/arduino115.php

Ссылка на основную публикацию