Transmitter_AIR_v1.2.ino
11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include <Oregon_TX_AIR.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
//#define AIRx 0xAAA5
int offset_t = 3600; // Миллисекунды. Время смещения(таймслот транспондера) указывать в интервале от 0 до 4500 шагом 500.
//byte AIRx = AIR2;
// GPS модуль
//float lat, lon; // создать переменную для объекта широты и долготы
SoftwareSerial gpsSerial(5, 4);//rx,tx
//SoftwareSerial gpsSerial(14, 13);//rx,tx
TinyGPS gps; // создать gps объект
bool newdata = false;
unsigned long start;
long lat, lon;
//byte alt;
float falt;
unsigned long fix_age, time, date, Second;
int year;
byte month, day, hour, minute, second, hundredths;
uint32_t mysecond, second_, milli_s, timer1;
// uint32_t timer, timer1;
#define PERIOD 1000 // период отсчёта миллисек. при синхронизации от 00 сек
// static byte GPS_LED = 16;
// 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;
Oregon_TM transmitter, transmitter2, transmitter3, transmitter4;
//tr_pin = 16;
// Массив режимов работы ЗЕЛЁНОГО светодиода(ИНДИКАТОР ПРИЁМА GPS)
byte modes[] = {
0B00000000, //Светодиод выключен
0B11111111, //Горит постоянно
0B00001111, //Мигание по 0.5 сек
0B00000001, //Короткая вспышка раз в секунду
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)
};
uint32_t ms, ms1 = 0, ms2 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;
uint8_t modes_count = 0;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
// --------------------------
//static byte search_pin = 14;
//pinMode(search_pin, OUTPUT);
//digitalWrite(search_pin, LOW);
// --------------------------
Serial.begin(115200);
Serial.println("Waiting data of GPS...");
gpsSerial.begin(9600); // подключаем gps датчик
//Первый передатчик
transmitter.setType(THGN132);
transmitter.setChannel(3); // Номер канала для THGN132 - 1...3
transmitter.setBatteryFlag(1); // Флаг разряженной батарейки
transmitter.setTemperature(24.2); // -50C...+70C
transmitter.setHumidity(13); // 2...98%
transmitter.setComfort(24.2, 13); // Расчёт передаваемого индекса комфорта
//Второй передатчик
transmitter2.setType(THGR810);
transmitter2.setChannel(1); // Номер канала для THGR810 - 1...10 (Возможно приниматься базой будут тольок первые 5 каналов. Проверить мне не на чем...)
transmitter2.setBatteryFlag(1);
transmitter2.setTemperature(+49.9);
transmitter2.setHumidity(98);
transmitter2.setComfort(+49.9, 98);
//Третий передатчик
transmitter3.setType(RTGN318);
transmitter3.setChannel(5); // Номер канала для RTGN318 - 1...5.
transmitter3.setBatteryFlag(0);
transmitter3.setTemperature(-31);
transmitter3.setHumidity(50);
transmitter3.setComfort(-31,50);
/// ИНДИКАЦИЯ GPS ПРИЁМА - ЗЕЛЁНЫЙ СВЕТОДИОД /////
pinMode(GPS_LED, OUTPUT);
digitalWrite(GPS_LED, HIGH);
modes_count = 1;
blink_mode = modes[modes_count];
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
newdata = readgps();
// gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
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)
{
start = millis();
gps.get_position(&lat, &lon);
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
green_led();
Serial.print("Lat: "); Serial.print(lat);
Serial.print(" Long: "); Serial.print(lon);
Serial.print(" Altitude: "); Serial.print(falt);
Serial.print(" Date: "); Serial.print(date);
Serial.print(" Time: "); Serial.println(time);
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.setChannel(1); // tiimeslot. формируется номер транспондера(Сейчас этот параметр формирует номер канала - timeslot. 27.07.20 - флаг, пока, не принимает участия в формировании номера тайм-слота)
transmitter4.setLatitude(lat);
transmitter4.setLongitude(lon);
transmitter4.setAltitude(falt);
// if (transmitter.transmit()) PrintSentData(transmitter.SendBuffer);
// if (transmitter2.transmit())PrintSentData(transmitter2.SendBuffer);
// if (transmitter3.transmit()) PrintSentData(transmitter3.SendBuffer);
if (transmitter4.transmit(second_, offset_t)) PrintSentData(transmitter4.SendBuffer); //параметры (second, offset_t) - текущее время(только секунды), и время смещения(таймслот)
// Serial.print(" MILLI_S: "); Serial.println(milli_s);
//green_led();
}
//////////////////// ИНДИКАЦИЯ GPS ЗЕЛЁНЫЙ СВЕТОДИОД ////////////////////
void green_led(){
// blink_mode = modes[3];
ms = millis();
// Событие срабатывающее каждые 125 мс
// if( ( ms - ms1 ) > 125|| ms < ms1 ){
ms1 = ms;
// Режим светодиода ищем по битовой маске
if( blink_mode & 1<<(blink_loop&0x07) ) digitalWrite(GPS_LED, LOW);
else digitalWrite(GPS_LED, HIGH);
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 #########################
// проверка наличия данных
bool readgps()
{
while (gpsSerial.available())
{
int b = gpsSerial.read();
//в библиотеке TinyGPS имеется ошибка: не обрабатываются данные с \r и \n
if('\r' != b)
{
if (gps.encode(b))
return true;
}
}
return false;
}
// END
// синхроизация с нулевой секундой
void sync_with_time()
{
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
second = second % 5 ;
//minute = minute % 5 ;
//#define PERIOD 1000
if (second){
milli_s = millis() - timer1;
second_ = second * 1000 + milli_s;
if((millis() - timer1) >= PERIOD ){
timer1 = millis();
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void PrintSentData(byte* buf)
{
Serial.print(millis() / 1000);
Serial.print("s \t\t");
for (byte i = 0; i < 10; ++i) //original
//for (byte i = 0; i < 11; ++i) //mr.Tech
{
byte trmbuf = *buf;
Serial.print(trmbuf >> 4, HEX);
if (i < (10 - 1) )//original
//if (i < (11 - 1) )//mr.Tech
Serial.print(trmbuf & 0x0F, HEX);
buf++;
}
Serial.println();
}