Untitled
unknown
plain_text
a month ago
3.5 kB
2
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