modified timeslot and GPS status LED

1 parent fd9f4e67
...@@ -2,9 +2,77 @@ ...@@ -2,9 +2,77 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// This Arduino code is for receive and transmit data using Oregon Scientific RF protocol version 2.1 and 3.0. // This Arduino code is for receive and transmit data using Oregon Scientific RF protocol version 2.1 and 3.0.
// Thanks to INVANDI! //
// Release by R3PB(mr.Tech) // Last updated: 14 October 2019
// Last modified 13.02.2021 //
// The folowed sensors data format are supported.
//
// Receive and transmit:
// THGN132N (THGR122N, THGN123N),
// RTGN318,
// THGR810.
// Receive only:
// THN132N,
// WGR800,
// UVN800.
//
// Aslo supported self-developed sensors. Please contact author for additional infromation.
//
// This file is part of the Arduino OREGON_NR library.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// The MIT License (MIT)
//
// Copyright (c) 2019 Sergey Zawislak
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Äàííàÿ áèáëèîòåêà Àðäóèíî ïðåäíàçíà÷åíà äëÿ ïðèåìà è ïåðåäà÷è äàííûõ â ôîðìàòå áåñïðîâîäíîãî ïðîòîêîëà Oregon Scientific v2.1 è v3.0
//
// Ïîñëåäíåå îáíîâëåíèå 14 Îêòÿáðÿ 2019
//
// Ïîääåðæèâàåòñÿ ôîðìàò ñëåäóþùèõ äàò÷èêîâ
//
// Ïðè¸ì è ïåðåäà÷à:
// THGN132N (THGR122N, THGN123N),
// RTGN318,
// THGR810.
// Òîëüîê ïðè¸ì:
// THN132N,
// WGR800,
// UVN800.
//
// Òàêæå ïîääåðæèâàþòñÿ äàò÷èêè ñîáñòâåííîé ðàçðàáîòêè (çà äîïîëíèòåëüíîé äîêóìåíòàöåé îáðàùàòüñÿ ê àâòîðó)
//
// Ýòîò ôàéë - ÷àñòü áèáëèîòåêè OREGON_NR
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2019 Ñåðãåé Çàâèñëÿê
//
// Äàííàÿ ëèöåíçèÿ ðàçðåøàåò ëèöàì, ïîëó÷èâøèì êîïèþ äàííîãî ïðîãðàììíîãî îáåñïå÷åíèÿ è ñîïóòñòâóþùåé äîêóìåíòàöèè
// (â äàëüíåéøåì èìåíóåìûìè «Ïðîãðàììíîå Îáåñïå÷åíèå»), áåçâîçìåçäíî èñïîëüçîâàòü Ïðîãðàììíîå Îáåñïå÷åíèå áåç îãðàíè÷åíèé,
// âêëþ÷àÿ íåîãðàíè÷åííîå ïðàâî íà èñïîëüçîâàíèå, êîïèðîâàíèå, èçìåíåíèå, ñëèÿíèå, ïóáëèêàöèþ, ðàñïðîñòðàíåíèå, ñóáëèöåíçèðîâàíèå
// è/èëè ïðîäàæó êîïèé Ïðîãðàììíîãî Îáåñïå÷åíèÿ, à òàêæå ëèöàì, êîòîðûì ïðåäîñòàâëÿåòñÿ äàííîå Ïðîãðàììíîå Îáåñïå÷åíèå, ïðè ñîáëþäåíèè ñëåäóþùèõ óñëîâèé:
//
// Óêàçàííîå âûøå óâåäîìëåíèå îá àâòîðñêîì ïðàâå è äàííûå óñëîâèÿ äîëæíû áûòü âêëþ÷åíû âî âñå êîïèè èëè çíà÷èìûå ÷àñòè äàííîãî Ïðîãðàììíîãî Îáåñïå÷åíèÿ.
//
// ÄÀÍÍÎÅ ÏÐÎÃÐÀÌÌÍÎÅ ÎÁÅÑÏÅ×ÅÍÈÅ ÏÐÅÄÎÑÒÀÂËßÅÒÑß «ÊÀÊ ÅÑÒÜ», ÁÅÇ ÊÀÊÈÕ-ËÈÁÎ ÃÀÐÀÍÒÈÉ, ßÂÍÎ ÂÛÐÀÆÅÍÍÛÕ ÈËÈ ÏÎÄÐÀÇÓÌÅÂÀÅÌÛÕ, ÂÊËÞ×Àß ÃÀÐÀÍÒÈÈ ÒÎÂÀÐÍÎÉ
// ÏÐÈÃÎÄÍÎÑÒÈ, ÑÎÎÒÂÅÒÑÒÂÈß ÏÎ ÅÃÎ ÊÎÍÊÐÅÒÍÎÌÓ ÍÀÇÍÀ×ÅÍÈÞ È ÎÒÑÓÒÑÒÂÈß ÍÀÐÓØÅÍÈÉ, ÍÎ ÍÅ ÎÃÐÀÍÈ×ÈÂÀßÑÜ ÈÌÈ. ÍÈ Â ÊÀÊÎÌ ÑËÓ×ÀÅ ÀÂÒÎÐÛ ÈËÈ ÏÐÀÂÎÎÁËÀÄÀÒÅËÈ
// ÍÅ ÍÅÑÓÒ ÎÒÂÅÒÑÒÂÅÍÍÎÑÒÈ ÏÎ ÊÀÊÈÌ-ËÈÁÎ ÈÑÊÀÌ, ÇÀ ÓÙÅÐÁ ÈËÈ ÏÎ ÈÍÛÌ ÒÐÅÁÎÂÀÍÈßÌ,  ÒÎÌ ×ÈÑËÅ, ÏÐÈ ÄÅÉÑÒÂÈÈ ÊÎÍÒÐÀÊÒÀ, ÄÅËÈÊÒÅ ÈËÈ ÈÍÎÉ ÑÈÒÓÀÖÈÈ,
// ÂÎÇÍÈÊØÈÌ ÈÇ-ÇÀ ÈÑÏÎËÜÇÎÂÀÍÈß ÏÐÎÃÐÀÌÌÍÎÃÎ ÎÁÅÑÏÅ×ÅÍÈß ÈËÈ ÈÍÛÕ ÄÅÉÑÒÂÈÉ Ñ ÏÐÎÃÐÀÌÌÍÛÌ ÎÁÅÑÏÅ×ÅÍÈÅÌ.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
...@@ -25,6 +93,7 @@ Oregon_TM::Oregon_TM(void) ...@@ -25,6 +93,7 @@ Oregon_TM::Oregon_TM(void)
pinMode(PTT_PIN, OUTPUT); // PTT pin pinMode(PTT_PIN, OUTPUT); // PTT pin
digitalWrite(PTT_PIN, HIGH); // PTT ON ??? нужно доработать, так как после отключения питания от ардумны, ptt становится всегда ВКЛЮЧЕН! - переделать! digitalWrite(PTT_PIN, HIGH); // PTT ON ??? нужно доработать, так как после отключения питания от ардумны, ptt становится всегда ВКЛЮЧЕН! - переделать!
pinMode(TX_LED, OUTPUT); pinMode(TX_LED, OUTPUT);
digitalWrite(TX_LED, HIGH);
} }
...@@ -321,7 +390,7 @@ void Oregon_TM::calculateAndSetChecksum810() ...@@ -321,7 +390,7 @@ void Oregon_TM::calculateAndSetChecksum810()
SendBuffer[8] += crc & 0x0F; SendBuffer[8] += crc & 0x0F;
SendBuffer[9] += crc & 0xF0; SendBuffer[9] += crc & 0xF0;
} }
//// CALCULATE CHECKSUM AAA mr.Tech ///////////////////////////////////////////////////////////////////////////////////////// //// CALCULATE CHECKSUM AAA ///////////////////////////////////////////////////////////////////////////////////////////////
void Oregon_TM::calculateAndSetChecksumAAA() void Oregon_TM::calculateAndSetChecksumAAA()
{ {
...@@ -553,6 +622,10 @@ if (sens_type == AIRx) // Определяем тип заголов ...@@ -553,6 +622,10 @@ if (sens_type == AIRx) // Определяем тип заголов
// channel_code = 0xA1; // Номер канала (timeslot). содержит часть id заголовка - AAA1 Временно отключено 31.07.2020 // channel_code = 0xA1; // Номер канала (timeslot). содержит часть id заголовка - AAA1 Временно отключено 31.07.2020
// send_time = send_time_transponder; // интервал отправки пакетов в канале 1. Для датчика AAA1 интервал (timeslot) = 10000 // send_time = send_time_transponder; // интервал отправки пакетов в канале 1. Для датчика AAA1 интервал (timeslot) = 10000
//} //}
// if (channel_code = 0xA3)
// {
// offset_t = 2100;
// }
send_time = send_time_transponder; // интервал отправки пакетов в канале 1. Для датчика AAA1 интервал (timeslot) = 10000 send_time = send_time_transponder; // интервал отправки пакетов в канале 1. Для датчика AAA1 интервал (timeslot) = 10000
protocol = 3; protocol = 3;
// SendBuffer[2]&= channel_code; // Заносим в LSB номер канала. Т.о. в id указали номер канала(timeslot). Временно отключено 31.07.2020 // SendBuffer[2]&= channel_code; // Заносим в LSB номер канала. Т.о. в id указали номер канала(timeslot). Временно отключено 31.07.2020
...@@ -734,60 +807,28 @@ void Oregon_TM::setComfort(float temp, byte hum) ...@@ -734,60 +807,28 @@ void Oregon_TM::setComfort(float temp, byte hum)
// SendBuffer[10] = 0x11; // SendBuffer[10] = 0x11;
// SendBuffer[11] = 0x22; // SendBuffer[11] = 0x22;
} }
// Передача - заметка от mr.Tech ////////////////////////////////////////////////////////////////////// // Передача - mr.Tech //////////////////////////////////////////////////////////////////////
// unsigned long my_timer; int corrector_;
// byte flag_start = 0; bool Oregon_TM::transmit(int second)
// #define flag_start 0x02;
bool Oregon_TM::transmit(int second, int offset_t)
{ {
// offset_t - offset time - смещённое время начала передачи пакета, от нулевой секунды. Для каждого AAA1, 2, 3 ... оно своё. Т.е. у каждого пакета свой таймслот. if ( second >= offset_t && millis() >= time_marker_send)
// Эту переменную(offset_t) передаём/получаем, в библиотеке transmit([параметр]) в заданном параметре, из скетча пользователя. ///////// if (second >= offset_t && millis() >= time_marker_send && send_time)
// int flag_start;
// if (offset_t)my_timer = millis();
// minute = minute % 5;
// int prev_t = minute;
// int minute_ = minute % 5 ;
// uint32_t my_timer; // не стал использовать millis() на прямую, т.к. для неё потребовалось некоторое смещение(увеличение на 0.006 сек - что увеличивало интервал передачи между пакетами),
// if(second == 1){my_timer = millis();} // для того чтобы последующие инструкции успели "взять" это время.
// my_timer = millis();
// int delta_t; // delta_t дельта-тайм разница времени в мсек, между нулевой секундой и временем начала передачи пакета.
// int pointer = offset_t % 1000; // pointer нужен для нецелых чисел. т.к tinyGPS не отдаёт миллисекунды, промежуток между целыми числами считаю отдельно
//#################################
//byte f_time = second + 10;
//#################################
// if ((second ) >= offset_t){
// // if (((second * 1000) + pointer ) == offset_t){ // время получаю в секундах(использую как коэфициент), по этому, для приведения в нужную разрядность в миллисекундах, умножаю на 1000
// flag_start = 1; // и если секунды реального времени поровнялись со временем начального смещения, то устанавливаем флаг(1) разрешающий передачу
// if (flag_start == 1 && minute == 0)
// {
// flag_start = 0;
// }
// // else
// // flag_start = 1;
// }
if (second >= offset_t && millis() >= time_marker_send && send_time)
// if (second * 1000 == offset_t && millis() >= time_marker_send)
// if ((second / 0x10) == (offset_t / 0x10) )
// if (my_timer >= time_marker_send && send_time && flag_start == 1 )
{ {
digitalWrite(PTT_PIN, LOW);// Включение режима TX на 7-й ноге - начало TX. Добавлено mr.Tech 09.03.2020 corrector_ = (second - offset_t) ;
if (corrector_ < 0) corrector_ = 0;
Serial.print(" !!!!!!!!!!!!!!!Секунды полученные через transmit библиотеку!!!!!!!!!!!!!!!!!: ");Serial.println(second);
digitalWrite(PTT_PIN, LOW);// Включение режима TX на 7-й ноге - начало TX. Добавлено 09.03.2020
digitalWrite(TX_LED, LOW); digitalWrite(TX_LED, LOW);
GPSsquelshOn(); //отключаю чтение потока с GPS на время передачи GPSsquelshOn(); //отключаю чтение потока с GPS на время передачи
delay(500); // задержка перед началом преамбулы. mr.Tech delay(TR_TIME); // задержка перед началом преамбулы.
SendPacket(); SendPacket();
// time_marker_send = millis() + send_time + delta_t; digitalWrite(PTT_PIN, HIGH);// Отключение режима TX на 7-й ноге - конец TX. Добавлено 09.03.2020
// time_marker_send = my_timer + send_time;
time_marker_send = millis() + send_time - 1000;
// time_marker_send = millis() + send_time;
// delta_t = 0;
// flag_start = 0;
digitalWrite(PTT_PIN, HIGH);// Отключение режима TX на 7-й ноге - конец TX. Добавлено mr.Tech 09.03.2020
digitalWrite(TX_LED, HIGH); digitalWrite(TX_LED, HIGH);
GPSsquelshOff(); // обратно подключаю поток с GPS приёмника GPSsquelshOff(); // обратно подключаю поток с GPS приёмника
// time_marker_send = ((millis() + 5000) - corrector_ ) + TR_TIME;
time_marker_send = ((millis() + send_time) - corrector_) + 334;
// time_marker_send = ((millis() + send_time) - corrector_) + 1000;
return true; return true;
// }
} }
else return false; else return false;
} }
...@@ -806,20 +847,6 @@ void Oregon_TM::GPSsquelshOff() ...@@ -806,20 +847,6 @@ void Oregon_TM::GPSsquelshOff()
pinMode(4, OUTPUT); pinMode(4, OUTPUT);
digitalWrite(4, LOW); digitalWrite(4, LOW);
} }
// void Oregon_TM::GPSsquelshOn()
// {
// pinMode(4, OUTPUT);
// digitalWrite(4, HIGH);
// pinMode(3, INPUT);
// digitalWrite(3, HIGH);
// }
// void Oregon_TM::GPSsquelshOff()
// {
// pinMode(4, INPUT);
// digitalWrite(4, LOW);
// pinMode(3, OUTPUT);
// digitalWrite(3, LOW);
// }
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
//Поддержка датчика THP //Поддержка датчика THP
......
...@@ -61,22 +61,6 @@ ...@@ -61,22 +61,6 @@
// //
// Этот файл - часть библиотеки OREGON_NR // Этот файл - часть библиотеки OREGON_NR
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2019 Ñåðãåé Çàâèñëÿê
//
// Äàííàÿ ëèöåíçèÿ ðàçðåøàåò ëèöàì, ïîëó÷èâøèì êîïèþ äàííîãî ïðîãðàììíîãî îáåñïå÷åíèÿ è ñîïóòñòâóþùåé äîêóìåíòàöèè
// (â äàëüíåéøåì èìåíóåìûìè «Ïðîãðàììíîå Îáåñïå÷åíèå»), áåçâîçìåçäíî èñïîëüçîâàòü Ïðîãðàììíîå Îáåñïå÷åíèå áåç îãðàíè÷åíèé,
// âêëþ÷àÿ íåîãðàíè÷åííîå ïðàâî íà èñïîëüçîâàíèå, êîïèðîâàíèå, èçìåíåíèå, ñëèÿíèå, ïóáëèêàöèþ, ðàñïðîñòðàíåíèå, ñóáëèöåíçèðîâàíèå
// è/èëè ïðîäàæó êîïèé Ïðîãðàììíîãî Îáåñïå÷åíèÿ, à òàêæå ëèöàì, êîòîðûì ïðåäîñòàâëÿåòñÿ äàííîå Ïðîãðàììíîå Îáåñïå÷åíèå, ïðè ñîáëþäåíèè ñëåäóþùèõ óñëîâèé:
//
// Óêàçàííîå âûøå óâåäîìëåíèå îá àâòîðñêîì ïðàâå è äàííûå óñëîâèÿ äîëæíû áûòü âêëþ÷åíû âî âñå êîïèè èëè çíà÷èìûå ÷àñòè äàííîãî Ïðîãðàììíîãî Îáåñïå÷åíèÿ.
//
// ÄÀÍÍÎÅ ÏÐÎÃÐÀÌÌÍÎÅ ÎÁÅÑÏÅ×ÅÍÈÅ ÏÐÅÄÎÑÒÀÂËßÅÒÑß «ÊÀÊ ÅÑÒÜ», ÁÅÇ ÊÀÊÈÕ-ËÈÁÎ ÃÀÐÀÍÒÈÉ, ßÂÍÎ ÂÛÐÀÆÅÍÍÛÕ ÈËÈ ÏÎÄÐÀÇÓÌÅÂÀÅÌÛÕ, ÂÊËÞ×Àß ÃÀÐÀÍÒÈÈ ÒÎÂÀÐÍÎÉ
// ÏÐÈÃÎÄÍÎÑÒÈ, ÑÎÎÒÂÅÒÑÒÂÈß ÏÎ ÅÃÎ ÊÎÍÊÐÅÒÍÎÌÓ ÍÀÇÍÀ×ÅÍÈÞ È ÎÒÑÓÒÑÒÂÈß ÍÀÐÓØÅÍÈÉ, ÍÎ ÍÅ ÎÃÐÀÍÈ×ÈÂÀßÑÜ ÈÌÈ. ÍÈ Â ÊÀÊÎÌ ÑËÓ×ÀÅ ÀÂÒÎÐÛ ÈËÈ ÏÐÀÂÎÎÁËÀÄÀÒÅËÈ
// ÍÅ ÍÅÑÓÒ ÎÒÂÅÒÑÒÂÅÍÍÎÑÒÈ ÏÎ ÊÀÊÈÌ-ËÈÁÎ ÈÑÊÀÌ, ÇÀ ÓÙÅÐÁ ÈËÈ ÏÎ ÈÍÛÌ ÒÐÅÁÎÂÀÍÈßÌ,  ÒÎÌ ×ÈÑËÅ, ÏÐÈ ÄÅÉÑÒÂÈÈ ÊÎÍÒÐÀÊÒÀ, ÄÅËÈÊÒÅ ÈËÈ ÈÍÎÉ ÑÈÒÓÀÖÈÈ,
// ÂÎÇÍÈÊØÈÌ ÈÇ-ÇÀ ÈÑÏÎËÜÇÎÂÀÍÈß ÏÐÎÃÐÀÌÌÍÎÃÎ ÎÁÅÑÏÅ×ÅÍÈß ÈËÈ ÈÍÛÕ ÄÅÉÑÒÂÈÉ Ñ ÏÐÎÃÐÀÌÌÍÛÌ ÎÁÅÑÏÅ×ÅÍÈÅÌ.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define TR_TIME 488 #define TR_TIME 488
#define TWOTR_TIME 976 #define TWOTR_TIME 976
...@@ -87,7 +71,11 @@ ...@@ -87,7 +71,11 @@
#define THGR810 0xF824 #define THGR810 0xF824
#define RTGN318 0xDCC3 #define RTGN318 0xDCC3
#define THP 0x5500 #define THP 0x5500
#define AIR 0xAAA // Префикс - идентификатор пакета, принедлежащего всем транспондерам #define AIR4
// #define AIR 0xAAA // Префикс - идентификатор пакета, принадлежащего всем транспондерам
// #define AIR1 0xAAA1 // #define AIR1 0xAAA1
// #define AIR2 0xAAA2 // #define AIR2 0xAAA2
// #define AIR3 0xAAA3 // #define AIR3 0xAAA3
...@@ -97,15 +85,67 @@ ...@@ -97,15 +85,67 @@
// #define AIR7 0xAAA7 // #define AIR7 0xAAA7
// #define AIR8 0xAAA8 // #define AIR8 0xAAA8
// #define AIR9 0xAAA9 // #define AIR9 0xAAA9
// #define AIRx // #define AIRx
#define AIRx 0xAAA1 // Определяем уникальный номер транспондера AAA0 ... AAA9 // #define AIRx 0xAAA3 // Определяем уникальный номер транспондера AAA0 ... AAA9
// #define flag_start 0x02 #ifdef AIR0
#define AIRx 0xAAA0
#define offset_t 100
#endif
#ifdef AIR1
#define AIRx 0xAAA1
#define offset_t 600
#endif
#ifdef AIR2
#define AIRx 0xAAA2
#define offset_t 1100
#endif
#ifdef AIR3
#define AIRx 0xAAA3
#define offset_t 1600
#endif
#ifdef AIR4
#define AIRx 0xAAA4
#define offset_t 2100
#endif
#ifdef AIR5
#define AIRx 0xAAA5
#define offset_t 2600
#endif
#ifdef AIR6
#define AIRx 0xAAA6
#define offset_t 3100
#endif
#ifdef AIR7
#define AIRx 0xAAA7
#define offset_t 3600
#endif
#ifdef AIR8
#define AIRx 0xAAA8
#define offset_t 4100
#endif
#ifdef AIR9
#define AIRx 0xAAA9
#define offset_t 4600
#endif
static byte TX_PIN = 19; // установка порта передачи данных (A5) static byte TX_PIN = 19; // установка порта передачи данных (A5)
static byte PTT_PIN = 18; // установка порта для PTT (A4) static byte PTT_PIN = 18; // установка порта для PTT (A4)
static byte TX_LED = 15; // индикация передачи порт (A1) static byte TX_LED = 15; // индикация передачи порт (A1)
static byte GPS_LED = 16; // индикация приёма GPS (A2) static byte GPS_LED = 16; // индикация приёма GPS (A2)
static const int buffersize = 10; // original static const int buffersize = 10; // original
// int offset_t;
// #define AIRx
// word AIRx;
class Oregon_TM class Oregon_TM
{ {
...@@ -116,8 +156,9 @@ class Oregon_TM ...@@ -116,8 +156,9 @@ class Oregon_TM
word sens_type = 0x0000; word sens_type = 0x0000;
int timing_corrector2 = 4; int timing_corrector2 = 4;
int timing_corrector3 = 2; int timing_corrector3 = 2;
bool flag_start = 0; // флаг синхронизации таймера с нулевой секундой. 31.07.2020 int send_time_transponder = 4000;//период передачи транспондера
int send_time_transponder = 5000;//период передачи транспондера // int offset_t;
// word AIRx;
Oregon_TM(byte); Oregon_TM(byte);
Oregon_TM(); Oregon_TM();
...@@ -129,7 +170,8 @@ class Oregon_TM ...@@ -129,7 +170,8 @@ class Oregon_TM
void setTemperature(float); void setTemperature(float);
void setHumidity(byte); void setHumidity(byte);
void setComfort(float, byte); void setComfort(float, byte);
bool transmit(int, int); bool transmit(int);
// bool transmit(int, int);
void SendPacket(); void SendPacket();
void setErrorTHP(); void setErrorTHP();
...@@ -169,8 +211,6 @@ class Oregon_TM ...@@ -169,8 +211,6 @@ class Oregon_TM
unsigned long send_time = 0; unsigned long send_time = 0;
bool prevbit = 1; bool prevbit = 1;
bool prevstate = 1; bool prevstate = 1;
}; };
#endif #endif
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Данная библиотека Ардуино сделана на основе беспроводного протокола Oregon Scientific v2.1 и v3.0. Данная библиотека Ардуино сделана на основе беспроводного протокола Oregon Scientific v2.1 и v3.0.
Последнее обновление 12 Февраля 2021 года. Последнее обновление 17.03.2021
Формат датчиков AAA Transmitter_AIR V1.2. Формат датчиков AAA Transmitter_AIR V1.2.
......
...@@ -2,44 +2,32 @@ ...@@ -2,44 +2,32 @@
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#include <TinyGPS.h> #include <TinyGPS.h>
//#define AIRx 0xAAA5 //#define AIR1
int offset_t = 3600; // Миллисекунды. Время смещения(таймслот транспондера) указывать в интервале от 0 до 4500 шагом 500.
//byte AIRx = AIR2;
// GPS модуль // GPS модуль
//float lat, lon; // создать переменную для объекта широты и долготы
SoftwareSerial gpsSerial(5, 4);//rx,tx SoftwareSerial gpsSerial(5, 4);//rx,tx
//SoftwareSerial gpsSerial(14, 13);//rx,tx
TinyGPS gps; // создать gps объект TinyGPS gps; // создать gps объект
bool newdata = false; bool newdata = false;
bool tx_flag = false;
unsigned long start; unsigned long start;
long lat, lon; long lat, lon;
//byte alt;
float falt; float falt;
unsigned long fix_age, time, date, Second; unsigned long fix_age, time, date, Second;
int year; int year;
byte month, day, hour, minute, second, hundredths; byte month, day, hour, minute, second, hundredths;
uint32_t mysecond, second_, milli_s, timer1; uint32_t mysecond, second_, _second_, milli_s, timer1, timer2;
// uint32_t timer, timer1;
#define PERIOD 1000 // период отсчёта миллисек. при синхронизации от 00 сек #define PERIOD 1000 // период отсчёта миллисек. при синхронизации от 00 сек
// static byte GPS_LED = 16;
// END // END
//--------------------------
//static byte search_pin = 3;
//pinMode(search_pin, OUTPUT);
//digitalWrite(search_pin, HIGH);
//--------------------------
//Имитатор датчиков температуры и влажности Oregon Scientific
//В данном примере иммитируются пакеты следующих типов датчиков:
//THGN132N (тип 1D20h, протокол v2, 3 канала)
//RTGN318 (тип ХСС3h, протокол v2, 5 каналов)
//THGR810 (тип F824h, протокол v3, 10 каналов)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Вывод передатчика один. Указывается только при создании первого объекта. В данном примере передатчик подключен к D6
//Oregon_TM transmitter(6), transmitter2, transmitter3, transmitter4; // ** Пример от Invandy** - Имитатор датчиков температуры и влажности Oregon Scientific
// В данном примере иммитируются пакеты следующих типов датчиков:
// THGN132N (тип 1D20h, протокол v2, 3 канала)
// RTGN318 (тип ХСС3h, протокол v2, 5 каналов)
// THGR810 (тип F824h, протокол v3, 10 каналов)
// Вывод передатчика один. Указывается только при создании первого объекта. В данном примере передатчик подключен к D6
// Oregon_TM transmitter(6), transmitter2, transmitter3, transmitter4;
// END ////////////////////////////////////////////////
Oregon_TM transmitter, transmitter2, transmitter3, transmitter4; Oregon_TM transmitter, transmitter2, transmitter3, transmitter4;
//tr_pin = 16;
// Массив режимов работы ЗЕЛЁНОГО светодиода(ИНДИКАТОР ПРИЁМА GPS) // Массив режимов работы ЗЕЛЁНОГО светодиода(ИНДИКАТОР ПРИЁМА GPS)
byte modes[] = { byte modes[] = {
...@@ -53,21 +41,19 @@ byte modes[] = { ...@@ -53,21 +41,19 @@ byte modes[] = {
}; };
uint32_t ms, ms1 = 0, ms2 = 0; uint32_t ms, ms1 = 0, ms2 = 0;
uint8_t blink_loop = 0; uint8_t blink_loop = 0;
uint8_t blink_mode = 0; uint8_t blink_mode;
uint8_t modes_count = 0; uint8_t modes_count;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() void setup()
{ {
// --------------------------
//static byte search_pin = 14;
//pinMode(search_pin, OUTPUT);
//digitalWrite(search_pin, LOW);
// --------------------------
Serial.begin(115200); Serial.begin(115200);
Serial.println("Waiting data of GPS..."); Serial.println("Waiting data of GPS...");
gpsSerial.begin(9600); // подключаем gps датчик gpsSerial.begin(9600); // Подключаем GPS приёмник на указанной скорости
pinMode(GPS_LED, OUTPUT); // ИНДИКАЦИЯ GPS ПРИЁМА - ЗЕЛЁНЫЙ СВЕТОДИОД
digitalWrite(GPS_LED, HIGH);
//Первый передатчик // Пример от Invandy /////////////////////////////////////////
// Первый передатчик /////////////////////////////////////////
transmitter.setType(THGN132); transmitter.setType(THGN132);
transmitter.setChannel(3); // Номер канала для THGN132 - 1...3 transmitter.setChannel(3); // Номер канала для THGN132 - 1...3
transmitter.setBatteryFlag(1); // Флаг разряженной батарейки transmitter.setBatteryFlag(1); // Флаг разряженной батарейки
...@@ -90,70 +76,29 @@ void setup() ...@@ -90,70 +76,29 @@ void setup()
transmitter3.setTemperature(-31); transmitter3.setTemperature(-31);
transmitter3.setHumidity(50); transmitter3.setHumidity(50);
transmitter3.setComfort(-31,50); transmitter3.setComfort(-31,50);
// END //////////////////////////////
/// ИНДИКАЦИЯ GPS ПРИЁМА - ЗЕЛЁНЫЙ СВЕТОДИОД /////
pinMode(GPS_LED, OUTPUT);
digitalWrite(GPS_LED, HIGH);
modes_count = 1;
blink_mode = modes[modes_count];
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() void loop()
{ {
newdata = readgps(); newdata = readgps(); // Чтение данных GPS приёмника
// gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths); sync_with_time(); // Синхронизация таймера с GPS
sync_with_time();
// gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
// second = second % 5 ;
// minute = minute % 5 ;
// //#define PERIOD 1000
// if (second % 1 == 0){
// milli_s = millis() - timer1;
// second_ = second * 1000 + milli_s;
// if((millis() - timer1) >= PERIOD ){
// if(milli_s >= PERIOD){
// timer1 = millis();
// }
// }
// }
////#################################
//byte f_time = second + 10;
////#################################
//{
//GPS mr.Tech
if (millis() - start > 900) //установка задержки в одну секунду между обновлением данных
{
//gpsSerial.read();
// newdata = readgps();
if (newdata) if (newdata)
{ {
start = millis(); start = millis();
gps.get_position(&lat, &lon); gps.get_position(&lat, &lon);
gps.get_datetime(&date, &time, &fix_age); gps.get_datetime(&date, &time, &fix_age);
// gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
// int mysecond = int(second);
// second = second % 5; // %10 - эта процедура превращает секунды 00 - 59, полученные от tinyGPS в десятичном виде, в секунды от 0 до 9 (%5 => 0 ... 4),
// путем деления с остатком который и заносится в переменную. Важное замечание! переменную second необходимо представить типом byte!
// Это самый короткий путь чтобы отбросить старший разряд, тоесть отбросить десятки секунд и оставить только цикл от 0 до 9
falt = gps.f_altitude(); // +/- altitude in meters falt = gps.f_altitude(); // +/- altitude in meters
green_led(); green_led(modes[1]); // Включаем индикацию приёма GPS. LED постоянно горит - GPS приём есть.
Serial.print("Lat: "); Serial.print(lat); Serial.print("Lat: "); Serial.print(lat);
Serial.print(" Long: "); Serial.print(lon); Serial.print(" Long: "); Serial.print(lon);
Serial.print(" Altitude: "); Serial.print(falt); Serial.print(" Altitude: "); Serial.print(falt);
Serial.print(" Date: "); Serial.print(date); Serial.print(" Date: "); Serial.print(date);
Serial.print(" Time: "); Serial.println(time); Serial.print(" Time: "); Serial.println(time);
Serial.print(" Real_Time секунды: ");Serial.println(second); Serial.print(" Real_Time секунды: ");Serial.println(second);
Serial.print(" Offset_Time: ");Serial.println(offset_t);
// Serial.print(" Real_Time минуты: "); Serial.println(minute);
Serial.print(" MILLI_S: "); Serial.println(milli_s);
Serial.print(" SECOND_: "); Serial.println(second_);
} }
}
/////////////////////
//передача осуществляется по таймеру, который определяется типом датчика и номером канала //передача осуществляется по таймеру, который определяется типом датчика и номером канала
transmitter4.setType(AIRx); transmitter4.setType(AIRx);
transmitter4.setChannel(1); // tiimeslot. формируется номер транспондера(Сейчас этот параметр формирует номер канала - timeslot. 27.07.20 - флаг, пока, не принимает участия в формировании номера тайм-слота) transmitter4.setChannel(1); // tiimeslot. формируется номер транспондера(Сейчас этот параметр формирует номер канала - timeslot. 27.07.20 - флаг, пока, не принимает участия в формировании номера тайм-слота)
...@@ -161,46 +106,32 @@ sync_with_time(); ...@@ -161,46 +106,32 @@ sync_with_time();
transmitter4.setLongitude(lon); transmitter4.setLongitude(lon);
transmitter4.setAltitude(falt); transmitter4.setAltitude(falt);
// if (transmitter.transmit()) PrintSentData(transmitter.SendBuffer); //if (transmitter.transmit()) PrintSentData(transmitter.SendBuffer);
// if (transmitter2.transmit())PrintSentData(transmitter2.SendBuffer); //if (transmitter2.transmit())PrintSentData(transmitter2.SendBuffer);
// if (transmitter3.transmit()) PrintSentData(transmitter3.SendBuffer); //if (transmitter3.transmit()) PrintSentData(transmitter3.SendBuffer);
if (transmitter4.transmit(second_, offset_t)) PrintSentData(transmitter4.SendBuffer); //параметры (second, offset_t) - текущее время(только секунды), и время смещения(таймслот) if ( tx_flag == true && transmitter4.transmit(second_)) PrintSentData(transmitter4.SendBuffer); //параметры (second, offset_t) - текущее время(только секунды), и время смещения(таймслот)
// Serial.print(" MILLI_S: "); Serial.println(milli_s);
//green_led();
} }
//////////////////// ИНДИКАЦИЯ GPS ЗЕЛЁНЫЙ СВЕТОДИОД //////////////////// // ИНДИКАЦИЯ GPS ЗЕЛЁНЫЙ СВЕТОДИОД #########################
void green_led(){ void green_led(uint8_t blink_mode){ // Пеердаём в воид параметр - режим индикации
// blink_mode = modes[3];
ms = millis(); ms = millis();
// Событие срабатывающее каждые 125 мс
// if( ( ms - ms1 ) > 125|| ms < ms1 ){
ms1 = ms; ms1 = ms;
// Режим светодиода ищем по битовой маске if( ( ms - ms2 ) > 150 ){ // Параметр (150) определяет частоту мигания. Чем меньше значение - тем чаще.
if( blink_mode & 1<<(blink_loop&0x07) ) digitalWrite(GPS_LED, LOW); ms2 = ms;
else digitalWrite(GPS_LED, HIGH); digitalWrite(GPS_LED, HIGH); // Высокое значение на выводе - гасим LED
if( blink_mode & 1<<(blink_loop&0x07) ) // Режим светодиода ищем по битовой маске
digitalWrite(GPS_LED, LOW);
blink_loop++; blink_loop++;
// } }
blink_mode = modes[2];
// Этот код служит для демонстрации переключения режимов
// Один раз в 5 секунд меняем эффект
// if( ( ms - ms2 ) > 1000|| ms < ms2 ){
// ms2 = ms;
// blink_mode = modes[3];
//// blink_mode = modes[modes_count++];
//// if( modes_count >= 7 )modes_count = 1;
// }
} }
// mr.Tech GPS void ######################### // GPS void ###################################################
// проверка наличия данных // проверка наличия данных
bool readgps() bool readgps()
{ {
while (gpsSerial.available()) while (gpsSerial.available()){
{
int b = gpsSerial.read(); int b = gpsSerial.read();
//в библиотеке TinyGPS имеется ошибка: не обрабатываются данные с \r и \n //в библиотеке TinyGPS имеется ошибка: не обрабатываются данные с \r и \n
if('\r' != b) if('\r' != b){
{
if (gps.encode(b)) if (gps.encode(b))
return true; return true;
} }
...@@ -208,20 +139,32 @@ sync_with_time(); ...@@ -208,20 +139,32 @@ sync_with_time();
return false; return false;
} }
// END // СИНХРОНИЗАЦИЯ С НУЛЕВОЙ СЕКУНДОЙ - void ######################
// синхроизация с нулевой секундой
void sync_with_time() void sync_with_time()
{ {
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths); gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
second = second % 5 ; // second = second % 5; - эта процедура превращает секунды 00 - 59, полученные от tinyGPS в десятичном виде, в 5-ти секундные циклы 0,1,2,3,4,0,1,2,3,4,0, и.т.д.
//minute = minute % 5 ; // путем деления с остатком который и заносится в переменную. Важное замечание! переменную second необходимо представить типом byte!
//#define PERIOD 1000 // Это самый короткий путь чтобы отбросить старший разряд, тоесть отбросить десятки секунд и оставить только цикл от 0 до 4
if (second){ _second_ = second % 5 ; // Секунды полученные от GPS 0 ... 59, переводим в 0,1,2,3,4,0,1,2,3,4,0.... и т.д..
milli_s = millis() - timer1; if (newdata){ // Если с GPS есть новая отметка времени, то:
second_ = second * 1000 + milli_s; tx_flag = true;
if((millis() - timer1) >= PERIOD ){ timer1 = millis(); // в этот момент(на переходе 0-ой отметки между секундами) СБРАСЫВАЕМ/устанавливаем timer1 = значению millis()
timer1 = millis(); }else{ // Впротивном случае выполняем:
// tx_flag = false;
timer2 = millis() - timer1; // отсчёт millis() сразу после перехода через 0 (0,1,2,3,4,5,6,7,8,9,10,11, .... 999)
second_ = _second_ * 1000 + timer2; // Сращиваем секунды в диаппазоне - 0,1,2,3,4,0 и миллисекунды в диаппазоне от 0 до 999(если произошёл сброс timer1), или до бесконечности если сброса не было!
if (second_ >= 5000){ // Если произошла рассинхронизация таймера, значит нет данных от GPS. Тогда:
// tx_flag = false;
second_ = 0; // Сбрасываем таймер в 0. Тем самым запрещаем циклическую передачу повторяющихся данных
green_led(modes[6]); // Частое мигание зелёным LED. 4 раза в секунду - "нет приёма GPS"
} }
// if (second_ >= 32000){ // Если произошла рассинхронизация таймера, значит нет данных от GPS. Тогда:
// second_ = 10000; // Сбрасываем таймер в 0. Тем самым запрещаем циклическую передачу повторяющихся данных
// tx_flag = false;
// green_led(modes[0]); // Отсутствие индикации зелёного LED."нет приёма GPS более чем полминуты"
// }
// }
} }
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
...@@ -229,13 +172,11 @@ void PrintSentData(byte* buf) ...@@ -229,13 +172,11 @@ void PrintSentData(byte* buf)
{ {
Serial.print(millis() / 1000); Serial.print(millis() / 1000);
Serial.print("s \t\t"); Serial.print("s \t\t");
for (byte i = 0; i < 10; ++i) //original for (byte i = 0; i < 10; ++i)
//for (byte i = 0; i < 11; ++i) //mr.Tech
{ {
byte trmbuf = *buf; byte trmbuf = *buf;
Serial.print(trmbuf >> 4, HEX); Serial.print(trmbuf >> 4, HEX);
if (i < (10 - 1) )//original if (i < (10 - 1) )
//if (i < (11 - 1) )//mr.Tech
Serial.print(trmbuf & 0x0F, HEX); Serial.print(trmbuf & 0x0F, HEX);
buf++; buf++;
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!