Наткнулся в инете на интересную. статью подключения китайского метео датчика к Arduino, ключевые слова-
Подключение беспроводных передатчиков SL-TX583 к Arduino


-первая ссылка в гугле. Есть код и описание протокола, вывод в ком порт. Хотел сделать блок с вывродом на LCD для встраивания в проекты, но силенок не хватает

Поршу помощи, думаю будет полезно многим.
Описание протокола
[scroll]Описание протокола передачи данных
Датчик каждый раз посылает 37 импульсов:
1890 3780 1890 3780 3780 3780 3780 3780 1890 1890 3780 3780 3780 1890 1890 1890 1890 1890 1890 1890 3780 3780 1890 1890 4050 1890 4050 4050 1890 1890 4050 1890 3780 1890 3780 3780 9180
Где первые 4 импульса – заголовок, а последний 1 импульс – конец. Они предназначены для обнаружения полезных импульсов.
Таким образом, мы проверяем каждый из импульсов, чтобы определить 0 или 1. Высокий импульс означает 1, а низкий импульс означает 0. В результате получаем следующий вывод:
0101111100111000000011001011001010111
Каждая цифра или группа имеет определенный смысл:
§ Заголовок от 0 до 4
§ ID: от 5 до 12
§ Батарея: 13
§ TX режим: 14
§ Канал: от 15 до 16
§ Температура: от 19 до 28
§ Влажность: от 29 до 36
§ Конец: 37
0101 11110011 1 0 00 000011001011 00101011 1
§ Заголовок всегда определяется как двоичное число 0101
§ ID определяется как двоичное число
§ Батарея определяет состояние аккумулятора
§ Режим TX определяет, был ли сигнал, послан автоматически или вручную
§ Канал определяется в виде двоичного числа и определяет какой канал использует датчик
§ Температура определяется как двоичное число, и представляет температуру
§ Влажность определяется как двоичное число, и представляет собой влажность
§ Конец всегда определяется как двоичное число 1
[/scroll]
код
Код: Выделить всё
#define DataBits0 4 // Number of data0 bits to expect
#define DataBits1 32 // Number of data1 bits to expect
#define allDataBits 36 // Number of data sum 0+1 bits to expect
// isrFlags bit numbers
#define F_HAVE_DATA 1 // 0=Nothing in read buffer, 1=Data in read buffer
#define F_GOOD_DATA 2 // 0=Unverified data, 1=Verified (2 consecutive matching reads)
#define F_CARRY_BIT 3 // Bit used to carry over bit shift from one long to the other
#define F_STATE 7 // 0=Sync mode, 1=Data mode
// Constants
const unsigned long sync_MIN = 8000; // Minimum Sync time in micro seconds
const unsigned long sync_MAX = 10000;
const unsigned long bit1_MIN = 2500;
const unsigned long bit1_MAX = 6000;
const unsigned long bit0_MIN = 1000;
const unsigned long bit0_MAX = 2500;
const unsigned long glitch_Length = 700; // Anything below this value is a glitch and will be ignored.
// Interrupt variables
unsigned long fall_Time = 0; // Placeholder for microsecond time when last falling edge occured.
unsigned long rise_Time = 0; // Placeholder for microsecond time when last rising edge occured.
byte bit_Count = 0; // Bit counter for received bits.
unsigned long build_Buffer[] = {0,0}; // Placeholder last data packet being received.
volatile unsigned long read_Buffer[] = {0,0}; // Placeholder last full data packet read.
volatile byte isrFlags = 0; // Various flag bits
void PinChangeISR0(){ // Pin 2 (Interrupt 0) service routine
unsigned long Time = micros(); // Get current time
if (digitalRead(2) == LOW) { // Set 'HIGH' some receivers
// Falling edge
if (Time > (rise_Time + glitch_Length)) {
// Not a glitch
Time = micros() - fall_Time;
// Subtract last falling edge to get pulse time.
if (bitRead(build_Buffer[1],31) == 1)
bitSet(isrFlags, F_CARRY_BIT);
else
bitClear(isrFlags, F_CARRY_BIT);
//Serial.println(isrFlags,BIN);
if (bitRead(isrFlags, F_STATE) == 1) {
// Looking for Data
//Serial.println(Time);
if ((Time > bit0_MIN) && (Time < bit0_MAX)) {
// 0 bit
build_Buffer[1] = build_Buffer[1] << 1;
build_Buffer[0] = build_Buffer[0] << 1;
if (bitRead(isrFlags,F_CARRY_BIT) == 1)
bitSet(build_Buffer[0],0);
bit_Count++;
}
else if ((Time > bit1_MIN) && (Time < bit1_MAX)) {
// 1 bit
build_Buffer[1] = build_Buffer[1] << 1;
bitSet(build_Buffer[1],0);
build_Buffer[0] = build_Buffer[0] << 1;
if (bitRead(isrFlags,F_CARRY_BIT) == 1)
bitSet(build_Buffer[0],0);
bit_Count++;
}
else {
// Not a 0 or 1 bit so restart data build and check if it's a sync?
bit_Count = 0;
build_Buffer[0] = 0;
build_Buffer[1] = 0;
bitClear(isrFlags, F_GOOD_DATA); // Signal data reads dont' match
bitClear(isrFlags, F_STATE); // Set looking for Sync mode
if ((Time > sync_MIN) && (Time < sync_MAX)) {
// Sync length okay
bitSet(isrFlags, F_STATE); // Set data mode
}
} //Serial.println(bit_Count);
if (bit_Count >= allDataBits) {
// All bits arrived
bitClear(isrFlags, F_GOOD_DATA); // Assume data reads don't match
if (build_Buffer[0] == read_Buffer[0]) {
if (build_Buffer[1] == read_Buffer[1])
bitSet(isrFlags, F_GOOD_DATA); // Set data reads match
}
read_Buffer[0] = build_Buffer[0];
read_Buffer[1] = build_Buffer[1];
bitSet(isrFlags, F_HAVE_DATA); // Set data available
bitClear(isrFlags, F_STATE); // Set looking for Sync mode
build_Buffer[0] = 0;
build_Buffer[1] = 0;
bit_Count = 0;
}
}
else {
// Looking for sync
if ((Time > sync_MIN) && (Time < sync_MAX)) {
// Sync length okay
build_Buffer[0] = 0;
build_Buffer[1] = 0;
bit_Count = 0;
bitSet(isrFlags, F_STATE); // Set data mode
}
}
fall_Time = micros(); // Store fall time
}
}
else {
// Rising edge
if (Time > (fall_Time + glitch_Length)) {
// Not a glitch
rise_Time = Time; // Store rise time
}
}
}
void setup() {
Serial.begin(9600);
pinMode(2,INPUT);
Serial.println(F("ISR Pin 2 Configured For Input."));
attachInterrupt(0,PinChangeISR0,CHANGE);
Serial.println(F("Pin 2 ISR Function Attached. Here we go."));
}
void loop() {
unsigned long myData0 = 0;
unsigned long myData1 = 0;
if (bitRead(isrFlags,F_GOOD_DATA) == 1)
{
// We have at least 2 consecutive matching reads
myData0 = read_Buffer[0]; // Read the data spread over 2x 32 variables
myData1 = read_Buffer[1];
bitClear(isrFlags,F_HAVE_DATA); // Flag we have read the data
dec2binLong(myData0,DataBits0);
dec2binLong(myData1,DataBits1);
Serial.print(" - ID=");
byte ID = (myData1 >> 24) & 0xFF; // Get ID
Serial.print(ID);
Serial.print(" - Battery=");
byte B = (myData1 >> 23) & 0x1; // Get Battery
Serial.print(B);
Serial.print(" - TX=");
byte TX = (myData1 >> 22) & 0x1; // Get TX
Serial.print(TX);
Serial.print(" Channel=");
byte CH = ((myData1 >> 20) & 0x3) + 1; // Get Channel
Serial.print(CH);
Serial.print(" Temperature=");
unsigned long T = (myData1 >> 8) & 0xFFF; // Get Temperature
Serial.print(T/10.0,1);
Serial.print("C Humidity=");
byte H = (myData1 >> 0) & 0xFF; // Get LLLL
Serial.print(H);
Serial.println("%");
}
delay(100);
}
void dec2binLong(unsigned long myNum, byte NumberOfBits) {
if (NumberOfBits <= 32){
myNum = myNum << (32 - NumberOfBits);
for (int i=0; i<NumberOfBits; i++) {
if (bitRead(myNum,31) == 1)
Serial.print("1");
else
Serial.print("0");
myNum = myNum << 1;
}
}
if (digitalRead(2) == LOW) {
на
if (digitalRead(2) == HIGH) {