Ви не увійшли.
Сторінки 1
Primaangel88 пише:case 2: // зчитуємо решту пакету buf[idx++]=b; if(idx>=8)Тут би по-хорошому читати байт довжини, а потім buf[2] байтів пакета. Бо якщо дисплей відправить щось не 8-байтове, парсер розсинхронізується.
Отут то собака й порилася . пакет приходить з 9 байт.
зараз перероблю код. і відпишу.
додав для відладки в порт повідомлення отримав ось таке у відповідь
і реле не відпрацьовує
DWIN RX -> 5A A5 6 83 50 1 1 0
Relay command: 0
Sensor 0 error
Temp 1 = 0.00
Sensor 1 error
Temp 2 = 0.00
Sensor 2 error
Temp 3 = 0.00
Sensor 3 error
Temp 4 = 0.00
Sensor 4 error
Temp 5 = 0.00
UART RESET
Heat timer 0:0
Cool timer 0:0
DWIN SEND -> VP:2001 value:0
DWIN SEND -> VP:2002 value:0
DWIN SEND -> VP:2003 value:0
DWIN SEND -> VP:2004 value:0
Flow pulses/sec: 0
Доброго дня! Пишу код для домашнього проєкту (самонавчання).
Код має обробляти пакети що приходять з дисплея по uart в вигляді 0x5A 0xA5 0x06 0x83 0x50 0x01 0x01 0x00 0x03.
та надсилати пакети з інформацією у вигляді 0x5A 0xA5 0x06 0x82 0x50 0x01 0x01 0x00 0x03
де
Байти Значення
5A A5 старт пакета
06 довжина
83 читання VP () дисплей прочитав значення в памяті і передав в порт, якщо дисплей отримує 0х82 він записує в память
50 01 адреса
01 кількість слів
00 03 дані
код має читати пакети данних з дисплея та періодично відправляти на дисплей пакети з данними з 5 датчиків температури, датчика потоку, та час з двох таймерів. а також оновлювати на дисплеї стан кнопок відповідно до поточного стану реле, бо в коді є автоматичне вмикання реле по досягненню температур.
я так розумію що я щось намудрував з парсингом по uart
нижче прикріпляю код мого проекту.
/* =========================================================
Arduino Nano + DWIN + DS18B20 + Flow sensor + RTC DS3231
Функції:
• 5 датчиків температури DS18B20 (1-Wire)
• 3 реле
• 2 таймери роботи
• автоматичне керування температурою
• підрахунок потоку води
• зв'язок з дисплеєм DWIN
• захист від зависання UART та датчиків
========================================================= */
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>
/* ---------------- DWIN UART ----------------
налаштування uart для роботи з дисплеем */
#define DWIN_RX 10
#define DWIN_TX 9
SoftwareSerial dwin(DWIN_RX,DWIN_TX);
/* ---------------- DS18B20 ---------------- */
#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
/* --------- ФІЗИЧНІ АДРЕСИ ДАТЧИКІВ ---------
АДРЕСИ заповнити вручну
---------------------------------------------- */
DeviceAddress sensorAddr[5] =
{
{0x28,0xFF,0x00,0x00,0x00,0x00,0x00,0x01}, // датчик 1
{0x28,0xFF,0x00,0x00,0x00,0x00,0x00,0x02}, // датчик 2
{0x28,0xFF,0x00,0x00,0x00,0x00,0x00,0x03}, // датчик 3
{0x28,0xFF,0x00,0x00,0x00,0x00,0x00,0x04}, // датчик 4
{0x28,0xFF,0x00,0x00,0x00,0x00,0x00,0x05} // датчик 5
};
/* ---------------- RTC ----------------
модуль точного часу ----------------*/
RTC_DS3231 rtc;
bool rtc_ok = false;
/* ---------------- RELAYS ----------------
налаштування пінів реле--------------- */
byte relayPin[3] = {4,5,6};
bool relayState[3] = {0,0,0};
/* ---------------- FLOW SENSOR ----------------
налаштування датчика потоку----------------- */
#define FLOW_PIN 2
volatile uint16_t flow_pulses=0;
uint16_t flow_lpm=0;
/* ---------------- TEMPERATURES ----------------
масив для зберігання температур------------- */
float temp[5];
int lastTempSend[5] = {0,0,0,0,0};
/* ---------------- TIMERS ---------------- */
uint32_t heatStart=0;
uint32_t coolStart=0;
uint32_t heatTime=0;
uint32_t coolTime=0;
/* ---------------- LOOP TASK TIMERS ----------------
налаштування затримок в циклі для зменшення навантаження на порт */
uint32_t tUART=0;
uint32_t tTEMP=0;
uint32_t tFLOW=0;
uint32_t tTIMER=0;
/* ---------------- UART RX ---------------- */
byte buf[8];
byte idx=0;
byte state=0;
uint32_t uartTimer=0;
/* ----------------- FLOW INTERRUPT
рахує імпульси датчика потоку */
void flowISR()
{
flow_pulses++;
}
/* --------------SEND VALUE TO DWIN
формування пакету запису VP------*/
void sendVP(uint16_t addr,int value)
{
byte pkt[8];
pkt[0]=0x5A;
pkt[1]=0xA5;
pkt[2]=0x05;
pkt[3]=0x82;
pkt[4]=addr>>8;
pkt[5]=addr&0xFF;
pkt[6]=value>>8;
pkt[7]=value&0xFF;
dwin.write(pkt,8);
}
/*------------ RESET SOFTWARE SERIAL
автоматичний reset якщо UART завис */
void resetUART()
{
dwin.end();
delay(10);
dwin.begin(115200);
}
/* ------------------ PARSE PACKET
обробка кнопок реле----------------*/
void parsePacket()
{
if(buf[3]==0x83 && buf[4]==0x50)
{
byte val=buf[7];
relayState[0]=bitRead(val,0);
relayState[1]=bitRead(val,1);
relayState[2]=bitRead(val,2);
}
}
/*----------------- READ DWIN PACKETS
метод state machine: 0-5A,1-A5,2-6 байт
парсинг пакетів--------------------------------*/
void readDWIN()
{
while(dwin.available())
{
byte b=dwin.read();
uartTimer=millis();
switch(state)
{
case 0: // чекаємо стартовий байт 0x5A
if(b==0x5A){ buf[0]=b; state=1; }
break;
case 1: // чекаємо другий байт 0xA5
if(b==0xA5){ buf[1]=b; idx=2; state=2; }
else state=0;
break;
case 2: // зчитуємо решту пакету
buf[idx++]=b;
if(idx>=8)
{
parsePacket();
idx=0;
state=0;
}
break;
}
}
// reset UART якщо завис
if(millis()-uartTimer>500)
{
resetUART();
uartTimer=millis();
}
}
/* =-------------- READ TEMPERATURES
зчитування 5 датчиків з захистом обриву */
void readTemps()
{
sensors.requestTemperatures();
for(int i=0;i<5;i++)
{
float t=sensors.getTempC(sensorAddr[i]);
if(t==-127 || t>110 || t<-40) t=0;
temp[i]=t;
int v=t*100;
// передача лише якщо змінилося
if(v!=lastTempSend[i])
{
uint16_t addr;
switch(i)
{
case 0: addr=1005; break;
case 1: addr=1006; break;
case 2: addr=1008; break;
case 3: addr=1009; break;
case 4: addr=1010; break;
}
sendVP(addr,v);
lastTempSend[i]=v;
}
}
}
/* --------------- AUTOMATIC RELAY CONTROL
автоматичне керування реле по температурі */
void autoRelays()
{
if(temp[3]>=70) relayState[1]=1;
if(temp[1]>=25) relayState[2]=1;
}
/*----------------------- UPDATE RELAYS
оновлення фізичних реле та дисплея */
void updateRelays()
{
static bool lastRelay[3]={0,0,0};
for(int i=0;i<3;i++)
{
digitalWrite(relayPin[i],relayState[i]);
if(relayState[i]!=lastRelay[i])
{
sendVP(0x5001,relayState[0] | relayState[1]<<1 | relayState[2]<<2);
lastRelay[i]=relayState[i];
}
}
}
/*------------------- READ FLOW SENSOR
оптимізований підрахунок потоку ----*/
void readFlow()
{
noInterrupts();
uint16_t p=flow_pulses;
flow_pulses=0;
interrupts();
flow_lpm=p;
sendVP(1007,flow_lpm);
}
/* --------------------------UPDATE TIMERS
таймери роботи нагріву та охолодження */
void updateTimers()
{
uint32_t now;
if(rtc_ok) now=rtc.now().unixtime();
else now=millis()/1000;
if(relayState[0])
{
if(heatStart==0) heatStart=now;
heatTime=now-heatStart;
}
if(relayState[2])
{
if(coolStart==0) coolStart=now;
coolTime=now-coolStart;
}
uint16_t h1=heatTime/3600;
uint16_t m1=(heatTime%3600)/60;
uint16_t h2=coolTime/3600;
uint16_t m2=(coolTime%3600)/60;
sendVP(2001,h1);
sendVP(2002,m1);
sendVP(2003,h2);
sendVP(2004,m2);
}
/* ---------------------- SETUP--------------- */
void setup()
{
Serial.begin(115200);
dwin.begin(115200);
sensors.begin();
Wire.begin();
rtc_ok=rtc.begin();
for(int i=0;i<3;i++)
{
pinMode(relayPin[i],OUTPUT);
}
pinMode(FLOW_PIN,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(FLOW_PIN),flowISR,RISING);
}
/*----------------- LOOP (оптимізований планувальник задач)------------- */
void loop()
{
/* ---------------- читання UART ---------------- */
if(millis()-tUART > 5)
{
tUART = millis();
readDWIN();
}
/* ---------------- температури ---------------- */
if(millis()-tTEMP > 1000)
{
tTEMP = millis();
readTemps();
autoRelays();
updateRelays();
}
/* ---------------- потік води ---------------- */
if(millis()-tFLOW > 1000)
{
tFLOW = millis();
readFlow();
}
/* ---------------- таймери ---------------- */
if(millis()-tTIMER > 1000)
{
tTIMER = millis();
updateTimers();
}
}проблема в тому що код читає неправильно данні з порта, і відповідно не виконує обробку натискання з дисплею.
коли пишу простий код то бачу що данні приходять коректні.
перероблю код за вашими прикладами, та викладу. Дякую за допомогу.
Ура!!! запрацювало....
коли скоротив до 9 символів масив.
алгоритм роботи такий.
поки ми не чіпаємо дисплей нічого не передається.
коли дисплей відпрацював натискання кнопки він посилає наступні данні в порт:
5A A5 06 83 50 00 01 00 01
5А А5 маска
06 довжина передачі в байтах починаючи з наступного після цього тобто (6)
83 команда читання данних з RAM памяті, я так зрозумів так дисплей каже що він наступні данні прочитав з своєї RAM
50 00 адреса в памяті
01 кількість слів що читаються(апдейт)
00 01 данні що там лежать
при підключенні до программи DWIN, кожне опрацювання дотику передається саме в такому вигляді(в HEX)
отже коли я отримую що за адресою 5000 данні
0001(->bin 0001) перша кнопка активна (інші неактивні )
0002(->bin 0010) друга
0003(->bin 0100) третя
виправив
if(bufflag && l>=20){
if (bufflag && Buffer[0] == 0X5A && Buffer[3] == 0X83 && Buffer[4]==0X50){
Serial.println();
Serial.print(Buffer[0], HEX);
Serial.print(Buffer[1], HEX);
Serial.print(Buffer[2], HEX);
Serial.print(Buffer[3], HEX);
Serial.print(Buffer[4], HEX);
Serial.print(Buffer[5], HEX);
Serial.print(Buffer[6], HEX);
Serial.print(Buffer[7], HEX);
Serial.print(Buffer[8], HEX);
}
l=0;
bufflag=!bufflag;
}тепер читає але не кожен раз. треба задовбат кнопку натисканням і тільки разу з 10 спрацьовує
нижче те що в серіал піля 30-40 натискань:
5AA5683500104
5AA5683500107
5AA5683500107
5AA5683500103
5AA5683500106
від одного до 7 стани реле. комбінація 3 реле.
Доброго дня, панове!
зробив так я ви радили. пишу код сам. Але якась херня виходить повна
посадив дисплей на softserial.
написав ось це:
if (dwinSerial.available()){
Buffer[l]=dwinSerial.read();
l++;
bufflag=true;
}
if (bufflag && Buffer[0] == 0X5A && Buffer[3] == 0X83 && Buffer[4]==0X50){
Serial.println();
Serial.print(Buffer[0], HEX);
Serial.print(Buffer[1], HEX);
Serial.print(Buffer[2], HEX);
Serial.print(Buffer[3], HEX);
Serial.print(Buffer[4], HEX);
Serial.print(Buffer[5], HEX);
Serial.print(Buffer[6], HEX);
Serial.print(Buffer[7], HEX);
Serial.print(Buffer[8], HEX);
l=0;
bufflag=!bufflag;
} при натисканні будь якої кнопки на дисплеї отримую:
5A A 66 83 5000 0 0 0
а повинен отримати: 5A A5 06 83 50 00 01 00 01 (перша кнопка натиснута)
і скільки б я не натискав кнопки скетч чомусь не видає нічого.
дивно якось, окремо скетчі працюють без питань, але кол склав в один то частина коду що відповідає за передачу данних на дисплей спрацьовує тільки коли скетч відпрацьовує команду натискання кнопки, і далі це значення зависає і постійно повторюється в серіал.
і не можу увімкнути відладку в серіал бо інакше дисплей сприймає ці данні і все ламається. завтра спробую посадити дисплей на софт серіал і спробую зрозуміти що не так.
команда на запис 0X82
дисплей відповідає 0X83
Jokeer, дякую за пояснення.
тим часом зібрав код в купу, але є ньюанс.
нижче мій скетч.
при запускі программи керує реле, але температура не оновлюється, а лише при натисканні кнопки на дисплеї
код не мій, я просто підлаштував його під себе.
#include <microDS18B20.h>
#define DS_PIN 2 // пин для термометров
// Уникальные адреса датчиков - считать можно в примере address_read
uint8_t s1_addr[] = {0x28, 0xFF, 0x6D, 0x56, 0x1E, 0xE1, 0xF8, 0xDD};
MicroDS18B20<DS_PIN, s1_addr> sensor1; // Создаем термометр с адресацией
// Создаем термометр с адресацией
byte Send_ar[8] = {0x5A, 0xA5, 0x05, 0x82, 0x50, 0x02, 0x00, 0x00}; //массив с командой на дисплей
byte Send_ar1[8] = {0x5A, 0xA5, 0x05, 0x82, 0x50, 0x03, 0x00, 0x00}; //массив с командой на дисплей
// в номера 6-9 будем записывать значение температуры float в Hex формате
float temp1; //переменная1 для хранения температуры
float temp2; //переменная2 для хранения температуры
float temp3; //переменная3 для хранения температуры
float floatval;
int intval;
bool flag1 = false;
uint32_t tmr1=0;
uint32_t tmr2=0;
uint32_t tmr3=0;
// настройка работы с реле//
const bool level = 0; // 1 - реле высокого уровня 0 - реле низкого уровня
const byte relays_num = 3; // Количество реле
byte relays[relays_num] = {4, 5, 6}; // Пины подключения реле
//не трогать //
byte Buffer[20]; //Создать буфер
byte Buffer_Len = 0;
bool flag = false; // флаг чтения данных с монитора
void setup() {
Serial.begin(115200); //общение с дисплеем по сериал
for (byte i = 0; i < relays_num; i++)
{
pinMode(relays[i], OUTPUT);
if (!level)
digitalWrite(relays[i], HIGH);
}
}
void loop() {
ReadSerial();
if (millis()-tmr1 >= 1000){//таймер на запрос температуры
sensor1.requestTemp(); // Запрашиваем преобразование температуры
tmr1=millis(); // сброс таймера
flag1=!flag1; // подымаем флаг, формируется значение температуры
}
if(millis()-tmr2 >=1000 & flag){ //ждем время и флаг готовности
temp1 = sensor1.getTemp(); //запись температуры в переменную
tmr2 = millis(); //сброс таймера
flag1=!flag1;//опускаем флаг, температура прочитана, ожидаем следуйщий цикл
}
if (millis()-tmr3 >= 1000){ //таймер на отправку данных на дисплей
float floatval = temp1;
int intval = floatval * 100 + 0.5; //конвертируем значение температуры из float в HEX и записываем значения в массив
Send_ar[6] = intval >> 8;
Send_ar[7] = intval & 0xff;
Serial.write(Send_ar,8);
floatval = temp1;
intval = floatval * 100 + 0.5; //конвертируем значение температуры из float в HEX и записываем значения в массив
Send_ar1[6] = intval >> 8;
Send_ar1[7] = intval & 0xff;
Serial.write(Send_ar1,8);
tmr3=millis(); // сброс таймера
}
}і другий файл
// читаем монитор порта
void ReadSerial()
{
if (Serial.available())
{
Buffer[Buffer_Len] = Serial.read();
Buffer_Len++;
flag = true;
}
else
{
if (flag)
{
if (Buffer[0] == 0X5A & Buffer[3] == 0X83) {
if (Buffer[4] == 0X50) {
for (byte i = 0; i < relays_num; i++)
{
digitalWrite(relays[i], level == 0 ? !bitRead(Buffer[8], i) : bitRead(Buffer[8], i));
}
}
}
Buffer_Len = 0; // сброс номера элемента в массиве
flag = false;
}
}
}я підозрюю що я щось не врахував при роботі з буфером...
але що не бачу....
Jokeer вам теж дуже дякую!
Теж дали поштовх щоб разібразітисьв кодуваннях!!
Мені більш зрозуміла конструкція з зсувом. Можливо простотою використання з обмеженими, поки що, знаннями.
Ваш приклад кодінгу теж збережу, потроху і з ним розберусь як працює конструкція.
float floatval = 26.4212;
int intval = floatval * 100 + 0.5;
Send_ar[6] = intval >> 8;
Send_ar[7] = intval & 0xff;
спрацювало!!
не зразумів тільки як працює цей оператор. Якщо можна як це правильно називається?
intval >> 8;
апдейт: знайшов бітовий зсув)))
Дуже дякую dimich. Ваші питання вивели мене в правильне русло і дали поштовх для подальшого вивченя в правильному напрямку.
Також велике дякую Honey за кодінг!!!
Трохи пізніше допишу скетч з нормальними таймерами без delay, та додам код керування реле.
Готовий скетч викладу тут.
Ще раз велика подяка!
Ну, документація у вас є. Вам треба передати правильну команду і правильні дані, я правильно зрозумів?
так, я просто не розумію як перетворити десяткове число наприклад 26.4212 в ціле без коми 264212, обрізати до 4 чисел та перетворити в hex 0xFF 0xFF, щоб записати в масив.
Звідки ви взяли цю адресу 0x5002 для запису командою 0x82? Там же має бути описаний і формат даних. Наприклад, згідно з цим мануалом, 0x5002 - це взагалі якийсь байт статуса чи то відтворення відео, чи то якоїсь анімації. Навряд чи те, що вам потрібно. Наскільки розумію, ті дисплеї мають купу різних варіантів прошивок, у яких одні й ті ж адреси мають різні призначення.
Уточніть в документації на конкретно вашу версію прошивки, за якою адресою і в якому точно форматі потрібно писати дані для відображення.
процессор T5 версія оболонки T5UIC3.
адреси взяв з китайських відеоуроків по програмуванню(створенню інтерфейса) дисплеїв DWIN
кнопки змінюють по 1 біт за адресою 5001 від 0 до 15(тобта в одній адресі може вмістититись керування 16 кнопок)
в мене наприклад 3
при натисканні кнопки дисплей видає в серіал наступне: 5A A5 06 83 50 01 01 00 01 (натиснута кнопка 1)
приведу список як змінюється дата в залежності від натиснутих кнопок:
1-off 2-off 3-off ->0000
1-on 2-off 3-off ->0001
1-on 2-on 3-off ->0002
1-on 2-on 3-off ->0003
1-off 2-off 3-on ->0004
1-on 2-off 3-on ->0005
1-off 2-on 3-on ->0006
1-on 2-on 3-on ->0007
Звідки ви взяли цю адресу 0x5002 для запису командою 0x82? Там же має бути описаний і формат даних. Наприклад, згідно з цим мануалом, 0x5002 - це взагалі якийсь байт статуса чи то відтворення відео, чи то якоїсь анімації. Навряд чи те, що вам потрібно. Наскільки розумію, ті дисплеї мають купу різних варіантів прошивок, у яких одні й ті ж адреси мають різні призначення.
Уточніть в документації на конкретно вашу версію прошивки, за якою адресою і в якому точно форматі потрібно писати дані для відображення.
при натисканні кнопки на дисплеї дисплей по серіал порту надсилає наприклад: 5A A5 06 83 50 01 01 00 07 (три кнопки натиснуті, за кожною кнопкою закріплено біт від 0 до 2 в адресі 5001. тобто при натисканні першої змінюється біт 0, 2ї -> 1й біт, 3ї -> 2й біт)
результат взаємодії з кнопками:
1-off 2 -off 3-off -> 0000
1-on 2 -off 3-off -> 0001
1-off 2 -on 3-off -> 0002
1-on 2 -on 3-off -> 0003
1-off 2 -off 3-on -> 0004
1-on 2 -off 3-on -> 0005
1-off 2 -on 3-on -> 0006
1-on 2-on 3-on -> 0007
Primaangel88 пише:я пробував записати 0x00 0x22 на виході маю значення 0.22, якщо записати 0x22 0x00 на дисплеї 56.32
О, це вже щось. Для 0x00 0x22 я би сказав, що це BCD, але тоді для 0x22 0x00 було би 22.00. Гіпотеза про BCD не підтверджується. Які значення на дисплеї відповідають наступним записаним значенням:
0x01 0x00
0x00 0x01
0x80 0x00
0x00 0x80
0x55 0x55
?
0x01 0x00 -> 2.56
0x00 0x01 -> 0.01
0x80 0x00 -> 20.48
0x00 0x80 -> 1.28
0x55 0x55 -> 18.45
налаштуванням відображення вказаних вище
variable type (int 2 bytes)
integer digits 2
decimal digits 2
змінив налаштування:
variable type (int 2 bytes)
integer digits 2
decimal digits 1
отримані результати:
0x01 0x00 -> 25.6
0x00 0x01 -> 0.1
0x80 0x00 -> 04.8
0x00 0x80 -> 12.8
0x55 0x55 -> 84.5
таке враження що він отримує число без коми, а потім розтавляє кому так я вказано в налаштуваннях скільки чисел вказувати до та після коми, починаючи з останньої. Тобто якщо отримане число 21845(HEX 0x55 0x55), а вказано що після коми одна цифра, до коми 2 цифри, то він ставить кому так 2184.5 а першу та другу цифру не відображує бо вказано лише 2 відображати.
Звідки ви взяли цю адресу 0x5002 для запису командою 0x82? Там же має бути описаний і формат даних. Наприклад, згідно з цим мануалом, 0x5002 - це взагалі якийсь байт статуса чи то відтворення відео, чи то якоїсь анімації. Навряд чи те, що вам потрібно. Наскільки розумію, ті дисплеї мають купу різних варіантів прошивок, у яких одні й ті ж адреси мають різні призначення.
Уточніть в документації на конкретно вашу версію прошивки, за якою адресою і в якому точно форматі потрібно писати дані для відображення.
процессор T5 версія оболонки T5UIC3.
адреси взяв з китайських відеоуроків по програмуванню(створенню інтерфейса) дисплеїв DWIN
кнопки змінюють по 1 біт за адресою 5001 від 0 до 15(тобта в одній адресі може вмістититись керування 16 кнопок)
в мене наприклад 3
при натисканні кнопки дисплей видає в серіал наступне: 5A A5 06 83 50 01 01 00 01 (натиснута кнопка 1)
приведу список як змінюється дата в залежності від натиснутих кнопок:
1-off 2-off 3-off ->0000
1-on 2-off 3-off ->0001
1-on 2-on 3-off ->0002
1-on 2-on 3-off ->0003
1-off 2-off 3-on ->0004
1-on 2-off 3-on ->0005
1-off 2-on 3-on ->0006
1-on 2-on 3-on ->0007
за документаціє на дисплей
Структура кадру даних
Має наступний формат:
<Frame Header H> <Frame Header L> <Byte Count> <Command> [<Data>] [<CRC H> <CRC L>]
Скорочений запис:
<FHH> <FHL> <BC> <CMD> [<DATA>] [<CRCH> <CRCL>]
• Frame Header/FH - заголовок кадру: визначає початок кадру. Може використовуватись для унікальної ідентифікації кількох LCM на шинах зв'язку.
Значення за промовчанням = 0x5AA5.
• Byte Count/BC - кількість байт: кількість байтів у кадрі! виключаючи заголовок кадру(2байта) і цей байт.
Тобто кількість байт, що розпочинаються з командного байта.
Разом реальна довжина кадру: ByteCount + 3 байти.
• CMD – Команда: визначає команду, яка має бути виконана.
• Data - Дані: корисне навантаження кадру, складається з: адреси, довжини та значень. (0x50 0x00 [адреса] 0х01[довжина] 0хFF 0xFF[значення])
• CRC-16: хеш із 2 байт для виявлення пошкодження цілісності кадрів. Активується через файл CFG.(в моєму випадку вимкнено)
Вибачаюсь. Уточнюю тип данних int 2 байта.
Дисплей DWIN DMT80600L104_02wtz6F
має отримувати данні в вигляді ASCII. останні два байти це данні які треба записати
я пробував записати 0x00 0x22 на виході маю значення 0.22, якщо записати 0x22 0x00 на дисплеї 56.32
Доброго дня, спільното!
попереджаю, я не програміст. керувати реле, діодом, міряти температуру та інше по дрібноті вмію робити, але складні проекти ніколи не робив. Тому на перед прошу вибачення, якщо якусь нісенітницю напишу.
Тепер до справи.
задача: треба міряти температуру, потім це значення передавати на дисплей по serial у вигляді 5A A5 05 82 50 01 00 00
Підкажіть як конвертувати значеня float в HEX і внести в останні 2 значення масиву. взагалі не розумію які операції треба виконати.
#include <microDS18B20.h>
#define DS_PIN 2 // пин для термометров
// Уникальные адреса датчиков - считать можно в примере address_read
uint8_t s1_addr[] = {0x28, 0xFF, 0x6D, 0x56, 0x1E, 0xE1, 0xF8, 0xDD};
MicroDS18B20<DS_PIN, s1_addr> sensor1; // Создаем термометр с адресацией
// Создаем термометр с адресацией
byte Send_ar[8] = {0x5A, 0xA5, 0x05, 0x82, 0x50, 0x02, 0x00, 0x00}; //массив с командой на дисплей
// в номера 6-7 будем записывать значение температуры float в Hex формате
float temp1; //переменная для хранения температуры
void setup() {
Serial.begin(115200); //общение с дисплеем по сериал
}
void loop() {
sensor1.requestTemp(); // Запрашиваем преобразование температуры
delay(1000); // ожидаем результат
temp1 = sensor1.getTemp(); //запись температуры в переменную
delay(1000);
Send_ar[7] = 22;//меняем значение и смотрим на реакцию дисплея
Serial.write(Send_ar,8); // это команда отправки массива
delay(1000);
Send_ar[7] = 01;//меняем значение и смотрим на реакцию дисплея
Serial.write(Send_ar,8); // это команда отправки массива
}
Сторінки 1