meta data for this page
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
ixc2025:lappeenranta:team_1:start [2025/05/21 10:37] – [7. Behavioral Change Analysis] mrc | ixc2025:lappeenranta:team_1:start [2025/05/22 15:51] (current) – [1. Group Introduction] mrc | ||
---|---|---|---|
Line 5: | Line 5: | ||
==== 1. Group Introduction ==== | ==== 1. Group Introduction ==== | ||
+ | We are DAMP+J, a team formed during the hackathon to explore how IoT can be used to influence individual behavior for sustainability and well-being. Our group brings together complementary skills in embedded systems, software engineering, | ||
+ | Our approach prioritizes simplicity, functionality, | ||
+ | |||
+ | Our final project, FRoast, reflects this mindset—a behavior-aware smart fridge prototype designed to promote conscious food habits, reduce waste, and make sustainability both personal and actionable. | ||
+ | |||
+ | |||
+ | === Our team members === | ||
+ | - Jorge Leon | ||
+ | - Marcia Rodrigues | ||
+ | - Daniella Fajardo | ||
+ | - Prachi Singhal | ||
+ | - Abdulkadir Abubakar | ||
==== 2. Initial brainstorming ideas/ | ==== 2. Initial brainstorming ideas/ | ||
Line 13: | Line 25: | ||
We explored several IoT-based concepts that aim to nudge individuals toward sustainable, | We explored several IoT-based concepts that aim to nudge individuals toward sustainable, | ||
- | === 🚿 Smart Bath / Water Control System === | + | === Smart Bath / Water Control System === |
* **Goal**: Reduce water and energy waste by encouraging shorter, more efficient showers. | * **Goal**: Reduce water and energy waste by encouraging shorter, more efficient showers. | ||
* **What it’s about**: This system monitors shower duration using steam and temperature sensors. It gives real-time feedback using buzzers, RGB lights, or LCD messages when a user exceeds optimal limits. The aim is to build awareness of water usage and promote sustainable bathing habits. | * **What it’s about**: This system monitors shower duration using steam and temperature sensors. It gives real-time feedback using buzzers, RGB lights, or LCD messages when a user exceeds optimal limits. The aim is to build awareness of water usage and promote sustainable bathing habits. | ||
Line 22: | Line 34: | ||
* Eco-feedback or daily stats to reward water-efficient behavior. | * Eco-feedback or daily stats to reward water-efficient behavior. | ||
- | === 🌱 Sustainability Coach – In-Room Behavioral Monitoring === | + | === Sustainability Coach – In-Room Behavioral Monitoring === |
* **Goal**: Help individuals become more energy-conscious in their personal spaces. | * **Goal**: Help individuals become more energy-conscious in their personal spaces. | ||
* **What it’s about**: This system acts as a digital coach inside a user’s room. It monitors air conditioning use, artificial lighting, fan activity, and motion detection to identify unnecessary resource consumption. Feedback is delivered via lights, screen messages, and audio cues. | * **What it’s about**: This system acts as a digital coach inside a user’s room. It monitors air conditioning use, artificial lighting, fan activity, and motion detection to identify unnecessary resource consumption. Feedback is delivered via lights, screen messages, and audio cues. | ||
Line 32: | Line 44: | ||
* Idle Energy Consumption: | * Idle Energy Consumption: | ||
- | === 🥩 Meat Consumption Awareness Coach (Concept) === | + | === Meat Consumption Awareness Coach (Concept) === |
* **Goal**: Encourage more sustainable dietary choices by reducing unnecessary meat consumption. | * **Goal**: Encourage more sustainable dietary choices by reducing unnecessary meat consumption. | ||
* **What it’s about**: While not fully developed, the concept involved using fridge/ | * **What it’s about**: While not fully developed, the concept involved using fridge/ | ||
Line 41: | Line 53: | ||
* While not implemented, | * While not implemented, | ||
- | === ♿ EcoAccess Station – Adaptive Smart Environment for Inclusion === | + | === EcoAccess Station – Adaptive Smart Environment for Inclusion === |
* **Goal**: Combine energy efficiency with personalized accessibility for users with diverse needs. | * **Goal**: Combine energy efficiency with personalized accessibility for users with diverse needs. | ||
* **What it’s about**: EcoAccess Station uses **RFID** to identify users and adapt room conditions based on their physical or sensory requirements (e.g., mobility-impaired, | * **What it’s about**: EcoAccess Station uses **RFID** to identify users and adapt room conditions based on their physical or sensory requirements (e.g., mobility-impaired, | ||
Line 51: | Line 63: | ||
* Provides accessible feedback through color-coded LEDs and simple audio/text messages. | * Provides accessible feedback through color-coded LEDs and simple audio/text messages. | ||
- | === ❄️ | + | === Coach Fridge – Personal Eating Habits(Selected Project) === |
* **Goal**: Promote healthier eating habits and reduce unconscious fridge use through personalized feedback. | * **Goal**: Promote healthier eating habits and reduce unconscious fridge use through personalized feedback. | ||
* **What it’s about**: Coach Fridge uses **RFID** to identify users and monitors their **frequency**, | * **What it’s about**: Coach Fridge uses **RFID** to identify users and monitors their **frequency**, | ||
Line 75: | Line 87: | ||
==== 3. Day 2 Presentation slides ==== | ==== 3. Day 2 Presentation slides ==== | ||
+ | {{ : | ||
==== 4. Finalised Idea, description & Functions ==== | ==== 4. Finalised Idea, description & Functions ==== | ||
Line 82: | Line 94: | ||
The project is a smart fridge system designed to monitor and influence users’ eating habits through real-time feedback and personalized behavior tracking. It uses RFID identification, | The project is a smart fridge system designed to monitor and influence users’ eating habits through real-time feedback and personalized behavior tracking. It uses RFID identification, | ||
- | === 🔎 Description === | + | === Description === |
Each time a user approaches the fridge, they are identified using an RFID tag. The system monitors fridge access patterns — how often, when, and for how long the fridge is used — and cross-references this with sensor data (e.g., steam, gas, temperature, | Each time a user approaches the fridge, they are identified using an RFID tag. The system monitors fridge access patterns — how often, when, and for how long the fridge is used — and cross-references this with sensor data (e.g., steam, gas, temperature, | ||
Line 94: | Line 106: | ||
Real-time nudges are provided through LEDs, buzzer sounds, and messages on an LCD display, mimicking the role of a digital “fridge coach.” | Real-time nudges are provided through LEDs, buzzer sounds, and messages on an LCD display, mimicking the role of a digital “fridge coach.” | ||
- | === ⚙️ | + | === Functions === |
* **User Identification**: | * **User Identification**: | ||
Line 112: | Line 124: | ||
==== 5. Future Improvements ==== | ==== 5. Future Improvements ==== | ||
- | While the current prototype | + | While the current prototype of FRoast successfully demonstrates |
- | * **Data Logging | + | === 1. Nutritional Categorization |
- | Store user behavior data (e.g., access time, duration, triggers) to analyze trends over days or weeks and generate visual | + | Integrating basic food identification features—such as barcode scanning, NFC tags, or weight sensors—could enable FRoast to provide context-specific |
+ | * Encourage the storage of healthier food options | ||
+ | * Discourage excessive processed food consumption | ||
+ | * Track diversity in food selection | ||
- | * **Mobile App or Dashboard Integration** | + | === 2. Inventory Management and Waste Reduction === |
- | | + | By associating RFID tags with specific food items or enabling manual item logging, FRoast could offer inventory tracking capabilities. This would support: |
+ | | ||
+ | * Alerts for items nearing expiration | ||
+ | * Waste reduction via proactive usage reminders | ||
- | * **Nutritional Categorization** | + | === 3. Multimodal Feedback: Voice Integration === |
- | | + | To enhance accessibility, |
- | * **Fridge Inventory Tracking** | + | === 4. Energy Efficiency Adaptation === |
- | Track stored items using RFID or manual input to suggest food rotation and reduce waste (e.g., reminders for expiring items). | + | Incorporating ambient temperature sensing would enable FRoast |
+ | * Stricter alerts during hot weather when open-door cooling loss is more severe | ||
+ | * Relaxed thresholds during colder months when external temperatures mitigate loss | ||
- | * **Voice Feedback System** | + | === 5. Machine Learning and Personalized Adaptation === |
- | | + | Introducing a lightweight machine learning layer could allow the system to evolve beyond fixed thresholds. Using historical behavior data, the model could: |
+ | | ||
+ | | ||
+ | * Differentiate between habitual and intentional exceptions | ||
+ | ==== 6. SUSAF Analysis ==== | ||
- | * **Energy Optimization Module** | + | {{: |
- | Add external temperature detection to adapt internal feedback based on seasonal energy demands (e.g., reducing unnecessary opening in summer). | + | |
- | * **Machine Learning Integration** | + | {{: |
- | Train a simple model to adapt nudging patterns based on user-specific behaviors rather than using static thresholds. | + | |
+ | {{: | ||
+ | |||
+ | {{: | ||
- | These improvements would help transform FRoast from a rule-based behavior tool into a more adaptive, personalized, | ||
- | ==== 6. SUSAF Analysis ==== | ||
==== 7. Behavioral Change Analysis ==== | ==== 7. Behavioral Change Analysis ==== | ||
- | FRoast is designed | + | FRoast is designed |
- | === 🎯 Targeted Behaviors | + | === Rationale for Behavior Change |
- | * Late-night snacking | + | |
- | * Leaving the fridge open too long | + | |
- | * Storing hot food improperly | + | |
- | * Repetitive short visits (poor food rotation) | + | |
- | * Ignoring seasonal energy efficiency | + | |
- | * Lack of dietary awareness (e.g., not enough fruits or meal structure) | + | |
- | === 🔍 Behavior Detection Mechanism === | + | Refrigerators contribute significantly to household energy consumption and are often involved in avoidable food waste due to poor usage habits. Traditional tracking alone provides |
- | * **RFID Identification** links behavior | + | |
- | * **Sensor Data** (motion, temperature, | + | |
- | * **Time-based Logic** determines whether behaviors occur during target windows (e.g., night hours, meal prep times). | + | |
- | * **Usage Frequency & Duration** are logged to identify repetitive or excessive patterns. | + | |
- | === 🔁 Feedback Strategy === | + | The premise is simple but effective: raising user awareness |
- | * **Immediate feedback** | + | |
- | * **Positive reinforcement** for reduced usage or healthy timing encourages habit building. | + | |
- | * **Warning signals** during undesired behaviors (e.g., frequent night visits) create disruption that prompts reconsideration. | + | |
- | === 📈 Potential Impact Over Time === | + | === User-Specific Monitoring and Triggers |
- | * Increased mindfulness around food access | + | |
- | * Reduction in energy waste (fridge left open or hot food storage) | + | |
- | * Healthier timing of meals and snacks | + | |
- | * Decrease in impulsive or unconscious food-related behavior | + | |
- | Through continued use, the system promotes gradual behavior shifts without requiring drastic | + | Each user is identified via RFID, enabling individualized tracking and tailored |
- | ==== 8. Final Day Presentation Slides ==== | + | |
+ | * **Fridge Door Access Patterns** | ||
+ | * Frequency of openings per day | ||
+ | * Duration of door open per session | ||
+ | * **Nighttime Usage** | ||
+ | * Identification of fridge use during designated rest hours | ||
+ | |||
+ | * **Steam Events** | ||
+ | * Detection of hot food insertion through steam sensors, indicating inefficient storage behavior | ||
+ | |||
+ | * **Gas Events** | ||
+ | * Detection of spoilage or strong odors, signaling delayed disposal or neglected items | ||
+ | |||
+ | * **Fruit and Compartment Use** | ||
+ | * Patterns of compartment interaction, | ||
+ | |||
+ | === Metrics for Evaluating Change === | ||
+ | |||
+ | To assess the effectiveness of FRoast in modifying behavior, both quantitative and qualitative metrics are collected: | ||
+ | |||
+ | **Quantitative Indicators** | ||
+ | * Average duration of fridge door openings over time | ||
+ | * Number of late-night access events per week | ||
+ | * Frequency of steam or gas sensor activations | ||
+ | * Interaction rates with the fruit compartment or healthier food zones | ||
+ | * Frequency of sustainability warnings recorded via the internal log or connected web interface | ||
+ | |||
+ | **Qualitative Indicators** | ||
+ | * User-reported changes in snacking frequency or food discipline | ||
+ | * User preference tracking based on response to feedback tone (e.g., comedic, neutral, advisory) | ||
+ | |||
+ | === Anticipated Impact === | ||
+ | |||
+ | The long-term objective of FRoast is to instill sustainable behavior without requiring significant user effort or intrusive systems. By embedding behaviorally-informed micro-interventions into an everyday appliance, the system can contribute to: | ||
+ | |||
+ | * Improved food storage habits and reduced spoilage | ||
+ | * Lower average energy usage through better door discipline | ||
+ | * Reduced impulsive eating, particularly at night | ||
+ | * Increased user engagement with sustainability as a personal responsibility | ||
+ | |||
+ | Through repeated exposure to feedback and subtle reinforcement, | ||
+ | |||
+ | ==== 8. Final Day Presentation Slides ==== | ||
+ | |||
+ | {{ : | ||
==== 9. Final Code ==== | ==== 9. Final Code ==== | ||
+ | <code python> | ||
+ | import uasyncio as asyncio | ||
+ | from machine import Pin, PWM, SoftI2C, ADC, DAC | ||
+ | from i2c_lcd import I2cLcd | ||
+ | import time | ||
+ | import dht | ||
+ | from mfrc522_i2c import mfrc522 | ||
+ | import collections | ||
+ | |||
+ | class MessageQueue: | ||
+ | def __init__(self): | ||
+ | self.queue = [] | ||
+ | |||
+ | async def put(self, item): | ||
+ | self.queue.append(item) | ||
+ | |||
+ | async def get(self): | ||
+ | while not self.queue: | ||
+ | await asyncio.sleep(0.1) | ||
+ | return self.queue.pop(0) | ||
+ | |||
+ | message_queue = MessageQueue() | ||
+ | |||
+ | # Constants | ||
+ | SERVO_PIN = 5 | ||
+ | BUZZER_PIN = 25 | ||
+ | I2C_SCL = 22 | ||
+ | I2C_SDA = 21 | ||
+ | I2C_ADDR = 0x27 | ||
+ | RFID_ADDR = 0x28 | ||
+ | AUTHORIZED_ID = 547 | ||
+ | SERVO_OPEN = 125 | ||
+ | SERVO_CLOSE = 28 | ||
+ | BUZZER_FREQ1 = 1000 | ||
+ | BUZZER_FREQ2 = 1500 | ||
+ | ALARM_DURATION = 0.5 | ||
+ | HUMIDITY_THRESHOLD = 30 | ||
+ | TEMP_THRESHOLD = 27 | ||
+ | GAS_PIN = 23 | ||
+ | GAS_SENSOR = Pin(GAS_PIN, | ||
+ | GAS_THRESHOLD = 70 # Adjust based on sensor calibration | ||
+ | |||
+ | # State | ||
+ | door_opened = False | ||
+ | open_time = 0 | ||
+ | |||
+ | # I2C + LCD setup | ||
+ | i2c = SoftI2C(scl=Pin(I2C_SCL, | ||
+ | sda=Pin(I2C_SDA, | ||
+ | freq=100000) | ||
+ | lcd = I2cLcd(i2c, I2C_ADDR, 2, 16) | ||
+ | |||
+ | # Buzzer setup | ||
+ | buzzer = PWM(Pin(BUZZER_PIN)) | ||
+ | buzzer.duty(0) | ||
+ | |||
+ | # RFID setup | ||
+ | rc522 = mfrc522(I2C_SCL, | ||
+ | rc522.PCD_Init() | ||
+ | rc522.ShowReaderDetails() | ||
+ | |||
+ | # DHT Sensor setup | ||
+ | DHT_SENSOR = dht.DHT11(Pin(17)) | ||
+ | # === STEAM SETUP === | ||
+ | STEAM_SENSOR = ADC(Pin(34)) | ||
+ | STEAM_SENSOR.atten(ADC.ATTN_11DB) | ||
+ | STEAM_THRESHOLD = 800 # Analog value above this = steam detected | ||
+ | |||
+ | current_user = " | ||
+ | |||
+ | |||
+ | async def move_servo(position): | ||
+ | servo = PWM(Pin(SERVO_PIN)) | ||
+ | servo.freq(50) | ||
+ | servo.duty(position) | ||
+ | await asyncio.sleep(0.5) | ||
+ | servo.deinit() | ||
+ | |||
+ | async def open_door(): | ||
+ | global door_opened, | ||
+ | print(" | ||
+ | await move_servo(SERVO_OPEN) | ||
+ | open_time = time.time() | ||
+ | door_opened = True | ||
+ | |||
+ | async def close_door(): | ||
+ | global door_opened | ||
+ | print(" | ||
+ | await move_servo(SERVO_CLOSE) | ||
+ | door_opened = False | ||
+ | |||
+ | |||
+ | async def play_alarm(): | ||
+ | print(" | ||
+ | buzzer.duty(512) | ||
+ | end_time = time.ticks_ms() + 2000 | ||
+ | while time.ticks_ms() < end_time: | ||
+ | buzzer.freq(BUZZER_FREQ1) | ||
+ | await asyncio.sleep(ALARM_DURATION) | ||
+ | buzzer.freq(BUZZER_FREQ2) | ||
+ | await asyncio.sleep(ALARM_DURATION) | ||
+ | buzzer.duty(0) | ||
+ | |||
+ | |||
+ | async def scroll_text(text, | ||
+ | if len(text) <= 16: | ||
+ | lcd.move_to(0, | ||
+ | lcd.putstr(text + ' ' * (16 - len(text))) | ||
+ | return | ||
+ | for i in range(len(text) - 15): | ||
+ | lcd.move_to(0, | ||
+ | lcd.putstr(text[i: | ||
+ | await asyncio.sleep(delay) | ||
+ | | ||
+ | async def message_handler(): | ||
+ | while True: | ||
+ | upper, lower = await message_queue.get() | ||
+ | lcd.clear() | ||
+ | await scroll_text(upper, | ||
+ | await scroll_text(lower, | ||
+ | |||
+ | # --- ASYNC TASKS --- | ||
+ | |||
+ | async def monitor_rfid(): | ||
+ | global door_opened, | ||
+ | while True: | ||
+ | buzzer.duty(0) | ||
+ | if rc522.PICC_IsNewCardPresent(): | ||
+ | if rc522.PICC_ReadCardSerial(): | ||
+ | data = sum(rc522.uid.uidByte[0: | ||
+ | print(" | ||
+ | current_user = data | ||
+ | print(" | ||
+ | | ||
+ | if data == AUTHORIZED_ID: | ||
+ | if door_opened: | ||
+ | print(" | ||
+ | duration = time.time() - open_time | ||
+ | print(" | ||
+ | await close_door() | ||
+ | if duration > 15: | ||
+ | await play_alarm() | ||
+ | await message_queue.put((" | ||
+ | print(" | ||
+ | |||
+ | else: | ||
+ | await message_queue.put((" | ||
+ | else: | ||
+ | await open_door() | ||
+ | |||
+ | # Time-based snacking roast | ||
+ | current_hour = time.localtime()[3] | ||
+ | if current_hour >= 23 or current_hour < 5: | ||
+ | await message_queue.put((" | ||
+ | print(" | ||
+ | else: | ||
+ | await message_queue.put((" | ||
+ | |||
+ | else: | ||
+ | print(" | ||
+ | await message_queue.put((" | ||
+ | await asyncio.sleep(1) | ||
+ | |||
+ | def monitor_steam_sensor(): | ||
+ | print(" | ||
+ | while True: | ||
+ | try: | ||
+ | analog_value = STEAM_SENSOR.read() | ||
+ | print(" | ||
+ | |||
+ | if analog_value > STEAM_THRESHOLD: | ||
+ | await message_queue.put((" | ||
+ | print(" | ||
+ | |||
+ | await asyncio.sleep(2) | ||
+ | |||
+ | except Exception as e: | ||
+ | print(" | ||
+ | await asyncio.sleep(2) | ||
+ | | ||
+ | async def monitor_humidity(): | ||
+ | while True: | ||
+ | try: | ||
+ | DHT_SENSOR.measure() # Start DHT11 to measure data once. | ||
+ | # Call the built-in function of DHT to obtain temperature | ||
+ | # and humidity data and print them in “Shell”. | ||
+ | temperature_value = DHT_SENSOR.temperature() | ||
+ | humidity_value = DHT_SENSOR.humidity() | ||
+ | print(' | ||
+ | if temperature_value > TEMP_THRESHOLD: | ||
+ | await message_queue.put((" | ||
+ | print(" | ||
+ | elif humidity_value > HUMIDITY_THRESHOLD: | ||
+ | await message_queue.put((" | ||
+ | print(" | ||
+ | except Exception as e: | ||
+ | print(" | ||
+ | await asyncio.sleep(2) | ||
+ | |||
+ | async def monitor_compartments(): | ||
+ | button1 = Pin(16, Pin.IN, Pin.PULL_UP) | ||
+ | |||
+ | button2 = Pin(27, Pin.IN, Pin.PULL_UP) | ||
+ | |||
+ | #Nest two for loops to make the module repeatedly display five states of red, green, blue, white and OFF. | ||
+ | |||
+ | while True: | ||
+ | try: | ||
+ | btnVal1 = button1.value() | ||
+ | |||
+ | # | ||
+ | |||
+ | if(btnVal1 == 0): | ||
+ | await message_queue.put((" | ||
+ | |||
+ | print(" | ||
+ | |||
+ | btnVal2 = button2.value() | ||
+ | |||
+ | if(btnVal2 == 0): | ||
+ | await message_queue.put((" | ||
+ | |||
+ | print(" | ||
+ | except Exception as e: | ||
+ | print(" | ||
+ | await asyncio.sleep(0.5) | ||
+ | |||
+ | async def monitor_gas(): | ||
+ | while True: | ||
+ | try: | ||
+ | gas_level = GAS_SENSOR.value() | ||
+ | print(" | ||
+ | if not gas_level: | ||
+ | await message_queue.put((" | ||
+ | print(" | ||
+ | except Exception as e: | ||
+ | print(" | ||
+ | await asyncio.sleep(3) | ||
+ | |||
+ | # --- MAIN --- | ||
+ | async def main(): | ||
+ | await asyncio.gather( | ||
+ | monitor_rfid(), | ||
+ | monitor_humidity(), | ||
+ | monitor_compartments(), | ||
+ | monitor_steam_sensor(), | ||
+ | monitor_gas(), | ||
+ | message_handler() | ||
+ | ) | ||
+ | asyncio.run(main()) | ||
+ | </ | ||
+ |