
    

    <?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2-ppt DokuWiki" -->
<?xml-stylesheet href="http://ocw.cs.pub.ro/courses/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="http://ocw.cs.pub.ro/courses/feed.php">
        <title>CS Open CourseWare iothings:laboratoare:2025_code</title>
        <description></description>
        <link>http://ocw.cs.pub.ro/courses/</link>
        <image rdf:resource="http://ocw.cs.pub.ro/courses/lib/tpl/arctic/images/favicon.ico" />
       <dc:date>2026-05-02T02:58:47+03:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_1?rev=1760365191&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_2?rev=1760177934&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_3?rev=1760177993&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_4?rev=1760178045&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_1?rev=1761035867&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_2?rev=1761055157&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_proxy?rev=1761035761&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_1?rev=1761116448&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_2?rev=1761122041&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_3?rev=1761592186&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_1?rev=1761657502&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_2?rev=1761657544&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_3?rev=1761657648&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_4?rev=1761657849&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_5?rev=1761659976&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_6?rev=1761666769&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_7?rev=1762024475&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_8?rev=1762184579&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_1?rev=1762362978&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_2?rev=1762364331&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_3?rev=1762446392&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_1?rev=1763203810&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_2?rev=1763203911&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_3?rev=1763205715&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_1?rev=1763996324&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_2?rev=1763895170&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_3?rev=1763895204&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_4?rev=1763895405&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_1?rev=1765039313&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_2?rev=1765039861&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_3?rev=1765048992&amp;do=diff"/>
                <rdf:li rdf:resource="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab11_1?rev=1765810683&amp;do=diff"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="http://ocw.cs.pub.ro/courses/lib/tpl/arctic/images/favicon.ico">
        <title>CS Open CourseWare</title>
        <link>http://ocw.cs.pub.ro/courses/</link>
        <url>http://ocw.cs.pub.ro/courses/lib/tpl/arctic/images/favicon.ico</url>
    </image>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_1?rev=1760365191&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-13T17:19:51+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab3_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_1?rev=1760365191&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;PubSubClient.h&gt;

#ifndef WIFI_SSID
#define WIFI_SSID     &quot;UPB-Guest&quot;
#endif
#ifndef WIFI_PASSWORD
#define WIFI_PASSWORD &quot;&quot;
#endif
#ifndef MQTT_HOST
#define MQTT_HOST     &quot;test.mosquitto.org&quot;
#endif
#ifndef MQTT_PORT
#define MQTT_PORT     1883
#endif
#ifndef BASE_TOPIC
#define BASE_TOPIC    &quot;devices/esp32&quot;
#endif

WiFiClient      net;
PubSubClient    mqtt(net);         // PubSubClient uses a separate setServer(...)
unsigned long   lastPub = 0;

// …</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_2?rev=1760177934&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-11T13:18:54+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab3_2</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_2?rev=1760177934&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;MQTT.h&gt;              // 256dpi MQTT library
#include &lt;ArduinoJson.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;

//////////////// EDIT THESE ////////////////
const char* WIFI_SSID     = &quot;YOUR_SSID&quot;;
const char* WIFI_PASSWORD = &quot;YOUR_PASSWORD&quot;;
const char* MQTT_HOST     = &quot;test.mosquitto.org&quot;;   // or your lab broker
const uint16_t MQTT_PORT  = 1883;
const char* BASE_TOPIC    = &quot;iot/studentname&quot;;        // change per student
///////////////////////////////////…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_3?rev=1760177993&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-11T13:19:53+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab3_3</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_3?rev=1760177993&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;Wire.h&gt;
#include &lt;MQTT.h&gt;              
#include &lt;ArduinoJson.h&gt;
#include &lt;Adafruit_BME680.h&gt;

//////////////// EDIT THESE ////////////////
const char* WIFI_SSID     = &quot;YOUR_SSID&quot;;
const char* WIFI_PASSWORD = &quot;YOUR_PASSWORD&quot;;
const char* MQTT_HOST     = &quot;test.mosquitto.org&quot;;   // or your lab broker
const uint16_t MQTT_PORT  = 1883;
const char* BASE_TOPIC    = &quot;iot/studentname&quot;;        // change per student
/////////////////////////////////////////…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_4?rev=1760178045&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-11T13:20:45+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab3_4</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab3_4?rev=1760178045&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;WiFiClientSecure.h&gt;
#include &lt;MQTT.h&gt;
#include &lt;Wire.h&gt;
#include &lt;Adafruit_BME680.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;
#include &lt;ArduinoJson.h&gt;

//////////////// EDIT THESE ////////////////
const char* WIFI_SSID     = &quot;YOUR_SSID&quot;;
const char* WIFI_PASSWORD = &quot;YOUR_PASSWORD&quot;;
const char* MQTT_HOST     = &quot;test.mosquitto.org&quot;;   // or your lab broker
const uint16_t MQTT_PORT  = 1883;
const char* BASE_TOPIC    = &quot;iot/studentname&quot;;         // change per s…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_1?rev=1761035867&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-21T11:37:47+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab4_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_1?rev=1761035867&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;WiFiUdp.h&gt;
#include &lt;coap-simple.h&gt;   // hirotakaster/CoAP simple library

// ===== Wi-Fi creds =====
const char* WIFI_SSID = &quot;UPB-Guest&quot;;
const char* WIFI_PASS = &quot;&quot;;

// ===== CoAP server (Californium demo) =====
const char* COAP_HOST = &quot;californium.eclipseprojects.io&quot;;
const uint16_t COAP_PORT = 5683;   // RFC 7252 default port

// UDP + CoAP objects
WiFiUDP udp;
Coap coap(udp);

// ----- Response callback: prints payload as text -----
void onCo…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_2?rev=1761055157&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-21T16:59:17+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab4_2</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_2?rev=1761055157&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;WiFiUdp.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;
#include &lt;coap-simple.h&gt;   // hirotakaster CoAP simple library
 
// ===== Wi-Fi creds =====
const char* WIFI_SSID = &quot;UPB-Guest&quot;;
const char* WIFI_PASS = &quot;&quot;;

// ===== UDP + CoAP objects =====
WiFiUDP udp;
Coap coap(udp, 256);
 
// ===== On-board NeoPixel (GPIO 3) =====
constexpr uint8_t kNeoPixelPin = 3;
constexpr uint8_t kNeoPixelCount = 1;
constexpr uint8_t kNeoPixelBrightness = 128; // 50% to limit powe…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_proxy?rev=1761035761&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-21T11:36:01+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab4_proxy</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab4_proxy?rev=1761035761&amp;do=diff</link>
        <description>#!/usr/bin/env python3
&quot;&quot;&quot;
Minimal HTTP ↔ CoAP proxy using aiohttp + a handcrafted UDP CoAP client.

Expose REST-ish endpoints that translate browser-friendly HTTP requests to
CoAP messages for the ESP32 server.

Install dependencies:
    python3 -m pip install aiohttp

Run (defaults shown):
    HTTP_PORT=8080 COAP_HOST=192.168.4.1 COAP_PORT=5683 python3 tools/http_coap_proxy.py

Available endpoints:
  - GET /api/coap        -&gt; query params: host, port, method, path
  - POST /api/coap       -&gt; J…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_1?rev=1761116448&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-22T10:00:48+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab5_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_1?rev=1761116448&amp;do=diff</link>
        <description>// src/main.cpp
#ifndef ZIGBEE_MODE_ED
#error &quot;Build flag -D ZIGBEE_MODE_ED missing&quot;
#endif

#include &lt;Arduino.h&gt;
#include &lt;Wire.h&gt;
#include &lt;Adafruit_BME680.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;
#include &lt;cmath&gt;
#include &quot;Zigbee.h&quot;              // part of Arduino-ESP32 core Zigbee library

constexpr uint8_t SDA_PIN = 21;
constexpr uint8_t SCL_PIN = 22;
constexpr uint8_t BOOT = 9;
constexpr uint8_t NEOPIXEL_PIN = 3;
constexpr uint8_t NEOPIXEL_COUNT = 1;
constexpr uint8_t BME680_ADDRESS = 0x76;
const…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_2?rev=1761122041&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-22T11:34:01+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab5_2</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_2?rev=1761122041&amp;do=diff</link>
        <description>// Sparrow Zigbee nodes: switch (end device) and light (router)

#include &lt;Arduino.h&gt;
#include &quot;Zigbee.h&quot;

constexpr uint8_t SWITCH_PIN = 9;
constexpr uint32_t FACTORY_RESET_HOLD_MS = 3000;
constexpr uint32_t BUTTON_DEBOUNCE_MS = 50;

#if defined(SPARROW_SWITCH)

#include &quot;ep/ZigbeeSwitch.h&quot;

constexpr uint8_t SWITCH_ENDPOINT = 1;

ZigbeeSwitch switchEp(SWITCH_ENDPOINT);

static bool lastButtonLevel = HIGH;
static uint32_t lastButtonChangeMs = 0;
static uint32_t pressStartMs = 0;
static bool lon…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_3?rev=1761592186&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-27T21:09:46+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab5_3</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab5_3?rev=1761592186&amp;do=diff</link>
        <description>// Sparrow Zigbee nodes: switch (end device) and light (router)
 
#include &lt;Arduino.h&gt;
#include &lt;esp_sleep.h&gt;
#include &quot;driver/gpio.h&quot;
#include &quot;Zigbee.h&quot;
 
constexpr uint8_t SWITCH_PIN = 9;
constexpr uint32_t FACTORY_RESET_HOLD_MS = 3000;
constexpr uint32_t BUTTON_DEBOUNCE_MS = 50;
 
#if defined(SPARROW_SWITCH)

#include &quot;ep/ZigbeeSwitch.h&quot;
#include &quot;zcl/esp_zigbee_zcl_command.h&quot;
#include &quot;zcl/esp_zigbee_zcl_on_off.h&quot;

constexpr uint8_t SWITCH_ENDPOINT = 1;
constexpr uint32_t COMMISSIONING_AWAK…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_1?rev=1761657502&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-28T15:18:22+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab6_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_1?rev=1761657502&amp;do=diff</link>
        <description>#pragma once
#include &lt;Arduino.h&gt;
#include &lt;Wire.h&gt;

// Sparrow wiring / addresses
#define LSM6DSL_I2C_ADDR 0x6A
#define LSM6DSL_SDA_PIN  21   // GPIO21 on Sparrow
#define LSM6DSL_SCL_PIN  22   // GPIO22 on Sparrow

// LSM6DSL registers we care about
#define LSM6DSL_CTRL1_XL   0x10  // accel config
#define LSM6DSL_CTRL2_G    0x11  // gyro config
#define LSM6DSL_CTRL3_C    0x12  // IF_INC, BDU, etc.
#define LSM6DSL_OUTX_L_XL  0x28  // accel data start (X_L, X_H, Y_L, Y_H, Z_L, Z_H)

// Sensitivit…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_2?rev=1761657544&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-28T15:19:04+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab6_2</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_2?rev=1761657544&amp;do=diff</link>
        <description>#include &quot;LSM6DSL.h&quot;

bool LSM6DSL::begin() {
    Wire.begin(LSM6DSL_SDA_PIN, LSM6DSL_SCL_PIN);

    delay(50);

    // Enable accelerometer @208 Hz, ±2g, BW ~100 Hz:
    // CTRL1_XL (0x10):
    //   ODR_XL[3:0]=0b0101 =&gt; 208 Hz
    //   FS_XL[1:0]=00 =&gt; ±2g
    //   BW_XL[1:0]=00 =&gt; ~100Hz
    // Combined: 0x50
    if (!writeReg(LSM6DSL_CTRL1_XL, 0x50)) return false;

    // Turn gyro off for power saving: CTRL2_G = 0x00 (power-down)
    if (!writeReg(LSM6DSL_CTRL2_G, 0x00)) return false;

    …</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_3?rev=1761657648&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-28T15:20:48+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab6_3</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_3?rev=1761657648&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &quot;LSM6DSL.h&quot;

LSM6DSL imu;

// Current label we’re streaming with each sample
// 0 = idle, 1 = shake
volatile uint8_t currentLabel = 0;

// Timing
const uint32_t SAMPLE_PERIOD_MS = 10; // ~100 Hz
uint32_t lastSampleMs = 0;

void handleSerialLabel() {
    while (Serial.available()) {
        char c = Serial.read();
        if (c == 'i' || c == 'I') {
            currentLabel = 0;
            Serial.println(&quot;# label=IDLE(0)&quot;);
        } else if (c == 's' || c == 'S') {…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_4?rev=1761657849&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-28T15:24:09+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab6_4</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_4?rev=1761657849&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;
#include &lt;math.h&gt;

#include &quot;LSM6DSL.h&quot;
#include &quot;model.h&quot;  // generated by train_model.py

LSM6DSL imu;

// LED setup (NeoPixel on GPIO3, 1 pixel)
#define NEOPIXEL_PIN   3
#define NEOPIXEL_COUNT 1
Adafruit_NeoPixel pixel(NEOPIXEL_COUNT, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);

// sampling
const uint32_t SAMPLE_PERIOD_MS = 10; // ~100 Hz
uint32_t lastSampleMs = 0;

// ring buffer for accel magnitude
static float magBuf[WINDOW_SIZE];
static uint16_…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_5?rev=1761659976&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-28T15:59:36+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab6_5</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_5?rev=1761659976&amp;do=diff</link>
        <description>import sys
import time
import serial
import csv
import argparse

PORT = &quot;/dev/cu.usbmodem2101&quot;   # &lt;-- put your Sparrow port here
BAUD = 115200

def parse_args():
    p = argparse.ArgumentParser(description=&quot;Collect Sparrow IMU data with a fixed label.&quot;)
    g = p.add_mutually_exclusive_group(required=True)
    g.add_argument(&quot;-stationary&quot;, &quot;--stationary&quot;, action=&quot;store_true&quot;,
                   help=&quot;Use the 'stationary' label&quot;)
    g.add_argument(&quot;-shaking&quot;, &quot;--shaking&quot;, action=&quot;store_true&quot;,
 …</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_6?rev=1761666769&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-10-28T17:52:49+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab6_6</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_6?rev=1761666769&amp;do=diff</link>
        <description>import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

IDLE_CSV  = &quot;raw_data_label0.csv&quot;
SHAKE_CSV = &quot;raw_data_label1.csv&quot;

WINDOW_SIZE = 50   # 0.5s window @ ~100 Hz
STEP_SIZE   = 25   # 50% overlap

MODEL_HEADER_OUT = &quot;include/model.h&quot;

def load_and_merge():
    df0 = pd.read_csv(IDLE_CSV)
    df1 = pd.read_csv(SHAKE_CSV)

    # Just sanity: enforce int label for safety
    df0[&quot;label&quot;] = 0
    df1[&quot;label&quot;] …</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_7?rev=1762024475&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-01T21:14:35+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab6_7</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_7?rev=1762024475&amp;do=diff</link>
        <description>// main.cpp -- streaming wake-word validator with low-latency inference
#include &lt;Arduino.h&gt;
#include &lt;ESP_I2S.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;
#include &lt;arduinoFFT.h&gt;
#include &lt;math.h&gt;
#include &quot;audio_model.h&quot;

#define AUTO_PICK_CHANNEL   1
#define FORCE_RIGHT_CHANNEL 1  // used if auto-pick disabled

// Audio capture configuration ------------------------------------------------
constexpr int SAMPLE_RATE_HZ = 16000;
constexpr int CLIP_SECONDS   = 1;
constexpr int CLIP_SAMPLES   = SAMPLE_RATE_…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_8?rev=1762184579&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-03T17:42:59+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab6_8</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab6_8?rev=1762184579&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;ESP_I2S.h&gt;

// Sparrow mic pins (ICS-43434, I2S):
// MIC_SCK  -&gt; GPIO18 (bit clock / bclk / sck)
// MIC_WS   -&gt; GPIO20 (word select / ws / LRCLK)
// MIC_SD   -&gt; GPIO19 (data from mic -&gt; esp din)
//
// From Sparrow README pin table. (MIC_WS=GPIO20, MIC_SCK=GPIO18, MIC_SD=GPIO19)
//
// We'll set dout = -1 because Sparrow is only listening, not transmitting audio out.

static I2SClass I2S;

// recording config
static const uint32_t SAMPLE_RATE_HZ = 16000;
static const…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_1?rev=1762362978&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-05T19:16:18+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab7_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_1?rev=1762362978&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;Wire.h&gt;
#include &lt;LSM6DSL.h&gt;           // dycodex/LSM6DSL-Arduino
#include &lt;Adafruit_NeoPixel.h&gt; // for the on-board WS2812

// ===== Sparrow pinout (from board README) =====
// I2C: SDA=GPIO21, SCL=GPIO22
// LSM6DSL I2C address = 0x6A
// NeoPixel on GPIO3
// (INT pin for LSM6DSL is GPIO11 if you later want interrupts)
constexpr int PIN_SDA = 21;
constexpr int PIN_SCL = 22;
constexpr uint8_t LSM6DSL_ADDR = 0x6A;
constexpr int NEOPIXEL_PIN = 3;
constexpr int NEOPIXE…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_2?rev=1762364331&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-05T19:38:51+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab7_2</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_2?rev=1762364331&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;
#include &quot;driver/i2s.h&quot;
#include &lt;arduinoFFT.h&gt;

// ===== Sparrow audio pins (ICS-43434 I2S mic) =====
static const int I2S_WS_PIN  = 20; // LRCLK / WS
static const int I2S_SCK_PIN = 18; // BCLK
static const int I2S_SD_PIN  = 19; // DOUT from mic

// ===== LED =====
static const int NEOPIXEL_PIN = 3;
Adafruit_NeoPixel pixel(1, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);

// ===== Audio / DSP params =====
static const int SAMPLE_RATE   = 16000;     // …</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_3?rev=1762446392&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-06T18:26:32+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab7_3</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab7_3?rev=1762446392&amp;do=diff</link>
        <description>// src/main.cpp
// ESP32-C6 Sparrow: supports LTR303 or LTR308 digital light sensors
// - Auto-detects which sensor is present
// - LTR303: uses CH0 counts (robust brightness metric)
// - LTR308: computes approximate lux using datasheet scaling
// - Normalizes, runs online k-means, and maps to room-state labels
//
// PlatformIO deps (platformio.ini):
// lib_deps =
//   adafruit/Adafruit LTR329 and LTR303@^3.0.1
//   https://github.com/DFRobot/DFRobot_LTR308.git

#include &lt;Arduino.h&gt;
#include &lt;Wi…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_1?rev=1763203810&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-15T12:50:10+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab8_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_1?rev=1763203810&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;HTTPClient.h&gt;
 
// ==== TODO: fill these in for the lab ====
const char* WIFI_SSID     = &quot;LAB_WIFI_SSID&quot;;
const char* WIFI_PASSWORD = &quot;LAB_WIFI_PASSWORD&quot;;
const char* SERVER_URL    = &quot;http://192.168.1.100:8080/ingest&quot;; // replace with your server IP
// =========================================
 
const char* DEVICE_ID     = &quot;sparrow-01&quot;;
const char* API_KEY       = &quot;SUPER_SECRET_API_KEY_123&quot;; // intentionally bad design
 
void connectToWiFi() {
  S…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_2?rev=1763203911&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-15T12:51:51+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab8_2</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_2?rev=1763203911&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;WiFiClientSecure.h&gt;
#include &lt;HTTPClient.h&gt;
 
// ====== LAB CONFIG: fill these in per-lab ======
const char* WIFI_SSID     = &quot;LAB_WIFI_SSID&quot;;
const char* WIFI_PASSWORD = &quot;LAB_WIFI_PASSWORD&quot;;
 
// Replace with your server's IP
const char* SERVER_URL    = &quot;https://192.168.1.100:8443/ingest&quot;;
 
const char* DEVICE_ID     = &quot;sparrow-01&quot;;
 
// This key must match SECRET_KEY on the server
// NOTE: in real systems, putting secrets in firmware has risks → …</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_3?rev=1763205715&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-15T13:21:55+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab8_3</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab8_3?rev=1763205715&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;WiFiClientSecure.h&gt;
#include &lt;HTTPClient.h&gt;
#include &lt;pgmspace.h&gt;

// ===================== LAB CONFIG =====================

// Wi-Fi credentials
const char* WIFI_SSID     = &quot;LAB_WIFI_SSID&quot;;
const char* WIFI_PASSWORD = &quot;LAB_WIFI_PASSWORD&quot;;

// Server hostname and port.
// Hostname MUST match the CN/SAN in your server certificate (e.g. &quot;iot-lab.local&quot;).
const char* SERVER_HOST   = &quot;iot-lab.local&quot;;
const uint16_t SERVER_PORT = 8443;

// URL used by…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_1?rev=1763996324&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-24T16:58:44+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab9_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_1?rev=1763996324&amp;do=diff</link>
        <description>#include &lt;WiFi.h&gt;
#include &lt;WiFiClientSecure.h&gt;
#include &lt;HTTPClient.h&gt;

#include &lt;Adafruit_BME680.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;
#include &lt;ArduinoJson.h&gt;

// ====== USER CONFIG ======
const char* WIFI_SSID     = &quot;YOUR_WIFI_SSID&quot;;
const char* WIFI_PASSWORD = &quot;YOUR_WIFI_PASSWORD&quot;;

const char* FIREBASE_API_KEY = &quot;YOUR_FIREBASE_API_KEY&quot;; // from firebaseConfig.apiKey
const char* FIREBASE_DB_URL  = &quot;https://YOUR_PROJECT_ID-default-rtdb.YOUR_REGION.firebasedatabase.app&quot;;

const char* DEVICE_EMAIL…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_2?rev=1763895170&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-23T12:52:50+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab9_2</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_2?rev=1763895170&amp;do=diff</link>
        <description>&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;utf-8&quot; /&gt;
  &lt;title&gt;Sparrow Dashboard&lt;/title&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;

  &lt;style&gt;
    body { font-family: system-ui, sans-serif; margin: 0; padding: 0; background: #111; color: #eee; }
    .container { max-width: 900px; margin: 0 auto; padding: 1.5rem; }
    h1, h2 { font-weight: 600; }
    .card {
      background: #1c1c1c;
      border-radius: 1rem;
      padding: 1rem 1.25rem;
      margin-…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_3?rev=1763895204&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-23T12:53:24+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab9_3</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_3?rev=1763895204&amp;do=diff</link>
        <description>// ===== Firebase config (from Firebase console web app) =====
const firebaseConfig = {
  apiKey: &quot;YOUR_API_KEY&quot;,
  authDomain: &quot;your-project-id.firebaseapp.com&quot;,
  databaseURL: &quot;https://your-project-id-default-rtdb.YOUR_REGION.firebasedatabase.app&quot;,
  projectId: &quot;your-project-id&quot;,
};

const DEVICE_ID = &quot;sparrow-01&quot;;
const MAX_CHART_POINTS = 50;
const CHART_LOCAL_SRC = &quot;chart.umd.min.js?v=1&quot;;
const CHART_CDN_SRC   = &quot;https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js&quot;;

// Wait fo…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_4?rev=1763895405&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-11-23T12:56:45+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab9_4</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab9_4?rev=1763895405&amp;do=diff</link>
        <description>/**
 * Skipped minification because the original files appears to be already minified.
 * Original file: /npm/chart.js@4.4.3/dist/chart.umd.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
/*!
 * Chart.js v4.4.3
 * https://www.chartjs.org
 * (c) 2024 Chart.js Contributors
 * Released under the MIT License
 */
!function(t,e){&quot;object&quot;==typeof exports&amp;&amp;&quot;undefined&quot;!=typeof module?module.exports=e():&quot;function&quot;==typeo…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_1?rev=1765039313&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-12-06T18:41:53+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab10_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_1?rev=1765039313&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;AsyncTCP.h&gt;
#include &lt;ESPAsyncWebServer.h&gt;
#include &lt;ElegantOTA.h&gt;

const char* ssid     = &quot;UPB-Guest&quot;;
const char* password = &quot;&quot;;
// OTA basic auth (recommended)
const char* ota_user = &quot;admin&quot;;
const char* ota_pass = &quot;change-me&quot;;

AsyncWebServer server(80);

void setup() {
  Serial.begin(115200);
  delay(200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  Serial.print(&quot;Connecting to WiFi&quot;);
  while (WiFi.status() != WL_CONNECTED) {
   …</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_2?rev=1765039861&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-12-06T18:51:01+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab10_2</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_2?rev=1765039861&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;AsyncTCP.h&gt;
#include &lt;ESPAsyncWebServer.h&gt;
#include &lt;ElegantOTA.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;

const char* ssid     = &quot;UPB-Guest&quot;;
const char* password = &quot;&quot;;
// OTA basic auth (recommended)
const char* ota_user = &quot;admin&quot;;
const char* ota_pass = &quot;change-me&quot;;

constexpr uint8_t NEOPIXEL_PIN = 3;
constexpr uint16_t NEOPIXEL_COUNT = 1;
Adafruit_NeoPixel statusPixel(NEOPIXEL_COUNT, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);

AsyncWebServer server(80);

v…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_3?rev=1765048992&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-12-06T21:23:12+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab10_3</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab10_3?rev=1765048992&amp;do=diff</link>
        <description>#include &lt;Arduino.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;AsyncTCP.h&gt;
#include &lt;ESPAsyncWebServer.h&gt;
#include &lt;Adafruit_NeoPixel.h&gt;
#include &lt;HTTPClient.h&gt;
#include &lt;Update.h&gt;
#include &lt;ArduinoJson.h&gt;
#include &lt;Preferences.h&gt;
#include &quot;mbedtls/sha256.h&quot;

const char* ssid     = &quot;UPB-Guest&quot;;
const char* password = &quot;&quot;;

// Pull-OTA settings (host these on your local machine)
const char* fw_version       = &quot;1.0.0&quot;;
const char* ota_manifest_url = &quot;http://192.168.0.104:8000/manifest.json&quot;; // adjust to your LA…</description>
    </item>
    <item rdf:about="http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab11_1?rev=1765810683&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-12-15T16:58:03+03:00</dc:date>
        <title>iothings:laboratoare:2025_code:lab11_1</title>
        <link>http://ocw.cs.pub.ro/courses/iothings/laboratoare/2025_code/lab11_1?rev=1765810683&amp;do=diff</link>
        <description>#!/usr/bin/env python3
&quot;&quot;&quot;
Sparrow Serial Watcher (macOS, ESP32-C6 native USB) - v6

What this solves:
- ESP32-C6 native USB Serial/JTAG on macOS often disconnects and re-enumerates on reset.
- After a hard reset, console output may resume only after a host &quot;touch&quot;.
- west espressif monitor (idf_monitor) appears to do a helpful open/reset/line-state dance.
- This script emulates a safe subset of that behavior.

Key behaviors:
- Only considers /dev/*usbmodem* ports by default (macOS-safe).
- Avoi…</description>
    </item>
</rdf:RDF>
