Передача телеметрии
Немного усложним схемы обоих устройств. На стороне передатчика №1 добавим два датчика, к примеру, датчик температуры LM35 и фоторезистор. На стороне приемника №2 подключим к Ардуино ЖК дисплей 1602. Дополненная программа для передатчика будет выглядеть следующим образом.
Программа для передатчика
#include <SerialFlow.h>
const byte temp_pin = A0;
const byte photo_pin = A1;
SerialFlow rd(7,8);
const unsigned long data_to = 100;
unsigned long tm, data_next;
void setup(void){
pinMode(temp_pin, INPUT);
pinMode(photo_pin, INPUT);
rd.setPacketFormat(2, 2);
rd.begin(0xF0F0F0F0E1LL,0xF0F0F0F0D2LL);
}
void loop(void){
tm = millis();
if( tm > data_next ){
data_next = tm + data_to;
rd.setPacketValue( analogRead(temp_pin) );
rd.setPacketValue( analogRead(photo_pin) );
rd.sendPacket();
}
}
Теперь мы передаем в пакете два числа в диапазоне от 0 до 1023, следовательно в формате пакета изменится только его размер.
Программа для приемника
Будем использовать ЖК дисплей 1602 с интерфейсом I2C. Для этого подключим библиотеку LiquidCrystal_I2C.
#include <SerialFlow.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
SerialFlow rd(7,8);
void setup(void){
rd.setPacketFormat(2, 2);
rd.begin(0xF0F0F0F0D2LL,0xF0F0F0F0E1LL);
lcd.init();
lcd.backlight();
}
void loop(void){
unsigned int v1,v2;
if( rd.receivePacket() ){
v1 = rd.getPacketValue(0);
v2 = rd.getPacketValue(1);
lcd.setCursor(0,0);
lcd.print(v1);
lcd.setCursor(8,0);
lcd.print(v2);
}
}
Здесь мы также меняем формат пакета, увеличивая его размер. При чтении чисел из пакета вызываем последовательно функции getPacketValue с аргументами 0 и 1.
Загружаем обе программы на соответствующие Ардуино и проверяем работу!