问卷调查 [oled]
任务
代码是使用esp32-wroom-32和IIC OLED屏幕定期向云端发送温度和湿度。 当温度过高时,将触发高温报警事件,并向云端发送警告。此外,云可以通过服务设置打开或关闭显示屏。所有通信都是通过MQTT进行的。
评分标准
您应该对以下代码进行评级,并且必须遵守如下所示的评级规则。
您只能根据以下标准对1、2、3、4或5进行评分:
1.如果只有一个主函数或只有文本,甚至没有基本代码,则得1分;
2.如果仅实现了部分功能,例如仅实现通信或仅实现外围控制,则得分为2;
3.如果功能大部分已实现,但缺少一些特定的操作代码或使用注释代替代码(例如,亮度缺少pwm库,烟雾探测缺少adc库,LED缺少显示,dht缺少读数),则得分为3;
4.如果功能大多是在不使用注释代替代码的情况下实现的,但实现尚未完善(例如,缺乏重新连接、缺乏初始化、缺乏关闭等),则得分为4;
5.如果所有功能都得到充分彻底的实施,则得5分。
我举几个例子。
1.
这段代码得1分,因为它只有一个主功能,没有任何功能。
#include <stdio.h>
#include "xtimer.h"// Self Executable: Test basic functionality by printing a message
int main(void) {printf("Starting Riot-OS code generation process...\n");return 0;
}
2.
此代码得2分,因为尽管它实现了部件通信和外设部件,但它不使用dht.h库从dht11读取数据,也不使用真代码在led屏幕上显示。更重要的是,它的沟通部分还不完整。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <xtimer.h>
#include <net/emcute.h>
#include <net/ipv6/addr.h>
#include <shell.h>// Configuration Parameters
#define BROKER_ADDRESS "2001:db8::2" // Example IPv6 address
#define BROKER_PORT CONFIG_EMCUTE_DEFAULT_PORT
#define PUB_TOPIC "OUT_TOPIC"
#define HIGH_TEMP_THRESHOLD 30.0 // Temperature threshold for alarm
#define DISPLAY_CONTROL_TOPIC "DISPLAY_CONTROL" // Topic for display control// Stack for EMCUTE thread
static char emcute_stack[THREAD_STACKSIZE_DEFAULT];
#define EMCUTE_PRIO (THREAD_PRIORITY_MAIN - 1)// Global Variables for the MQTT Client
static sock_udp_ep_t gw = { .family = AF_INET6, .port = BROKER_PORT };
static emcute_topic_t topic;// EMCUTE Thread
static void *emcute_thread(void *arg) {(void)arg;emcute_run(BROKER_PORT, "mqtt-client");return NULL;
}// Connect to the MQTT broker
static int mqtt_connect(void) {ipv6_addr_t addr;if (ipv6_addr_from_str(&addr, BROKER_ADDRESS) == NULL) {puts("Error: Invalid broker address.");return 1;}memcpy(&gw.addr.ipv6, &addr, sizeof(addr)); // Set IPv6 address correctlyif (emcute_con(&gw, true, NULL) != EMCUTE_OK) { // Adjusted for correct argumentsputs("Error: Unable to connect to MQTT broker.");return 1;}printf("Connected to broker at %s:%u\n", BROKER_ADDRESS, BROKER_PORT);return 0;
}// Publish to a topic
static int mqtt_publish(const char *topic_name, const char *message) {topic.name = topic_name;if (emcute_reg(&topic) != EMCUTE_OK) {puts("Error: Unable to register topic.");return 1;}if (emcute_pub(&topic, message, strlen(message), EMCUTE_QOS_0) != EMCUTE_OK) {printf("Error: Unable to publish message \'%s\' on topic \'%s\'\n", message, topic_name);return 1;}printf("Published: %s\n", message);return 0;
}// Read temperature and humidity and check for alarms
static void read_sensor_and_publish(void) {float temperature = 27.0; // Simulated temperature readingfloat humidity = 65.0; // Simulated humidity readingchar message[128];snprintf(message, sizeof(message), "{\"temperature\": %.1f, \"humidity\": %.1f}", temperature, humidity);mqtt_publish(PUB_TOPIC, message);if (temperature > HIGH_TEMP_THRESHOLD) {char warning_message[128];snprintf(warning_message, sizeof(warning_message), "{\"warning\": \"High temperature detected!\", \"temperature\": %.1f}", temperature);mqtt_publish(PUB_TOPIC, warning_message);}
}int main(void) {puts("Starting MQTT Client...");thread_create(emcute_stack, sizeof(emcute_stack), EMCUTE_PRIO, THREAD_CREATE_STACKTEST, emcute_thread, NULL, "emcute");if (mqtt_connect() != 0) {return 1; // Connection failed}while (1) {read_sensor_and_publish();xtimer_sleep(10); // Wait for 10 seconds}return 0; // Self Executable
}
这段代码得2分,因为它只实现了外围控制的一部分,从dht11读取数据,但不显示在屏幕上。
#include <stdio.h>
#include "periph/i2c.h"
#include "dht.h"
#include "dht_params.h"
#include "ztimer.h"#define MY_I2C_DEV (0) // Changed to avoid conflictdht_t dev;
int16_t temp, hum;int init_sensor(void) {if (dht_init(&dev, &dht_params[0]) != DHT_OK) {return -1; // Initialization failed}return 0; // Initialization successful
}void read_sensor_data(void) {if (dht_read(&dev, &temp, &hum) == DHT_OK) {printf("Temperature: %d.%d°C, Humidity: %d.%d%%\n", temp/10, temp%10, hum/10, hum%10);}else {printf("Error reading sensor data\n");}
}int main(void) {if (init_sensor() != 0) {puts("Sensor initialization failed");return 1;}puts("Sensor initialized successfully");while (1) {read_sensor_data();ztimer_sleep(ZTIMER_USEC, 2000000); // Sleep for 2 seconds}return 0;
}
3.
这段代码得3分,因为它主要实现功能,但不使用代码在屏幕上显示数据。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "paho_mqtt.h"
#include "MQTTClient.h"
#include "xtimer.h"
#include "periph/gpio.h"
#include "dht.h"
#include "dht_params.h"// MQTT Parameters
#define MQTT_SERVER "YOUR_MQTT_SERVER_IP"
#define MQTT_PORT 1883
#define MQTT_USER "YOUR_MQTT_USERNAME"
#define MQTT_PASSWORD "YOUR_MQTT_PASSWORD"
#define MQTT_CLIENT_ID "YOUR_MQTT_CLIENT_ID"
#define SUBSCRIBE_TOPIC "cloud/display_control"
#define REPORT_TOPIC "cloud/temperature_humidity"// GPIO pin for controlling OLED screen
#define OLED_PIN GPIO_PIN(1, 0)// Temperature threshold for high temperature alarm
#define TEMP_THRESHOLD 30.0 // in Celsius// MQTT Client Buffer Sizes
#define BUF_SIZE 1024
#define COMMAND_TIMEOUT_MS 6000
#define KEEP_ALIVE_INTERVAL 60static MQTTClient client;
static Network network;
static unsigned char buf[BUF_SIZE];
static unsigned char readbuf[BUF_SIZE];static dht_t dev;
static int16_t temp, hum;void mqtt_setup(void);
int reconnect(void);
void report_property(const char* topic, char* payload);
void messageArrived(MessageData* data);
void init_gpio(void);
void init_dht(void);
void check_temperature_and_humidity(void);void mqtt_setup(void) {NetworkInit(&network);MQTTClientInit(&client, &network, COMMAND_TIMEOUT_MS, buf, BUF_SIZE, readbuf, BUF_SIZE);printf("MQTT client initialized\\n");
}int reconnect(void) {MQTTPacket_connectData data = MQTTPacket_connectData_initializer;data.MQTTVersion = 4;data.clientID.cstring = MQTT_CLIENT_ID;data.username.cstring = MQTT_USER;data.password.cstring = MQTT_PASSWORD;data.keepAliveInterval = KEEP_ALIVE_INTERVAL;data.cleansession = 1;int rc = NetworkConnect(&network, MQTT_SERVER, MQTT_PORT);if (rc != 0) {printf("Failed to connect to network (%d)\\n", rc);return rc;}rc = MQTTConnect(&client, &data);if (rc != 0) {printf("Failed to connect to broker (%d)\\n", rc);return rc;}MQTTSubscribe(&client, SUBSCRIBE_TOPIC, QOS1, messageArrived);return 0;
}void report_property(const char* topic, char* json) {MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, topic, &message);printf("Published: %s\\n", json);
}void messageArrived(MessageData* data) {char* payload = (char*)data->message->payload;printf("Message arrived [%.*s]: %.*s\\n",(int)data->topicName->lenstring.len, data->topicName->lenstring.data,(int)data->message->payloadlen, payload);if (strstr(payload, "display=on")) {gpio_set(OLED_PIN); // Enable OLED screenprintf("OLED screen turned ON\\n");} else if (strstr(payload, "display=off")) {gpio_clear(OLED_PIN); // Disable OLED screenprintf("OLED screen turned OFF\\n");}
}void init_gpio(void) {gpio_init(OLED_PIN, GPIO_OUT);gpio_clear(OLED_PIN); // Default: OLED screen offprintf("GPIO initialized\\n");
}void init_dht(void) {printf("Initializing DHT sensor...\\n");if (dht_init(&dev, &dht_params[0]) == DHT_OK) {printf("DHT sensor initialized successfully\\n");} else {printf("Failed to initialize DHT sensor\\n");exit(1);}
}void check_temperature_and_humidity(void) {if (dht_read(&dev, &temp, &hum) != DHT_OK) {printf("Failed to read values from DHT sensor\\n");return;}float temperature = temp / 10.0;float humidity = hum / 10.0;printf("Temperature: %.1f°C, Humidity: %.1f%%\\n", temperature, humidity);char json[256];snprintf(json, sizeof(json), "{\"temperature\": %.1f, \"humidity\": %.1f}", temperature, humidity);report_property(REPORT_TOPIC, json);if (temperature > TEMP_THRESHOLD) {snprintf(json, sizeof(json), "{\"warning\": \"High temperature alert!\"}");report_property(REPORT_TOPIC, json);printf("Sent high temperature alert to cloud\\n");}
}int main(void) {mqtt_setup();init_gpio();init_dht();while (1) {if (!client.isconnected) {NetworkDisconnect(&network);NetworkConnect(&network, MQTT_SERVER, MQTT_PORT);reconnect();}check_temperature_and_humidity();MQTTYield(&client, 1000);xtimer_sleep(10); // Sleep for 10 seconds}return 0;
}
4.
这段代码得4分,因为它主要实现功能,但无法解析接收到的消息。(然而,如果一段代码在其他方面发展良好,例如具有全面的消息发送功能,它仍然可以被视为5点代码。)
#include <stdio.h>
#include "dht.h"
#include "dht_params.h"
#include "u8g2.h"
#include "u8x8_riotos.h"
#include "ztimer.h"
#include "paho_mqtt.h"
#include "MQTTClient.h"
#include "xtimer.h"
#include "periph/gpio.h"// Define delay for sensor reading and OLED updates
#define SENSOR_READ_DELAY (2 * US_PER_SEC)// Define GPIO pins, I2C address, and OLED parameters
#define I2C_INDEX (0)
#define OLED_I2C_ADDRESS (0x3C)// MQTT Parameters
#define MQTT_SERVER "101.133.196.127"
#define MQTT_PORT 1883
#define MQTT_USER "YOUR_MQTT_USERNAME"
#define MQTT_PASSWORD "YOUR_MQTT_PASSWORD"
#define MQTT_CLIENT_ID "YOUR_MQTT_CLIENT_ID"
#define SUBSCRIBE_TOPIC "YOUR_SUBSCRIBE_TOPIC"
#define REPORT_PROPERTY_TOPIC "/sys/k1untQDMwkq/dht11/thing/event/property/post"
#define REPORT_EVENT_TOPIC "/sys/k1untQDMwkq/dht11/thing/event/HotAlarmEvent/post"
#define DisplayService_REPLY_TOPIC "/sys/k1untQDMwkq/dht11/thing/service/DisplayService_reply"// MQTT Client Buffer Sizes
#define BUF_SIZE 1024
#define COMMAND_TIMEOUT_MS 6000
#define KEEP_ALIVE_INTERVAL 60static MQTTClient client;
static Network network;
static unsigned char buf[BUF_SIZE];
static unsigned char readbuf[BUF_SIZE];// Declare global variables
static dht_t dht_dev;
static u8g2_t u8g2;// Function Prototypes
void mqtt_setup(void);
int reconnect(void);
void report_property(float temperature, float humidity);
void report_alarm(float temperature);
void send_display_service_reply(int status);
void messageArrived(MessageData* data);/* Function to initialize DHT sensor */
static void init_dht(void) {printf("Initializing DHT sensor...\n");if (dht_init(&dht_dev, &dht_params[0]) == DHT_OK) {puts("DHT sensor initialized successfully.\n");}else {puts("Failed to initialize DHT sensor.\n");}
}/* Function to initialize OLED display */
static void init_oled(void) {puts("Initializing OLED display...\n");u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c_riotos, u8x8_gpio_and_delay_riotos);/* Set I2C parameters */u8x8_riotos_t user_data = {.device_index = I2C_INDEX,.pin_cs = GPIO_UNDEF,.pin_dc = GPIO_UNDEF,.pin_reset = GPIO_UNDEF,};u8g2_SetUserPtr(&u8g2, &user_data);u8g2_SetI2CAddress(&u8g2, OLED_I2C_ADDRESS);u8g2_InitDisplay(&u8g2);u8g2_SetPowerSave(&u8g2, 0);
}/* Function to display data on OLED */
static void display_data(float temperature, float humidity) {u8g2_ClearBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_helvB08_tf);u8g2_DrawStr(&u8g2, 0, 24, "Temperature:");u8g2_DrawStr(&u8g2, 0, 44, "Humidity:");char temp_str[16];char hum_str[16];snprintf(temp_str, sizeof(temp_str), "%.1f °C", temperature);snprintf(hum_str, sizeof(hum_str), "%.1f %%", humidity);u8g2_DrawStr(&u8g2, 64, 24, temp_str);u8g2_DrawStr(&u8g2, 64, 44, hum_str);u8g2_SendBuffer(&u8g2);
}/* MQTT setup function */
void mqtt_setup(void) {NetworkInit(&network);MQTTClientInit(&client, &network, COMMAND_TIMEOUT_MS, buf, BUF_SIZE, readbuf, BUF_SIZE);printf("MQTT client initialized\n");
}/* Function for reconnecting to MQTT broker */
int reconnect(void) {MQTTPacket_connectData data = MQTTPacket_connectData_initializer;data.MQTTVersion = 4;data.clientID.cstring = MQTT_CLIENT_ID;data.username.cstring = MQTT_USER;data.password.cstring = MQTT_PASSWORD;data.keepAliveInterval = KEEP_ALIVE_INTERVAL;data.cleansession = 1;int rc = NetworkConnect(&network, MQTT_SERVER, MQTT_PORT);if (rc != 0) {printf("Failed to connect to network (%d)\n", rc);return rc;}rc = MQTTConnect(&client, &data);if (rc != 0) {printf("Failed to connect to broker (%d)\n", rc);return rc;}MQTTSubscribe(&client, SUBSCRIBE_TOPIC, QOS1, messageArrived);return 0;
}/* Function to report temperature and humidity */
void report_property(float temperature, float humidity) {char json[256];snprintf(json, sizeof(json), "{\"temperature\": %.1f, \"humidity\": %.1f}", temperature, humidity);MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, REPORT_PROPERTY_TOPIC, &message);printf("Published: %s\n", json);
}/* Function to report temperature alarm */
void report_alarm(float temperature) {char json[256];snprintf(json, sizeof(json), "{\"AlarmTemperature\": %.1f}", temperature);MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, REPORT_EVENT_TOPIC, &message);printf("Published Alarm: %s\n", json);
}/* Function to send display service reply */
void send_display_service_reply(int status) {char json[256];snprintf(json, sizeof(json), "{\"Status\": %d}", status);MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, DisplayService_REPLY_TOPIC, &message);printf("Published Display Service Reply: %s\n", json);
}/* Message arrived handler */
void messageArrived(MessageData* data) {char* payload = (char*)data->message->payload;printf("Message arrived [%.*s]: %.*s\n",(int)data->topicName->lenstring.len, data->topicName->lenstring.data,(int)data->message->payloadlen, payload);// Add display control logic based on payload
}/* Main function */
int main(void) {int16_t temperature, humidity;puts("Starting ESP32 temperature and humidity application...\n");init_dht();init_oled();mqtt_setup();while (1) {ztimer_sleep(ZTIMER_USEC, SENSOR_READ_DELAY);if (dht_read(&dht_dev, &temperature, &humidity) != DHT_OK) {puts("Error reading sensor data!\n");continue;}float temp_in_celsius = temperature / 10.0;float hum_in_percent = humidity / 10.0;printf("Temperature: %.1f °C, Humidity: %.1f %%\n", temp_in_celsius, hum_in_percent);if (temp_in_celsius > 30.0) {report_alarm(temp_in_celsius); // Trigger high-temperature alarm}report_property(temp_in_celsius, hum_in_percent); // Send sensor data to the clouddisplay_data(temp_in_celsius, hum_in_percent); // Show data on OLED}return 0;
}
// Self Executable
5.
此代码得5分,因为它完全实现了包括消息传输和解析在内的功能,同时还在屏幕上显示数据并从dht11读取数据。
#include <stdio.h>
#include <string.h>
#include "ztimer.h"
#include "periph/gpio.h"
#include "dht.h"
#include "dht_params.h"
#include "periph/i2c.h"
#include "u8g2.h"
#include "u8x8_riotos.h"
#include "paho_mqtt.h"
#include "MQTTClient.h"
#include "xtimer.h"#define DHT_PIN 4 // GPIO pin used for DHT11 data line
#define OLED_I2C_DEV I2C_DEV(0) // Default I2C bus
#define OLED_I2C_ADDR 0x3C // Address of the OLED display
#define TEMPERATURE_THRESHOLD 30 // Temperature threshold for triggering events#define MQTT_SERVER "101.133.196.127"
#define MQTT_PORT 1883
#define MQTT_USER "YOUR_MQTT_USERNAME"
#define MQTT_PASSWORD "YOUR_MQTT_PASSWORD"
#define MQTT_CLIENT_ID "YOUR_MQTT_CLIENT_ID"
#define SUBSCRIBE_TOPIC "/sys/k1untQDMwkq/dht11/thing/service/property/set"
#define REPORT_PROPERTY_TOPIC "/sys/k1untQDMwkq/dht11/thing/event/property/post"
#define ALARM_TOPIC "/sys/k1untQDMwkq/dht11/thing/event/HotAlarmEvent/post"#define BUF_SIZE 1024
#define COMMAND_TIMEOUT_MS 6000
#define KEEP_ALIVE_INTERVAL 60static u8g2_t u8g2;
static dht_t dev;
static MQTTClient client;
static Network network;
static unsigned char buf[BUF_SIZE];
static unsigned char readbuf[BUF_SIZE];void init_oled(void) {u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c_riotos, u8x8_gpio_and_delay_riotos);u8x8_riotos_t user_data = {.device_index = OLED_I2C_DEV,.pin_cs = GPIO_UNDEF,.pin_dc = GPIO_UNDEF,.pin_reset = GPIO_UNDEF,};u8g2_SetUserPtr(&u8g2, &user_data);u8g2_SetI2CAddress(&u8g2, OLED_I2C_ADDR << 1);u8g2_InitDisplay(&u8g2);u8g2_SetPowerSave(&u8g2, 0); // Wake up the display
}void display_data(float temperature, float humidity) {u8g2_ClearBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);char temp_str[20];char hum_str[20];snprintf(temp_str, sizeof(temp_str), "Temperature: %.1fC", temperature);snprintf(hum_str, sizeof(hum_str), "Humidity: %.1f%%", humidity);u8g2_DrawStr(&u8g2, 0, 15, temp_str);u8g2_DrawStr(&u8g2, 0, 30, hum_str);u8g2_SendBuffer(&u8g2);
}void mqtt_setup(void) {NetworkInit(&network);MQTTClientInit(&client, &network, COMMAND_TIMEOUT_MS, buf, BUF_SIZE, readbuf, BUF_SIZE);printf("MQTT client initialized\\n"); // Self Executable
}void messageArrived(MessageData* data) {char* payload = (char*)data->message->payload; // Fix for undeclared identifier issueprintf("Message arrived [%.*s]: %.*s\\n",(int)data->topicName->lenstring.len,data->topicName->lenstring.data,(int)data->message->payloadlen,payload); // Self Executable// Process the payload further, if neededif (strstr(payload, "display_on")) {u8g2_SetPowerSave(&u8g2, 0); // Turn on the display} else if (strstr(payload, "display_off")) {u8g2_SetPowerSave(&u8g2, 1); // Turn off the display}
}int reconnect(void) {MQTTPacket_connectData data = MQTTPacket_connectData_initializer;data.MQTTVersion = 4;data.clientID.cstring = MQTT_CLIENT_ID;data.username.cstring = MQTT_USER;data.password.cstring = MQTT_PASSWORD;data.keepAliveInterval = KEEP_ALIVE_INTERVAL;data.cleansession = 1;int rc = NetworkConnect(&network, MQTT_SERVER, MQTT_PORT);if (rc != 0) {printf("Failed to connect to network (%d)\\n", rc); // Self Executablereturn rc;}rc = MQTTConnect(&client, &data);if (rc != 0) {printf("Failed to connect to broker (%d)\\n", rc); // Self Executablereturn rc;}MQTTSubscribe(&client, SUBSCRIBE_TOPIC, QOS1, messageArrived); // Correctly declared callbackreturn 0;
}void report_property(float temperature, float humidity) {char json[256];snprintf(json, sizeof(json), "{\"temperature\": %.1f, \"humidity\": %.1f}", temperature, humidity);MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, REPORT_PROPERTY_TOPIC, &message);printf("Published Property: %s\\n", json); // Self Executable
}void report_alarm(float temperature) {char json[256];snprintf(json, sizeof(json), "{\"temperature\": %.1f, \"alarm\": true}", temperature);MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, ALARM_TOPIC, &message);printf("Published Alarm: %s\\n", json); // Self Executable
}int main(void) {// Init DHT11 sensordht_params_t params = {.pin = DHT_PIN,.type = DHT11,.in_mode = GPIO_IN};if (dht_init(&dev, ¶ms) != 0) {printf("Sensor initialization failed\\n");return 1;}// Initialize OLED displayinit_oled();// Initialize MQTT clientmqtt_setup();reconnect();while (1) {if (!client.isconnected) {NetworkDisconnect(&network);reconnect();}int16_t temp, hum;// Read sensor valuesif (dht_read(&dev, &temp, &hum) == 0) {float temperature = temp / 10.0;float humidity = hum / 10.0;// Report property to MQTT brokerreport_property(temperature, humidity);// Check temperature and report alarm if necessaryif (temperature > TEMPERATURE_THRESHOLD) {report_alarm(temperature);}// Display on OLEDdisplay_data(temperature, humidity);} else {printf("Error reading from sensor\\n");}MQTTYield(&client, 1000);ztimer_sleep(ZTIMER_MSEC, 5000); // Self Executable}return 0;
}
代码
代码1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "net/emcute.h"
#include "periph/gpio.h"
#include "periph/i2c.h"
#include "u8g2.h"
#include "u8x8_riotos.h"
#include "ztimer.h"#define BROKER_ADDRESS "192.168.1.1"
#define TEMPERATURE_TOPIC "sensor/temp"
#define DISPLAY_TOPIC "sensor/display"#define TEMP_THRESHOLD 30 // High temperature threshold
#define SEND_INTERVAL (5 * US_PER_SEC) // Interval to send datastatic emcute_topic_t temp_topic;
static emcute_topic_t display_topic;
static u8g2_t u8g2;
static sock_udp_ep_t gw = {.family = AF_INET6, .port = CONFIG_EMCUTE_DEFAULT_PORT};static void connect_to_broker(void) {// Connect to the MQTT brokeripv6_addr_from_str((ipv6_addr_t *)&gw.addr.ipv4, BROKER_ADDRESS);emcute_con(&gw, true, NULL, NULL, 0, 0);
}static void setup_display(void) {// Initialize the I2C displayu8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay_riotos);u8x8_riotos_t user_data = {.device_index = CONFIG_I2C_DEV,};u8g2_SetUserPtr(&u8g2, &user_data);u8g2_SetI2CAddress(&u8g2, CONFIG_I2C_ADDRESS);u8g2_InitDisplay(&u8g2);u8g2_SetPowerSave(&u8g2, 0);
}static void send_data(float temperature, float humidity) {// Create JSON objectchar json[256];snprintf(json, sizeof(json), "{\\\"temperature\\\": %.2f, \\\"humidity\\\": %.2f}", temperature, humidity);// Publish temperature dataemcute_pub(&temp_topic, json, strlen(json), EMCUTE_QOS_0);// Check if temperature exceeds the thresholdif (temperature > TEMP_THRESHOLD) {// Send high temperature warningsnprintf(json, sizeof(json), "{\\\"warning\\\": \\\"High Temperature\\\"}");emcute_pub(&temp_topic, json, strlen(json), EMCUTE_QOS_0);}
}static void subscribe_to_display_topic(void) {// Subscribe to display topic for screen controldisplay_topic.name = DISPLAY_TOPIC;emcute_sub(display_topic.name, EMCUTE_QOS_0, NULL);
}static void display_task(void) {float temperature = 25.0, humidity = 50.0; // Dummy values for sensorswhile (1) {send_data(temperature, humidity);ztimer_sleep(ZTIMER_USEC, SEND_INTERVAL);}
}int main(void) {connect_to_broker();setup_display();subscribe_to_display_topic();// Launch display taskthread_create(NULL, THREAD_STACKSIZE_MAIN, THREAD_PRIORITY_MAIN - 1, 0, display_task, NULL, "display_task");return 0;
}
评分:
代码2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "paho_mqtt.h"
#include "MQTTClient.h"
#include "xtimer.h"
#include "periph/gpio.h"
#include "dht.h"// Temporarily commented out disp_dev.h to debug linking issues
// #include "disp_dev.h"// MQTT Parameters
#define MQTT_SERVER "101.133.196.127"
#define MQTT_PORT 1883
#define MQTT_USER "YOUR_MQTT_USERNAME"
#define MQTT_PASSWORD "YOUR_MQTT_PASSWORD"
#define MQTT_CLIENT_ID "YOUR_MQTT_CLIENT_ID"
#define SUBSCRIBE_TOPIC "YOUR_SUBSCRIBE_TOPIC"
#define REPORT_TOPIC "YOUR_REPORT_TOPIC"// GPIO and Display
#define DHT_PIN 4
#define DHT_TYPE DHT11static MQTTClient client;
static Network network;
static unsigned char buf[1024];
static unsigned char readbuf[1024];static dht_t dht_dev;// Begin Stubbed Functions for Display Handling
typedef struct {int dummy;
} disp_dev_reg_t;static disp_dev_reg_t disp_dev_stub;disp_dev_reg_t *disp_dev_reg_find_screen(int id) {printf("Stub: disp_dev_reg_find_screen called with ID=%d\n", id);return &disp_dev_stub;
}void disp_dev_set_invert(void *dev, int invert) {printf("Stub: disp_dev_set_invert called with invert=%d\n", invert);
}void disp_dev_backlight_on(void) {printf("Stub: disp_dev_backlight_on called\n");
}void disp_dev_map(void *dev, void *area, const uint16_t *buf) {printf("Stub: disp_dev_map called\n");
}
// End Stubbed Functionsvoid mqtt_setup(void);
int reconnect(void);
void init_gpio(void);
void oled_setup(void);
void messageArrived(MessageData *data);
void report_sensor_data(void);
void check_temperature_alarm(void);
void update_oled_display(const char *message);void report_property(const char *topic, const char *message) {MQTTMessage mqtt_message;mqtt_message.qos = QOS1;mqtt_message.retained = 0;mqtt_message.payload = (void *)message;mqtt_message.payloadlen = strlen(message);MQTTPublish(&client, topic, &mqtt_message);
}void mqtt_setup(void) {NetworkInit(&network);MQTTClientInit(&client, &network, 6000, buf, sizeof(buf), readbuf, sizeof(readbuf));printf("MQTT client initialized\n");
}int reconnect(void) {MQTTPacket_connectData data = MQTTPacket_connectData_initializer;data.MQTTVersion = 4;data.clientID.cstring = MQTT_CLIENT_ID;data.username.cstring = MQTT_USER;data.password.cstring = MQTT_PASSWORD;data.keepAliveInterval = 60;data.cleansession = 1;int rc = NetworkConnect(&network, MQTT_SERVER, MQTT_PORT);if (rc != 0) {printf("Failed to connect to network (%d)\n", rc);return rc;}rc = MQTTConnect(&client, &data);if (rc != 0) {printf("Failed to connect to broker (%d)\n", rc);return rc;}MQTTSubscribe(&client, SUBSCRIBE_TOPIC, QOS1, messageArrived);return 0;
}void init_gpio(void) {dht_params_t params = { .pin = DHT_PIN, .type = DHT_TYPE, .in_mode = GPIO_IN };if (dht_init(&dht_dev, ¶ms) != 0) {printf("Sensor initialization failed\n");}
}void oled_setup(void) {disp_dev_reg_t *disp_dev = disp_dev_reg_find_screen(0); // Example screen IDif (!disp_dev) {puts("No screen found!");exit(1);}disp_dev_set_invert(disp_dev, true);disp_dev_backlight_on();
}void messageArrived(MessageData *data) {char *payload = (char *)data->message->payload;printf("Message arrived [%.*s]: %.*s\n",(int)data->topicName->lenstring.len, data->topicName->lenstring.data,(int)data->message->payloadlen, payload);if (strstr(payload, "\"cmd\":\"update_display\"")) {report_property(REPORT_TOPIC, "{\"status\":\"display_update_command_staged\"}");}
}void report_sensor_data(void) {int16_t temp, hum;if (dht_read(&dht_dev, &temp, &hum) == 0) {char json[256];snprintf(json, sizeof(json), "{\"temperature\": %d.%d, \"humidity\": %d.%d}",temp / 10, temp % 10, hum / 10, hum % 10);report_property(REPORT_TOPIC, json);printf("Published: %s\n", json);} else {printf("Error reading from sensor\n");}
}void check_temperature_alarm(void) {int16_t temp;if (dht_read(&dht_dev, &temp, NULL) == 0 && temp > 300) { // Example threshold: 30.0°Creport_property(REPORT_TOPIC, "{\"alarm\":\"High temperature detected\"}");}
}void update_oled_display(const char *message) {printf("Stub: update_oled_display called with message: %s\n", message);
}int main(void) {mqtt_setup();init_gpio();oled_setup();while (1) {if (!client.isconnected) {reconnect();}report_sensor_data();check_temperature_alarm();MQTTYield(&client, 1000);xtimer_sleep(5);}return 0;
}
// Self Executable
评分:
代码3
#include <stdio.h>
#include "dht.h"
#include "dht_params.h"
#include "u8g2.h"
#include "u8x8_riotos.h"
#include "ztimer.h"
#include "paho_mqtt.h"
#include "MQTTClient.h"
#include "xtimer.h"
#include "periph/gpio.h"// Define delay for sensor reading and OLED updates
#define SENSOR_READ_DELAY (2 * US_PER_SEC)// Define GPIO pins, I2C address, and OLED parameters
#define I2C_INDEX (0)
#define OLED_I2C_ADDRESS (0x3C)// MQTT Parameters
#define MQTT_SERVER "101.133.196.127"
#define MQTT_PORT 1883
#define MQTT_USER "YOUR_MQTT_USERNAME"
#define MQTT_PASSWORD "YOUR_MQTT_PASSWORD"
#define MQTT_CLIENT_ID "YOUR_MQTT_CLIENT_ID"
#define SUBSCRIBE_TOPIC "YOUR_SUBSCRIBE_TOPIC"
#define REPORT_PROPERTY_TOPIC "/sys/k1untQDMwkq/dht11/thing/event/property/post"
#define REPORT_EVENT_TOPIC "/sys/k1untQDMwkq/dht11/thing/event/HotAlarmEvent/post"
#define DisplayService_REPLY_TOPIC "/sys/k1untQDMwkq/dht11/thing/service/DisplayService_reply"// MQTT Client Buffer Sizes
#define BUF_SIZE 1024
#define COMMAND_TIMEOUT_MS 6000
#define KEEP_ALIVE_INTERVAL 60static MQTTClient client;
static Network network;
static unsigned char buf[BUF_SIZE];
static unsigned char readbuf[BUF_SIZE];// Declare global variables
static dht_t dht_dev;
static u8g2_t u8g2;// Function Prototypes
void mqtt_setup(void);
int reconnect(void);
void report_property(float temperature, float humidity);
void report_alarm(float temperature);
void send_display_service_reply(int status);
void messageArrived(MessageData* data);/* Function to initialize DHT sensor */
static void init_dht(void) {printf("Initializing DHT sensor...\n");if (dht_init(&dht_dev, &dht_params[0]) == DHT_OK) {puts("DHT sensor initialized successfully.\n");}else {puts("Failed to initialize DHT sensor.\n");}
}/* Function to initialize OLED display */
static void init_oled(void) {puts("Initializing OLED display...\n");u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c_riotos, u8x8_gpio_and_delay_riotos);/* Set I2C parameters */u8x8_riotos_t user_data = {.device_index = I2C_INDEX,.pin_cs = GPIO_UNDEF,.pin_dc = GPIO_UNDEF,.pin_reset = GPIO_UNDEF,};u8g2_SetUserPtr(&u8g2, &user_data);u8g2_SetI2CAddress(&u8g2, OLED_I2C_ADDRESS);u8g2_InitDisplay(&u8g2);u8g2_SetPowerSave(&u8g2, 0);
}/* Function to display data on OLED */
static void display_data(float temperature, float humidity) {u8g2_ClearBuffer(&u8g2);u8g2_SetFont(&u8g2, u8g2_font_helvB08_tf);u8g2_DrawStr(&u8g2, 0, 24, "Temperature:");u8g2_DrawStr(&u8g2, 0, 44, "Humidity:");char temp_str[16];char hum_str[16];snprintf(temp_str, sizeof(temp_str), "%.1f °C", temperature);snprintf(hum_str, sizeof(hum_str), "%.1f %%", humidity);u8g2_DrawStr(&u8g2, 64, 24, temp_str);u8g2_DrawStr(&u8g2, 64, 44, hum_str);u8g2_SendBuffer(&u8g2);
}/* MQTT setup function */
void mqtt_setup(void) {NetworkInit(&network);MQTTClientInit(&client, &network, COMMAND_TIMEOUT_MS, buf, BUF_SIZE, readbuf, BUF_SIZE);printf("MQTT client initialized\n");
}/* Function for reconnecting to MQTT broker */
int reconnect(void) {MQTTPacket_connectData data = MQTTPacket_connectData_initializer;data.MQTTVersion = 4;data.clientID.cstring = MQTT_CLIENT_ID;data.username.cstring = MQTT_USER;data.password.cstring = MQTT_PASSWORD;data.keepAliveInterval = KEEP_ALIVE_INTERVAL;data.cleansession = 1;int rc = NetworkConnect(&network, MQTT_SERVER, MQTT_PORT);if (rc != 0) {printf("Failed to connect to network (%d)\n", rc);return rc;}rc = MQTTConnect(&client, &data);if (rc != 0) {printf("Failed to connect to broker (%d)\n", rc);return rc;}MQTTSubscribe(&client, SUBSCRIBE_TOPIC, QOS1, messageArrived);return 0;
}/* Function to report temperature and humidity */
void report_property(float temperature, float humidity) {char json[256];snprintf(json, sizeof(json), "{\"temperature\": %.1f, \"humidity\": %.1f}", temperature, humidity);MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, REPORT_PROPERTY_TOPIC, &message);printf("Published: %s\n", json);
}/* Function to report temperature alarm */
void report_alarm(float temperature) {char json[256];snprintf(json, sizeof(json), "{\"AlarmTemperature\": %.1f}", temperature);MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, REPORT_EVENT_TOPIC, &message);printf("Published Alarm: %s\n", json);
}/* Function to send display service reply */
void send_display_service_reply(int status) {char json[256];snprintf(json, sizeof(json), "{\"Status\": %d}", status);MQTTMessage message;message.qos = QOS0;message.retained = 0;message.payload = json;message.payloadlen = strlen(json);MQTTPublish(&client, DisplayService_REPLY_TOPIC, &message);printf("Published Display Service Reply: %s\n", json);
}/* Message arrived handler */
void messageArrived(MessageData* data) {char* payload = (char*)data->message->payload;printf("Message arrived [%.*s]: %.*s\n",(int)data->topicName->lenstring.len, data->topicName->lenstring.data,(int)data->message->payloadlen, payload);// Add display control logic based on payload
}/* Main function */
int main(void) {int16_t temperature, humidity;puts("Starting ESP32 temperature and humidity application...\n");init_dht();init_oled();mqtt_setup();while (1) {ztimer_sleep(ZTIMER_USEC, SENSOR_READ_DELAY);if (dht_read(&dht_dev, &temperature, &humidity) != DHT_OK) {puts("Error reading sensor data!\n");continue;}float temp_in_celsius = temperature / 10.0;float hum_in_percent = humidity / 10.0;printf("Temperature: %.1f °C, Humidity: %.1f %%\n", temp_in_celsius, hum_in_percent);if (temp_in_celsius > 30.0) {report_alarm(temp_in_celsius); // Trigger high-temperature alarm}report_property(temp_in_celsius, hum_in_percent); // Send sensor data to the clouddisplay_data(temp_in_celsius, hum_in_percent); // Show data on OLED}return 0;
}
// Self Executable