From f60906a174a5973f0fd32a309e900765655651d5 Mon Sep 17 00:00:00 2001
From: Benjamin Koch <bbbsnowball@gmail.com>
Date: Sun, 14 May 2023 03:49:58 +0200
Subject: [PATCH] add task for buzzer

---
 firmware/rust1/src/bin/heizung.rs | 33 ++++++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/firmware/rust1/src/bin/heizung.rs b/firmware/rust1/src/bin/heizung.rs
index bb32d66..a472cdb 100644
--- a/firmware/rust1/src/bin/heizung.rs
+++ b/firmware/rust1/src/bin/heizung.rs
@@ -12,8 +12,10 @@ use embassy_rp::gpio::{Input, Level, Output, Pull, Flex};
 use embassy_rp::i2c;
 use embassy_rp::interrupt;
 use embedded_hal_async::i2c::I2c;
+use embassy_embedded_hal::SetConfig;
 use embassy_rp::peripherals::{UART0, I2C0};
 use embassy_rp::uart::{self, UartRx, Parity};
+use embassy_rp::pwm::{self, Pwm};
 use {defmt_rtt as _, panic_probe as _};
 use heapless::String;
 
@@ -232,6 +234,30 @@ async fn i2c_task(mut i2c_peri: embassy_rp::peripherals::I2C0,
     }
 }
 
+#[embassy_executor::task]
+async fn beeper_task(mut pwm_channel: embassy_rp::peripherals::PWM_CH3, mut beeper_pin: embassy_rp::peripherals::PIN_6) {
+    let mut c: pwm::Config = Default::default();
+    c.top = 0x8000;
+    c.compare_a = 8;
+    c.divider = fixed::FixedU16::from_num(20);
+    let mut pwm = Pwm::new_output_a(pwm_channel, beeper_pin, c.clone());
+
+    let mut toggle = false;
+    loop {
+        info!("PWM: duty={}/32768, divider={}", c.compare_a, c.divider.to_bits());
+        Timer::after(Duration::from_millis(200)).await;
+        //c.compare_a = c.compare_a.rotate_left(4);
+        c.compare_a = if toggle { c.top/2 } else { 0 };
+        //toggle = !toggle;
+        c.divider -= fixed::FixedU16::from_num(0.1);
+        if c.divider < 1 {
+            c.divider = fixed::FixedU16::from_num(20);
+        }
+        toggle = true;
+        pwm.set_config(&c);
+    }
+}
+
 #[embassy_executor::main]
 async fn main(spawner: Spawner) {
     let p = embassy_rp::init(Default::default());
@@ -246,7 +272,7 @@ async fn main(spawner: Spawner) {
     let mut _en_measure_current = Output::new(p.PIN_3, Level::Low);
     let mut led_b = Output::new(p.PIN_4, Level::Low);
     let mut _led_g = Output::new(p.PIN_5, Level::Low);
-    let mut _led_r = Output::new(p.PIN_6, Level::Low);
+    let led_r = p.PIN_6;
     let _matrix_in1 = Input::new(p.PIN_7, Pull::Up);
     let _sbu1 = p.PIN_8;
     let _sbu2 = p.PIN_9;
@@ -271,13 +297,12 @@ async fn main(spawner: Spawner) {
     let _current1 = p.PIN_28;
     let _measure_vcc = p.PIN_29;
 
-    info!("set up i2c");
     let i2c_irq = interrupt::take!(I2C0_IRQ);
     let mut i2c_config = i2c::Config::default();
     i2c_config.frequency = 400_000;
     unwrap!(spawner.spawn(i2c_task(p.I2C0, scl, sda, i2c_irq, i2c_config)));
 
-    // use 19200 baud in 8E1 mode - not great but Modbus default
+    // use 19200 baud in 8E1 mode - not great but it's the Modbus default
     let mut uart_config = uart::Config::default();
     uart_config.baudrate = 19200;
     uart_config.parity = Parity::ParityEven;
@@ -290,6 +315,8 @@ async fn main(spawner: Spawner) {
     );
     unwrap!(spawner.spawn(reader(uart_rx)));
 
+    unwrap!(spawner.spawn(beeper_task(p.PWM_CH3, led_r)));
+
     loop {
         info!("led on!");
         led_b.set_high();
-- 
GitLab