Untitled

 avatar
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