Modbus rs485 датчик направления ветра. LoRa передача параметров по радио каналу.
- Войдите на сайт для отправки комментариев
Приветствую всех жителей данного форума. Делаю устройство передающие данные о ветре из датчика ветра. Интерфейс датчик rs485 протокол modbus. На расстояние по радио каналу через LoRa. Плата у меня BSFrance Lora32u4 II v1.3. С микроконтроллером 32u4. Возникла проблема. Проблема следующая. Данные я передаю в виде uint 16а точнее например: 3014 это 3м/с с направлением 14.Передача происходит нормально но когда я их принимаю эти данные приходят в виде String причем по очереди. В общем мне надо чтобы данные были int для того чтобы я их мог сравнит с предыдущими данными. Мне нужно чтобы пришедшие данные если они такие же как предыдущие не выводились по uart приемника но если пришли данные и они отличаются от предыдущих то данные выводятся однократно в uart приёмника.
это передатчик с датчиком
#include <ModbusRtu.h> #include <SPI.h> #include <LoRa.h> // uncomment the section corresponding to your board // BSFrance 2017 contact@bsrance.fr #define TXEN 9 // Arduino контакт RE-DE RS485 микросхемме // //LoR32u4 433MHz V1.0 (white board) // #define SCK 15 // #define MISO 14 // #define MOSI 16 // #define SS 1 // #define RST 4 // #define DI0 7 // #define BAND 433E6 // #define PABOOST true // //LoR32u4 433MHz V1.2 (white board) // #define SCK 15 // #define MISO 14 // #define MOSI 16 // #define SS 8 // #define RST 4 // #define DI0 7 // #define BAND 433E6 // #define PABOOST true //LoR32u4II 868MHz or 915MHz (black board) #define SCK 15 #define MISO 14 #define MOSI 16 #define SS 8 #define RST 4 #define DI0 7 #define BAND 868E6 // 915E6 #define PABOOST true uint16_t tx_data; uint8_t new_data; int counter = 0; uint16_t OUTTEXT=0; uint16_t au16data[16]; //!< массив данных для обмена по modbus uint8_t u8state; //!< флаг состояние uint8_t u8query; //!< флаг принятого сообщения uint8_t u8txenpin = 1; // разрешает пин TXEN /** * Объявление объекта Modbus * u8id : узел id = 0 для master, = 1..247 для slave * port : serial port * u8txenpin : 0 для RS-232 и USB-FTDI * или любая цифра отличная от 0 > 1 для RS-485 */ Modbus master(0,Serial1,TXEN); // this is master and RS-232 or USB-FTDI /** * Это структура, которая содержит запрос к подчиненному устройству */ modbus_t telegram[1]; unsigned long u32wait; void setup() { // telegram 0: регистры чтения telegram[0].u8id = 138; // slave адрес последняя цифра сериного номера плюс 130 telegram[0].u8fct = 3; // регистр приема telegram[0].u16RegAdd = 0; // адрес начала чтения telegram[0].u16CoilsNo = 7; // количество байт для чтения telegram[0].au16reg = au16data; // массив данных LoRa.setPins(SS,RST,DI0); if (!LoRa.begin(BAND,PABOOST)) { digitalWrite(LED_BUILTIN, HIGH); delay(2000); digitalWrite(LED_BUILTIN,LOW); } Serial1.begin( 19200 ); // скорость порта 19200 master.start(); master.setTimeOut( 1000 ); // если нет ответа 5000 мсек ошибка u32wait = millis() + 100; u8state = u8query = 0; } void loop() { digitalWrite(LED_BUILTIN, HIGH); master.query( telegram[u8query] ); // отправить запрос только один раз delay(100); master.poll(); // проверяем ответное сообщение //скорость ветра 0.5-1м/с if(au16data[0] >= 4 && au16data[0] <= 10) { //0-30град 0-1час if(au16data[1] >= 0 && au16data[1] <= 30){ tx_data = 510; } //31-60град 1-2час if(au16data[1] >= 31 && au16data[1] <= 60){ tx_data = 511; } //61-90град 2-3час if(au16data[1] >= 61 && au16data[1] <= 90){ tx_data = 512; } //91-120град 3-4час if(au16data[1] >= 91 && au16data[1] <= 120){ tx_data = 513; } //121-150град 4-5час if(au16data[1] >= 121 && au16data[1] <= 150){ tx_data = 514; } //151-180град 5-6час if(au16data[1] >= 151 && au16data[1] <= 180){ tx_data = 515; } //181-210град 6-7час if(au16data[1] >= 181 && au16data[1] <= 210){ tx_data = 516; } //211-240град 7-8час if(au16data[1] >= 211 && au16data[1] <= 240){ tx_data = 517; } //241-270град 8-9час if(au16data[1] >= 241 && au16data[1] <= 270){ tx_data = 518; } //271-300град 9-10час if(au16data[1] >= 271 && au16data[1] <= 300){ tx_data = 519; } //301-330град 10-11час if(au16data[1] >= 301 && au16data[1] <= 330){ tx_data = 520; } //330-360град 11-12час if(au16data[1] >= 331 && au16data[1] <= 360){ tx_data = 521; } LoRa.beginPacket(); LoRa.print(tx_data); LoRa.endPacket(); digitalWrite(LED_BUILTIN, LOW); delay(50); } //скорость ветра 1-1.5м/с if(au16data[0] >= 11 && au16data[0] <= 15) { //0-30град 0-1час if(au16data[1] >= 0 && au16data[1] <= 30){ tx_data = 1010; } //31-60град 1-2час if(au16data[1] >= 31 && au16data[1] <= 60){ tx_data = 1011; } //61-90град 2-3час if(au16data[1] >= 61 && au16data[1] <= 90){ tx_data = 1012; } //91-120град 3-4час if(au16data[1] >= 91 && au16data[1] <= 120){ tx_data = 1013; } //121-150град 4-5час if(au16data[1] >= 121 && au16data[1] <= 150){ tx_data = 1014; } //151-180град 5-6час if(au16data[1] >= 151 && au16data[1] <= 180){ tx_data = 1015; } //181-210град 6-7час if(au16data[1] >= 181 && au16data[1] <= 210){ tx_data = 1016; } //211-240град 7-8час if(au16data[1] >= 211 && au16data[1] <= 240){ tx_data = 1017; } //241-270град 8-9час if(au16data[1] >= 241 && au16data[1] <= 270){ tx_data = 1018; } //271-300град 9-10час if(au16data[1] >= 271 && au16data[1] <= 300){ tx_data = 1019; } //301-330град 10-11час if(au16data[1] >= 301 && au16data[1] <= 330){ tx_data = 1020; } //330-360град 11-12час if(au16data[1] >= 331 && au16data[1] <= 360){ tx_data = 1021; } LoRa.beginPacket(); LoRa.print(tx_data); LoRa.endPacket(); digitalWrite(LED_BUILTIN, LOW); delay(50); } //скорость ветра 1.5-2м/с if(au16data[0] >= 16 && au16data[0] <= 20) { //0-30град 0-1час if(au16data[1] >= 0 && au16data[1] <= 30){ tx_data = 1510; } //31-60град 1-2час if(au16data[1] >= 31 && au16data[1] <= 60){ tx_data = 1511; } //61-90град 2-3час if(au16data[1] >= 61 && au16data[1] <= 90){ tx_data = 1512; } //91-120град 3-4час if(au16data[1] >= 91 && au16data[1] <= 120){ tx_data = 1513; } //121-150град 4-5час if(au16data[1] >= 121 && au16data[1] <= 150){ tx_data = 1514; } //151-180град 5-6час if(au16data[1] >= 151 && au16data[1] <= 180){ tx_data = 1515; } //181-210град 6-7час if(au16data[1] >= 181 && au16data[1] <= 210){ tx_data = 1516; } //211-240град 7-8час if(au16data[1] >= 211 && au16data[1] <= 240){ tx_data = 1517; } //241-270град 8-9час if(au16data[1] >= 241 && au16data[1] <= 270){ tx_data = 1518; } //271-300град 9-10час if(au16data[1] >= 271 && au16data[1] <= 300){ tx_data = 1519; } //301-330град 10-11час if(au16data[1] >= 301 && au16data[1] <= 330){ tx_data = 1520; } //330-360град 11-12час if(au16data[1] >= 331 && au16data[1] <= 360){ tx_data = 1521; } LoRa.beginPacket(); LoRa.print(tx_data); LoRa.endPacket(); digitalWrite(LED_BUILTIN, LOW); delay(50); } //скорость ветра 2-2.5м/с if(au16data[0] >= 21 && au16data[0] <= 25) { //0-30град 0-1час if(au16data[1] >= 0 && au16data[1] <= 30){ tx_data = 2010; } //31-60град 1-2час if(au16data[1] >= 31 && au16data[1] <= 60){ tx_data = 2011; } //61-90град 2-3час if(au16data[1] >= 61 && au16data[1] <= 90){ tx_data = 2012; } //91-120град 3-4час if(au16data[1] >= 91 && au16data[1] <= 120){ tx_data = 2013; } //121-150град 4-5час if(au16data[1] >= 121 && au16data[1] <= 150){ tx_data = 2014; } //151-180град 5-6час if(au16data[1] >= 151 && au16data[1] <= 180){ tx_data = 2015; } //181-210град 6-7час if(au16data[1] >= 181 && au16data[1] <= 210){ tx_data = 2016; } //211-240град 7-8час if(au16data[1] >= 211 && au16data[1] <= 240){ tx_data = 2017; } //241-270град 8-9час if(au16data[1] >= 241 && au16data[1] <= 270){ tx_data = 2018; } //271-300град 9-10час if(au16data[1] >= 271 && au16data[1] <= 300){ tx_data = 2019; } //301-330град 10-11час if(au16data[1] >= 301 && au16data[1] <= 330){ tx_data = 2020; } //330-360град 11-12час if(au16data[1] >= 331 && au16data[1] <= 360){ tx_data = 2021; } LoRa.beginPacket(); LoRa.print(tx_data); LoRa.endPacket(); digitalWrite(LED_BUILTIN, LOW); delay(50); } //скорость ветра 2.5-3м/с if(au16data[0] >= 26 && au16data[0] <= 30) { //0-30град 0-1час if(au16data[1] >= 0 && au16data[1] <= 30){ tx_data = 2510; } //31-60град 1-2час if(au16data[1] >= 31 && au16data[1] <= 60){ tx_data = 2511; } //61-90град 2-3час if(au16data[1] >= 61 && au16data[1] <= 90){ tx_data = 2512; } //91-120град 3-4час if(au16data[1] >= 91 && au16data[1] <= 120){ tx_data = 2513; } //121-150град 4-5час if(au16data[1] >= 121 && au16data[1] <= 150){ tx_data = 2514; } //151-180град 5-6час if(au16data[1] >= 151 && au16data[1] <= 180){ tx_data = 2515; } //181-210град 6-7час if(au16data[1] >= 181 && au16data[1] <= 210){ tx_data = 2516; } //211-240град 7-8час if(au16data[1] >= 211 && au16data[1] <= 240){ tx_data = 2517; } //241-270град 8-9час if(au16data[1] >= 241 && au16data[1] <= 270){ tx_data = 2518; } //271-300град 9-10час if(au16data[1] >= 271 && au16data[1] <= 300){ tx_data = 2519; } //301-330град 10-11час if(au16data[1] >= 301 && au16data[1] <= 330){ tx_data = 2520; } //330-360град 11-12час if(au16data[1] >= 331 && au16data[1] <= 360){ tx_data = 2521; } LoRa.beginPacket(); LoRa.print(tx_data); LoRa.endPacket(); digitalWrite(LED_BUILTIN, LOW); delay(50); } //скорость ветра 3-3.5м/с if(au16data[0] >= 31 && au16data[0] <= 35) { //0-30град 0-1час if(au16data[1] >= 0 && au16data[1] <= 30){ tx_data = 3010; } //31-60град 1-2час if(au16data[1] >= 31 && au16data[1] <= 60){ tx_data = 3011; } //61-90град 2-3час if(au16data[1] >= 61 && au16data[1] <= 90){ tx_data = 3012; } //91-120град 3-4час if(au16data[1] >= 91 && au16data[1] <= 120){ tx_data = 3013; } //121-150град 4-5час if(au16data[1] >= 121 && au16data[1] <= 150){ tx_data = 3014; } //151-180град 5-6час if(au16data[1] >= 151 && au16data[1] <= 180){ tx_data = 3015; } //181-210град 6-7час if(au16data[1] >= 181 && au16data[1] <= 210){ tx_data = 3016; } //211-240град 7-8час if(au16data[1] >= 211 && au16data[1] <= 240){ tx_data = 3017; } //241-270град 8-9час if(au16data[1] >= 241 && au16data[1] <= 270){ tx_data = 3018; } //271-300град 9-10час if(au16data[1] >= 271 && au16data[1] <= 300){ tx_data = 3019; } //301-330град 10-11час if(au16data[1] >= 301 && au16data[1] <= 330){ tx_data = 3020; } //330-360град 11-12час if(au16data[1] >= 331 && au16data[1] <= 360){ tx_data = 3021; } LoRa.beginPacket(); LoRa.print(tx_data); LoRa.endPacket(); digitalWrite(LED_BUILTIN, LOW); delay(50); } }
это приемник
#include <SPI.h> #include <LoRa.h> // uncomment the section corresponding to your board // BSFrance 2017 contact@bsrance.fr // //LoR32u4 433MHz V1.0 (white board) // #define SCK 15 // #define MISO 14 // #define MOSI 16 // #define SS 1 // #define RST 4 // #define DI0 7 // #define BAND 433E6 // #define PABOOST true // //LoR32u4 433MHz V1.2 (white board) // #define SCK 15 // #define MISO 14 // #define MOSI 16 // #define SS 8 // #define RST 4 // #define DI0 7 // #define BAND 433E6 // #define PABOOST true //LoR32u4II 868MHz or 915MHz (black board) #define SCK 15 #define MISO 14 #define MOSI 16 #define SS 8 #define RST 4 #define DI0 7 #define BAND 868E6 // 915E6 #define PABOOST true char rec; void setup() { Serial.begin(9600); Serial.println("LoRa Receiver"); LoRa.setPins(SS,RST,DI0); if (!LoRa.begin(BAND,PABOOST )) { } //error } void loop() { // try to parse packet int packetSize = LoRa.parsePacket(); if (packetSize) { digitalWrite(LED_BUILTIN, HIGH); while (LoRa.available()) { rec = LoRa.read(); delay(100); Serial.print(rec); } digitalWrite(LED_BUILTIN, LOW); } }
Неправда. Нехорошо обманывать!
В строках №№ 155, 216, 277, 338, 398, 459 Вы передаёте число в виде символьной строки.
Ну, правильно, как передаёте, так и приходят. А Вы чего ожидали?
Ну, если надо, так либо передавайте их как число, а не как строку, либо передавайте как передаёте, а на принимающей стороне преобразуйте из строки в число.
Если Вы не знаете как именно "передавать как число", подсказка - Ваш класс описан как
а значит все методы типа print / println / write и т.п. у него точно такие же, как и у обычного Serial. Ну, а уж по последнему документации море, разберётесь.
Всем спасибо.
Проблема решена. Убрал цикл while. Ну и добавил LoRa.readString();
Теперь сравнивается правильно. А это мне и нужно было.
Понятно, т.е. решили пойти по пути передачи строк :-) Ну, в добрый путь.
Хорошо бы еще кто нибуть подсказал бы другой путь менее длинный код.
//скорость ветра 1-1.5м/с
164
if
(au16data[0] >= 11 && au16data[0] <= 15) {
165
//0-30град 0-1час
166
if
(au16data[1] >= 0 && au16data[1] <= 30){
167
tx_data = 1010;
168
}
169
//31-60град 1-2час
170
if
(au16data[1] >= 31 && au16data[1] <= 60){
171
tx_data = 1011;
172
173
}
174
//61-90град 2-3час
175
if
(au16data[1] >= 61 && au16data[1] <= 90){
176
tx_data = 1012;
177
}
178
//91-120град 3-4час
179
if
(au16data[1] >= 91 && au16data[1] <= 120){
180
tx_data = 1013;
181
}
182
//121-150град 4-5час
183
if
(au16data[1] >= 121 && au16data[1] <= 150){
184
tx_data = 1014;
185
}
186
//151-180град 5-6час
187
if
(au16data[1] >= 151 && au16data[1] <= 180){
188
tx_data = 1015;
189
}
190
//181-210град 6-7час
191
if
(au16data[1] >= 181 && au16data[1] <= 210){
192
tx_data = 1016;
193
}
194
//211-240град 7-8час
195
if
(au16data[1] >= 211 && au16data[1] <= 240){
196
tx_data = 1017;
197
}
198
//241-270град 8-9час
199
if
(au16data[1] >= 241 && au16data[1] <= 270){
200
tx_data = 1018;
201
}
202
//271-300град 9-10час
203
if
(au16data[1] >= 271 && au16data[1] <= 300){
204
tx_data = 1019;
205
}
206
//301-330град 10-11час
207
if
(au16data[1] >= 301 && au16data[1] <= 330){
208
tx_data = 1020;
209
}
210
//330-360град 11-12час
211
if
(au16data[1] >= 331 && au16data[1] <= 360){
212
tx_data = 1021;
213
}
Хорошо бы еще кто нибуть подсказал бы другой путь менее длинный код.
Вы выложили странный огрызок кода в котором даже баланс фигурных скобок не соблюдён. Да, к тому же выложили его не по правилам форума, в результате я не могу просто скопипастить его к себе (Вы же, вроде, раньше умели правильно выкладывать, что случилось?). Как Вам можно подсказать?
То, что я пока вижу можно сократить кардинально, только оно Вам действительно надо?
Тем более, что у Вас какой-то странный набор интервалов. Они неодинаковы. Первый - 31 (с 0 по 30 включительно) а все остальные по 30.
0 <= x <= 30 --- всего 31 значение
31 <= x <= 60 --- всего 30 значений
61 <= x <= 90 --- всего 30 значений
...
0 <= x < 30 --- всего 30 значений
30 <= x < 60 --- всего 30 значений
60 <= x < 90 --- всего 30 значений
Если второй вариант, то вся Ваша портянка может быть сведена к одной (прописью - ОДНОЙ) строке.
Понятно, т.е. решили пойти по пути передачи строк :-) Ну, в добрый путь.
Мне кажется ТС не видит разницы передать данные числом или строкой.
Почему не передать в одном байте скорость, во втором - направление ветра?
Хорошо бы еще кто нибуть подсказал бы другой путь менее длинный код.
Вы выложили странный огрызок кода в котором даже баланс фигурных скобок не соблюдён. Да, к тому же выложили его не по правилам форума, в результате я не могу просто скопипастить его к себе (Вы же, вроде, раньше умели правильно выкладывать, что случилось?). Как Вам можно подсказать?
То, что я пока вижу можно сократить кардинально, только оно Вам действительно надо?
Тем более, что у Вас какой-то странный набор интервалов. Они неодинаковы. Первый - 31 (с 0 по 30 включительно) а все остальные по 30.
0 <= x <= 30 --- всего 31 значение
31 <= x <= 60 --- всего 30 значений
61 <= x <= 90 --- всего 30 значений
...
0 <= x < 30 --- всего 30 значений
30 <= x < 60 --- всего 30 значений
60 <= x < 90 --- всего 30 значений
Если второй вариант, то вся Ваша портянка может быть сведена к одной (прописью - ОДНОЙ) строке.
Извеняюсь за столь странный кусок кода(делал с телефона).
сейчас постараюсь объяснить подробнее зачем все это надо.
Собственно мне нужно передать эти параметры на приемник. Итак я сделал для более простого понимания на приемнике.
В принципе разницы нет как передавать. Но на приемнике LoRa надо будет чтобы при определённом направлении и скорости проигрывался мп3 файл устройством dfplayer mini. Пределы направления ветра от 1 до 12 в часах то есть 1 это направление на один час. Скорость ветра от 0.5м/с до 10м/с с шагом 0.5м/с. Например на устройство приемник пришло 510 это значит что скорость 0.5 м/с направление 1 дальше по uart передаю в dfplayer mini воспроизвести файл 1 ну и так далее. Таких файлов 240. Каждый файл соответствует своему направлению и скорости. Надеюсь теперь более понятно.
Можно но мне надо чтобы если направление и скорость изменились то звуковой файл должен быть воспроизведен один раз. Далее если направление и скорость не изменились не воспроизводить ничего. И по этому я не вижу другого способа как сравнивать новые и старые значения.
Ничего не понятно. Вы мой вопрос поняли? У Вас разные интервалы - все 30, а один - 31. Вы это понимаете? Вопрос был простой: это строго необходимо или подойдут и одинаковые?
Если подойдут и одинаковые, то эту Вашу байду можно одной строкой записать.
А про всё остальное мне неинтересно.
Интервалы одинаковые это просто я ошибся. это градусы. 360 градусов разделенные на 12 интервалов то есть 12 часов напрвалений.
20 скоростей и 12 направлений вообще в один байт упаковать наверно можно и на приёмнике использовать его в качестве ID трека для плеера.
если число скоростей урезать до 16-ти - можно будет по 4 бита отвести на скорость и направление :) - будет красиво и удобно...
Только все это не для ТС - он даже о массивах не подозревает
если число скоростей урезать до 16-ти - можно будет по 4 бита отвести на скорость и направление :) - будет красиво и удобно...
На самом деле и 20*12 вполне укладываются в 240 значений. И еще 16 значений остается для всяких служебных сообщений. Так что даже урезать ничего не нужно.
Интервалы одинаковые это просто я ошибся. это градусы. 360 градусов разделенные на 12 интервалов то есть 12 часов напрвалений.
Вот прямо сейчас, я хотел показать Вам как всю байду из #4 записать одной строкой, но ... Вы когда-нибудь вставите её нормально, чтобы я мог её просто к себе скопировать? Или Вы предлагаете мне копировать как есть и вручную убирать мусор из каждой строки? Если второе, то мне лень и я этого делать не буду. Если вставите, то скопирую и покажу как заменить.
Не создавайте на ровном проблем тем, кто хочет Вам помочь!
P.S. Отмазы типа "я с телефона" не канают. Я-то чем виноват, что Вы с телефона? Мне из-за этого вручную всё ковырять? Не умеете с телефона - вставляйте с пылесоса, но вставляйте нормально.
Если честно то я не понял как ещё правильно вставить. Просто весь код в первом сообщении. В том сообщении где я вставил кусок кода всего лишь кусок из первого сообщения. этот код я вставил для указания моей проблемы. Если есть какие то трудности с копированием из первого сообщения продублирую.
вот весь код
вот один блок
Если честно то я не понял как ещё правильно вставить. Просто весь код в первом сообщении.
Если честно, я отвечаю на вопрос из сообщения #4 и меня интересует код оттуда.
Я вижу, что Вы поправили интервалы не так, как писал в #5, а зачем-то сделали их с 1. Неясно зачем, в программировании гораздо удобнее делать с 0. Этими 1-цами Вы отрезаете себе возможности краткой записи. Всегда делайте с нуля. Единицы можно, на худой конец один раз к результату прибавить или вычесть.
Так, вот, если сделать интервалы с нуля (как у меня в коде ниже), то вся эта байда (вся целиком)
может быть заменена на единственную строчку
Посмотрите и убедитесь сами, что это эквивалентно.
Тут, разве что, не хватает проверки, что au16data[1] не превышает 360. Но, если такая проверка нужна (часто она не нужна в силу природы этих данных), то её можно добавить - плюс ещё одна строка.
Теперь понял. Спасибо.
Код работает отлично. Больше 360 не может быть так как это считывается с помощью библиотеки modbus.
И еще это заложено производителем.
Может еще подскажите как упростить на стороне приемника?
в общем мне надо преобразовать приходящие
510 511 512 513 514 515 516 517 518 519 520 521
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
.............
..............
5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021
сопоставить с
0001 0002 0003 0004 0005 0006 ...... 0239 0240
например преобразовать
510 в 0001
511 в 0002
ну и так далее 240 значений
Не проще ли файлам дать имена 510, 511...
Файлам можно но dfplayer работает с файлами 0001 0002.
Немного ошибся. Даже не в 0001 0002 надо а в 1 2 3 4...... 240.
На DFplayer отправляю команду myDFPlayer.play(52) что означает воспроизвести файл 0052
Вот мой код
Да, есть у dfplayer такая болезнь.
Не знаю, какую цель преследуете, пересылая данные в такой форме, но я бы, как и писал выше, попытался упаковать значение метрики так, чтобы она сразу конвертировалась в номер трека.
В противном случае остается только хранить массив со значениями метрики и бегать по нему, определяя соответствующий значению индекс, который и будет номером трека.
Цель проста. Не запутаться.
Для лучшего понимания при отладке и написании программы.
Потому как мне код видеться объемным.
Не профессионалам простые вещи кажутся сложными а сложные простыми.
Теперь понял. Спасибо.
Код работает отлично. Больше 360 не может быть так как это считывается с помощью библиотеки modbus.
И еще это заложено производителем.
Может еще подскажите как упростить на стороне приемника?
в общем мне надо преобразовать приходящие
510 511 512 513 514 515 516 517 518 519 520 521
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
.............
..............
5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021
сопоставить с
0001 0002 0003 0004 0005 0006 ...... 0239 0240
например преобразовать
510 в 0001
511 в 0002
ну и так далее 240 значений
В строке 12 чисел, всего 10 строк. Получаем 120 значений? Так или я чего-то упустил?
например преобразовать
510 в 0001
511 в 0002
ну и так далее 240 значений
Например, написать
Например, написать
Ты чо? В его ПТУ вышшую математику не проходили. Ему бы попроще чо.
Например, написать
Ты чо? В его ПТУ вышшую математику не проходили. Ему бы попроще чо.
Ну вопервых я вас не оскорблял. Теперь перейдём на ты. Во вторых ты когда пишешь сообщение смотри куда пишешь. Я специально написал в песочницу потому как я не профессионально занимаюсь программированием. Это моё хобби. Вместо оскорблений лучше помог. Написал бы как эту задачу решить по интереснее. Сколь у тебя высших ? Наверное много. А за всё время научили только оскорблять и стебаться.
Всем кто помогал спасибо. Тему можно закрывать
Ну вот обидели человека... А я хотел предложить решение в одну строку.
Да не. Не обидели.
Просто решил задачу. Но хотелось бы у видеть элегантное решение на будущее. Может оно кому ещё поможет.
#24 ответьте на мой вопрос. 120 всех значений или 240?
240
Чет я туплю неподетски... Парни, ТС не хочет объяснять как из 10 строк по 12 чисел получается всего 240 чисел, может кто объяснит "на пальцах"?
Да у него там завязка на скорость ветра ещё. Видимо будет электронный боцман из ардуины, который говорит: "Ветер зюйд-зюйд-вест, три узла".
Да у него там завязка на скорость ветра ещё. Видимо будет электронный боцман из ардуины, который говорит: "Ветер зюйд-зюйд-вест, три узла".
Направление у него в часах, как я понял. Всего 12 значений.
Скорость - 10 значений в 1/2 м/с.
Не 10 значений, а "0.5м/с до 10м/с с шагом 0.5м/с."
Глянул еще. У ТС скорость приходит в дм/с.
5хх - <= 10 дм/с
10хх - <= 15 дм/с
....
....
50хх -<= 55 дм/с
Извеняюсь что ввёл в заблуждение. Там оканчивается не 50xx-<=55 а то 100xx-<=100. Именно от 0.5 до 10м/с с шагом 0.5м/с
Да у него там завязка на скорость ветра ещё. Видимо будет электронный боцман из ардуины, который говорит: "Ветер зюйд-зюйд-вест, три узла".
Да вы угодали. Именно так.
Только направление в часах в зависимости куда направлен датчик.
А я чот не въезжаю в цель. Вымпельный ветер озвучивать? Сейлить в одиночку? Просто интересно.
Может еще подскажите как упростить на стороне приемника?
в общем мне надо преобразовать приходящие
510 511 512 513 514 515 516 517 518 519 520 521
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
.............
..............
5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021
сопоставить с
0001 0002 0003 0004 0005 0006 ...... 0239 0240
например преобразовать
510 в 0001
511 в 0002
ну и так далее 240 значений
word inVal; // приходящее значение 510-10021
word outVal= (inVal / 500 - 1) * 12 + inVal % 100 - 9;//порядковый номер приходящего значения 1-240
А я чот не въезжаю в цель. Вымпельный ветер озвучивать? Сейлить в одиночку? Просто интересно.
Не в даваясь в подробности. Это нужно спортсменам для тренировки. Им нужно оперативно знать ветер в нескольких точках. Но экран с данными не подходит. Нужен человек который озвучивал бы направление и скорость. А така как это нудная работа и человек может не туда посмотреть и не то назвать. Ну вообщем с этой работой легко справится тупая говорилка.
Может еще подскажите как упростить на стороне приемника?
в общем мне надо преобразовать приходящие
510 511 512 513 514 515 516 517 518 519 520 521
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
.............
..............
5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021
сопоставить с
0001 0002 0003 0004 0005 0006 ...... 0239 0240
например преобразовать
510 в 0001
511 в 0002
ну и так далее 240 значений
word inVal; // приходящее значение 510-10021
word outVal= (inVal / 500 - 1) * 12 + inVal % 100 - 9;//порядковый номер приходящего значения 1-240
Интересно. Будет время обязательно поробую. Огромное спасибо всем.
Есть прекрасная библиотека для работы с LoRa модулями SX 12xx-LORA
В ней есть много примеров для многих случаев .Для вашего случая возможно подойдет "LoRa_Structure_TX" и"LoRa_Structure_RX"
Из примера: