diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2104805 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +CC = msp430-gcc +CFLAGS = -Wall -Os +LIBS = -lZStack -lhal + +SRCS = main.c zigbee_comm.c sensors/bme280.c sensors/wind_vane.c sensors/rain_gauge.c sensors/anemometer.c +HEADERS = main.h zigbee_comm.h sensors/bme280.h sensors/wind_vane.h sensors/rain_gauge.h sensors/anemometer.h config.h + +all: main + +main: $(SRCS) $(HEADERS) + $(CC) $(CFLAGS) $(SRCS) $(LIBS) -o main.elf + +clean: + rm -f main.elf diff --git a/README.md b/README.md index 2288c3f..bf9661c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,43 @@ # zigbee_weather_station +firmware for CC2530 + +zigbee weather station using sensors from WH-SP-WS02 + +Overview of Components: + +- BME280: Measures temperature, humidity, and pressure. +- Tipping Bucket: Measures rainfall with each tip corresponding to 0.2794 mm. +- Anemometer: Measures wind speed, with each tip corresponding to 1.492 mph. +- Wind Vane: A resistive sensor with 16 positions that can indicate wind direction. + +Libraries and Tools: +- Z-Stack (Zigbee Stack): The CC2530 uses the Z-Stack firmware for Zigbee. This provides the Zigbee protocol stack and the tools to create Zigbee devices. +- I2C for BME280: You'll need the I2C interface to communicate with the BME280. +- GPIO for Tipping Bucket, Anemometer, and Wind Vane: These sensors can be read using the GPIO pins, either as interrupts or polling. + + + +/project-folder +├── main.c // Main application code +├── main.h // Header file for main +│ +├── zigbee_comm.c // Zigbee communication functions +├── zigbee_comm.h // Header for Zigbee communication functions +│ +├── sensors // Directory for sensor-related files +│ ├── bme280.c // BME280 sensor driver +│ ├── bme280.h // Header for BME280 sensor +│ ├── wind_vane.c // Wind Vane sensor driver +│ ├── wind_vane.h // Header for Wind Vane sensor +│ ├── rain_gauge.c // Rain Gauge sensor driver +│ ├── rain_gauge.h // Header for Rain Gauge sensor +│ └── anemometer.c // Anemometer sensor driver +│ └── anemometer.h // Header for Anemometer sensor +│ +├── config // Configuration settings +│ └── config.h // Configuration file for settings (timing, thresholds, etc.) +│ +└── Makefile // Makefile for compiling the project +│ +└── README.md (Project description and instructions) \ No newline at end of file diff --git a/config.h b/config.h new file mode 100644 index 0000000..93cbcbf --- /dev/null +++ b/config.h @@ -0,0 +1,7 @@ +#ifndef CONFIG_H +#define CONFIG_H + +// Configuration values +#define SENSOR_READ_INTERVAL 60000 // 60 seconds in ms + +#endif // CONFIG_H diff --git a/main.c b/main.c new file mode 100644 index 0000000..a8dae8c --- /dev/null +++ b/main.c @@ -0,0 +1,63 @@ +#include +#include "hal_types.h" +#include "hal_timer.h" +#include "ZComDef.h" +#include "OSAL.h" +#include "ZStack.h" +#include "bme280.h" +#include "wind_vane.h" +#include "rain_gauge.h" +#include "anemometer.h" +#include "zigbee_comm.h" +#include "config.h" + +// Global variables to store sensor data +uint8 zcl_temp_humidity_data[6]; // For temperature, humidity, pressure +uint8 zcl_wind_data[2]; // For wind speed, wind direction + +// Initialize all sensors +void init_sensors() { + BME280_init(); + WindVane_init(); + RainGauge_init(); + Anemometer_init(); +} + +// Read sensor data and store it +void read_sensor_data() { + int32 temperature, humidity, pressure; + BME280_readData(&temperature, &humidity, &pressure); + + // Store BME280 data + zcl_temp_humidity_data[0] = (uint8)(temperature >> 8); + zcl_temp_humidity_data[1] = (uint8)(temperature & 0xFF); + zcl_temp_humidity_data[2] = (uint8)(humidity >> 8); + zcl_temp_humidity_data[3] = (uint8)(humidity & 0xFF); + zcl_temp_humidity_data[4] = (uint8)(pressure >> 8); + zcl_temp_humidity_data[5] = (uint8)(pressure & 0xFF); + + // Read and store wind data + zcl_wind_data[0] = WindVane_read(); // Wind direction + zcl_wind_data[1] = Anemometer_read(); // Wind speed + + // Read rain gauge data + RainGauge_read(); +} + +// Main application loop +void main_loop() { + while (1) { + read_sensor_data(); // Read all sensor data + send_zigbee_data(); // Send collected data over Zigbee + + osal_delay(60000); // Delay for 1 minute (60000ms) + } +} + +int main() { + hal_init(); // Initialize the CC2530 hardware + init_sensors(); // Initialize all sensors + main_loop(); // Enter main loop + + return 0; +} diff --git a/main.h b/main.h new file mode 100644 index 0000000..81441e2 --- /dev/null +++ b/main.h @@ -0,0 +1,12 @@ +#ifndef MAIN_H +#define MAIN_H + +// Function prototypes +void init_sensors(); +void read_sensor_data(); +void main_loop(); + +extern uint8 zcl_temp_humidity_data[6]; // For BME280 data +extern uint8 zcl_wind_data[2]; // For wind data (speed, direction) + +#endif // MAIN_H diff --git a/sensors/anemometer.c b/sensors/anemometer.c new file mode 100644 index 0000000..573f656 --- /dev/null +++ b/sensors/anemometer.c @@ -0,0 +1,12 @@ +#include "anemometer.h" + +// Initialize anemometer (GPIO, interrupts, etc.) +void Anemometer_init() { + // Set up GPIO for anemometer +} + +// Read wind speed (in mph or other units) +uint8 Anemometer_read() { + // Read wind speed value (e.g., 1.492 mph per tip) + return wind_speed; +} diff --git a/sensors/anemometer.h b/sensors/anemometer.h new file mode 100644 index 0000000..d4fcdbc --- /dev/null +++ b/sensors/anemometer.h @@ -0,0 +1,8 @@ +#ifndef ANEMOMETER_H +#define ANEMOMETER_H + +// Function prototypes +void Anemometer_init(); +uint8 Anemometer_read(); + +#endif // ANEMOMETER_H diff --git a/sensors/bme280.c b/sensors/bme280.c new file mode 100644 index 0000000..4ae020a --- /dev/null +++ b/sensors/bme280.c @@ -0,0 +1,11 @@ +#include "bme280.h" + +// Initialize BME280 sensor (I2C setup, etc.) +void BME280_init() { + // Initialize I2C, configure BME280 settings, etc. +} + +// Read data from BME280 sensor (temperature, humidity, pressure) +void BME280_readData(int32* temperature, int32* humidity, int32* pressure) { + // Read temperature, humidity, and pressure data from BME280 via I2C +} diff --git a/sensors/bme280.h b/sensors/bme280.h new file mode 100644 index 0000000..56bf81d --- /dev/null +++ b/sensors/bme280.h @@ -0,0 +1,8 @@ +#ifndef BME280_H +#define BME280_H + +// Function prototypes +void BME280_init(); +void BME280_readData(int32* temperature, int32* humidity, int32* pressure); + +#endif // BME280_H diff --git a/sensors/rain_gauge.c b/sensors/rain_gauge.c new file mode 100644 index 0000000..d46cb61 --- /dev/null +++ b/sensors/rain_gauge.c @@ -0,0 +1,12 @@ +#include "rain_gauge.h" + +// Initialize rain gauge (configure GPIO interrupts or polling) +void RainGauge_init() { + // Set up the GPIO pin for the rain gauge +} + +// Read rain gauge data (check if bucket tipped) +uint8 RainGauge_read() { + // Return rain tip count or trigger status + return rain_tip; +} diff --git a/sensors/rain_gauge.h b/sensors/rain_gauge.h new file mode 100644 index 0000000..23e9a6f --- /dev/null +++ b/sensors/rain_gauge.h @@ -0,0 +1,8 @@ +#ifndef RAIN_GAUGE_H +#define RAIN_GAUGE_H + +// Function prototypes +void RainGauge_init(); +uint8 RainGauge_read(); + +#endif // RAIN_GAUGE_H diff --git a/sensors/wind_vane.c b/sensors/wind_vane.c new file mode 100644 index 0000000..051a052 --- /dev/null +++ b/sensors/wind_vane.c @@ -0,0 +1,12 @@ +#include "wind_vane.h" + +// Initialize the wind vane (configure GPIOs, etc.) +void WindVane_init() { + // Initialize GPIO for wind vane +} + +// Read wind direction (0-15 for 16 positions) +uint8 WindVane_read() { + // Read the wind direction from the wind vane sensor + return wind_direction; +} diff --git a/sensors/wind_vane.h b/sensors/wind_vane.h new file mode 100644 index 0000000..62ef975 --- /dev/null +++ b/sensors/wind_vane.h @@ -0,0 +1,8 @@ +#ifndef WIND_VANE_H +#define WIND_VANE_H + +// Function prototypes +void WindVane_init(); +uint8 WindVane_read(); + +#endif // WIND_VANE_H diff --git a/zigbee_comm.c b/zigbee_comm.c new file mode 100644 index 0000000..76afacf --- /dev/null +++ b/zigbee_comm.c @@ -0,0 +1,13 @@ +#include "zigbee_comm.h" +#include "ZStack.h" + +// Function to send Zigbee data (temperature, humidity, pressure, wind data, rain data) +void send_zigbee_data() { + // Send BME280 data (temperature, humidity, pressure) + ZStack_SendData(zcl_temp_humidity_data, sizeof(zcl_temp_humidity_data)); + + // Send wind data (wind direction, wind speed) + ZStack_SendData(zcl_wind_data, sizeof(zcl_wind_data)); + + // You can also add any other data here (rain data, etc.) +} diff --git a/zigbee_comm.h b/zigbee_comm.h new file mode 100644 index 0000000..fe49435 --- /dev/null +++ b/zigbee_comm.h @@ -0,0 +1,7 @@ +#ifndef ZIGBEE_COMM_H +#define ZIGBEE_COMM_H + +// Function prototypes +void send_zigbee_data(); + +#endif // ZIGBEE_COMM_H