Untitled
unknown
plain_text
a year ago
3.5 kB
8
Indexable
#include <ModbusRTU.h>
#include <Wire.h>
#include <BH1750.h>
#include <I2S.h>
// RS485 - definice pinů
#define RS485_DE_PIN PA8 // Pin pro povolení vysílání (Driver Enable)
#define RS485_RE_PIN PA9 // Pin pro povolení příjmu (Receiver Enable)
#define RS485_TX_PIN PA2 // UART TX pin pro RS485
#define RS485_RX_PIN PA3 // UART RX pin pro RS485
// Definice pinů I2C (pro BH1750)
#define I2C_SCL_PIN PB6 // Pin pro I2C hodinový signál (SCL)
#define I2C_SDA_PIN PB7 // Pin pro I2C datový signál (SDA)
// Definice pinů I2S (pro INMP441)
#define I2S_WS_PIN PB12 // Pin pro Word Select (WS)
#define I2S_SD_PIN PB15 // Pin pro Serial Data (SD)
#define I2S_SCK_PIN PB13 // Pin pro Serial Clock (SCK)
// Definice pinů dalších senzorů
#define PIR_SENSOR_PIN PA7 // Pin pro HC-SR501 PIR senzor
// Objekt Modbus
ModbusRTU mb;
// Objekt světelného senzoru
BH1750 lightMeter;
// Registry
uint16_t deviceAddress = 1; // Výchozí Modbus adresa
uint16_t registerData[10] = {0}; // Příklad: 10 dostupných registrů
// Funkce pro čtení konkrétního registru
bool cbRead(TRegister* reg, uint16_t address, uint16_t* value) {
*value = registerData[address];
return true;
}
// Funkce pro zápis do konkrétního registru (např. změna adresy)
bool cbWrite(TRegister* reg, uint16_t address, uint16_t value) {
if (address == 0) { // Speciální případ: registr pro adresu
deviceAddress = value; // Aktualizace adresy zařízení
mb.slave(deviceAddress); // Nastavení nové adresy v Modbusu
} else {
registerData[address] = value; // Aktualizace dat v registru
}
return true;
}
void setup() {
// Inicializace pinů
pinMode(RS485_DE_PIN, OUTPUT);
pinMode(RS485_RE_PIN, OUTPUT);
pinMode(PIR_SENSOR_PIN, INPUT); // PIR senzor jako vstup
// Povolení přijímače jako výchozího stavu
digitalWrite(RS485_DE_PIN, LOW);
digitalWrite(RS485_RE_PIN, LOW);
// Zahájení sériové komunikace
Serial.begin(9600, SERIAL_8N1); // Pro ladění
Serial2.setPins(RS485_TX_PIN, RS485_RX_PIN); // Nastavení UART pinů pro RS485
Serial2.begin(9600, SERIAL_8N1); // Nastavení přenosové rychlosti RS485
// Inicializace Modbusu jako slave
mb.begin(&Serial2, RS485_DE_PIN);
mb.slave(deviceAddress);
// Inicializace I2C sběrnice (pro BH1750)
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
lightMeter.begin();
// Inicializace I2S sběrnice (pro INMP441)
I2S.begin(I2S_PHILIPS_MODE, 44100, 16); // Philips mód, vzorkovací frekvence 44.1 kHz, 16 bitů
I2S.setPins(I2S_SCK_PIN, I2S_WS_PIN, I2S_SD_PIN);
// Přidání Modbus registrů
mb.addHreg(0, deviceAddress); // Registr pro adresu
for (uint16_t i = 1; i < 10; i++) {
mb.addHreg(i, registerData[i]); // Ostatní registry
}
// Callback funkce pro čtení a zápis
mb.onGet(cbRead);
mb.onSet(cbWrite);
}
void loop() {
// Aktualizace stavu PIR senzoru
registerData[1] = digitalRead(PIR_SENSOR_PIN); // Uložení hodnoty do registru 1
// Aktualizace dat ze světelného senzoru
float lux = lightMeter.readLightLevel();
registerData[2] = lux > 0 ? (uint16_t)lux : 0; // Uložení hodnoty světla (lux) do registru 2
// Aktualizace dat ze zvukového senzoru (INMP441)
int soundLevel = I2S.read(); // Čtení dat ze zvukového senzoru
registerData[3] = soundLevel > 0 ? (uint16_t)soundLevel : 0; // Uložení hodnoty do registru 3
// Zpracování Modbus úloh
mb.task();
delay(10); // Krátké zpoždění pro stabilní běh
}Editor is loading...
Leave a Comment