use anyhow::Result;
use embedded_svc::mqtt::client::{
Client,
Details::{Complete, InitialChunk, SubsequentChunk},
Event::{self, Received},
Message, Publish, QoS,
};
use esp_idf_hal::{
delay,
i2c::{I2cConfig, I2cDriver},
prelude::*,
};
use esp_idf_svc::{
eventloop::EspSystemEventLoop,
mqtt::client::{EspMqttClient, EspMqttMessage, MqttClientConfiguration},
};
use log::{error, info};
pub mod mqtt_messages; //::{cmd_topic_fragment, hello_topic, Command, RawCommandData};
use mqtt_messages::{cmd_topic_fragment, hello_topic, Command, RawCommandData, temperature_data_topic};
pub mod rgb_led; //::{RGB8, WS2812RMT}
use rgb_led::{RGB8, WS2812RMT};
use shtcx::{self, shtc3, PowerMode};
use std::{borrow::Cow, convert::TryFrom, thread::sleep, time::Duration};
pub mod wifi; //::wifi;
use wifi::wifi;
use ds18b20;
// pub mod get_uuid;
// If using the `binstart` feature of `esp-idf-sys`, always keep this module imported
use esp_idf_sys as _;
// const UUID: &'static str = get_uuid::uuid();
const UUID: &'static str = "hep_test_uuid";
#[toml_cfg::toml_config]
pub struct Config {
#[default("broker.hivemq.com")]
mqtt_host: &'static str,
#[default("")]
mqtt_user: &'static str,
#[default("")]
mqtt_pass: &'static str,
#[default("Wokwi-GUEST")]
wifi_ssid: &'static str,
#[default("")]
wifi_psk: &'static str,
}
fn main() -> Result<()> {
esp_idf_sys::link_patches();
esp_idf_svc::log::EspLogger::initialize_default();
let peripherals = Peripherals::take().unwrap();
let sysloop = EspSystemEventLoop::take()?;
// The constant `CONFIG` is auto-generated by `toml_config`.
let app_config = CONFIG;
// Connect to the Wi-Fi network
let _wifi = wifi(
app_config.wifi_ssid,
app_config.wifi_psk,
peripherals.modem,
sysloop,
)?;
info!("Our UUID is:");
info!("{}", UUID);
let pins = peripherals.pins;
let sda = pins.gpio10;
let scl = pins.gpio8;
let i2c = peripherals.i2c0;
let config = I2cConfig::new().baudrate(100.kHz().into());
let i2c = I2cDriver::new(i2c, sda, scl, &config)?;
let mut temp_sensor = shtc3(i2c);
let mut delay = delay::Ets;
let mut led = WS2812RMT::new(pins.gpio2, peripherals.rmt.channel0)?;
led.set_pixel(RGB8::new(1, 1, 0))?;
// Client configuration:
let broker_url = if app_config.mqtt_user != "" {
format!(
"mqtt://{}:{}@{}",
app_config.mqtt_user, app_config.mqtt_pass, app_config.mqtt_host
)
} else {
format!("mqtt://{}", app_config.mqtt_host)
};
let mut mqtt_config = MqttClientConfiguration::default();
// Your Code:
// 1. Create a client with default configuration and empty handler
// mqtt_config.password = Some(app_config.mqtt_pass);
// mqtt_config.username = Some(app_config.mqtt_user);
// let mut client = EspMqttClient::new( ... )?;
let mut client = EspMqttClient::new(broker_url,
&mqtt_config,
move |mqtt_event|{})?;
// 2. publish an empty hello message
let payload: &[u8] = &[];
client.publish(&hello_topic(UUID), QoS::AtLeastOnce, true, payload)?;
loop {
sleep(Duration::from_secs(10));
let temp = temp_sensor
.measure_temperature(PowerMode::NormalMode, &mut delay)
.unwrap()
.as_degrees_celsius();
// let temp = 45;
info!("{}",temp);
// 3. publish CPU temperature
client.publish( &temperature_data_topic(UUID),QoS::AtLeastOnce, true, temp.to_string().as_bytes())?;
}
}
Loading
esp32-c3-rust-1
esp32-c3-rust-1