#include <SPI.h>
#define NSS_PIN 5 // Chip select for SX1278
#define RST_PIN 14 // Reset pin for SX1278
#define MOTION_SENSOR 4 // PIR sensor connected to GPIO 4
// Function to write a value to a SX1278 register
void writeRegister(uint8_t reg, uint8_t value) {
digitalWrite(NSS_PIN, LOW);
SPI.transfer(reg | 0x80); // Set MSB for write
SPI.transfer(value);
digitalWrite(NSS_PIN, HIGH);
}
// Function to read a value from a SX1278 register (if needed)
uint8_t readRegister(uint8_t reg) {
digitalWrite(NSS_PIN, LOW);
SPI.transfer(reg & 0x7F); // Clear MSB for read
uint8_t value = SPI.transfer(0x00);
digitalWrite(NSS_PIN, HIGH);
return value;
}
void setup() {
Serial.begin(115200);
pinMode(MOTION_SENSOR, INPUT_PULLUP);
pinMode(NSS_PIN, OUTPUT);
pinMode(RST_PIN, OUTPUT);
// Ensure NSS is high by default
digitalWrite(NSS_PIN, HIGH);
SPI.begin();
// Reset the SX1278
digitalWrite(RST_PIN, LOW);
delay(100);
digitalWrite(RST_PIN, HIGH);
delay(100);
// Basic SX1278 initialization sequence:
// 1. Put SX1278 in sleep mode with LoRa mode enabled.
writeRegister(0x01, 0x80); // RegOpMode: Sleep mode, LoRa mode bit set
delay(10);
// 2. Switch to Standby mode.
writeRegister(0x01, 0x81); // RegOpMode: Standby mode in LoRa mode
delay(10);
// 3. Set frequency to approximately 433 MHz.
// The frequency is set using registers 0x06, 0x07, 0x08.
// Formula: FRF = Frequency / FSTEP, where FSTEP ≈ 61.035 Hz.
// For 433 MHz, FRF ≈ 433e6 / 61.035 ≈ 7090667.
uint32_t frf = 7090667;
writeRegister(0x06, (uint8_t)((frf >> 16) & 0xFF));
writeRegister(0x07, (uint8_t)((frf >> 8) & 0xFF));
writeRegister(0x08, (uint8_t)(frf & 0xFF));
// Additional settings (power, bandwidth, etc.) would normally be set here.
// For this minimal demo, we leave other registers at their defaults.
Serial.println("SX1278 initialized in LoRa mode.");
}
void loop() {
int motionState = digitalRead(MOTION_SENSOR);
// Prepare a dummy payload:
// '1' if motion detected, '0' otherwise.
uint8_t payload = (motionState == HIGH) ? '1' : '0';
// Write payload to FIFO.
// FIFO register is at address 0x00.
writeRegister(0x00, payload);
// Switch to TX mode.
// In a real implementation you’d configure FIFO pointers and packet parameters.
// For our minimal demo, we simply trigger TX by writing an opmode.
writeRegister(0x01, 0x83); // RegOpMode: TX mode (Standby -> TX, minimal demo)
// Inform via Serial Monitor.
if(motionState == HIGH){
Serial.println("Transmitting: Motion detected");
} else {
Serial.println("Transmitting: No motion detected");
}
delay(1000); // Wait 1 second between transmissions
// Return to Standby mode after transmitting.
writeRegister(0x01, 0x81);
}