meta data for this page
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| ixc2025:lappeenranta:team_1:start [2025/05/21 15:04] – [9. Final Code] jrleon | 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 ==== | ||
| Line 182: | Line 232: | ||
| import dht | import dht | ||
| from mfrc522_i2c import mfrc522 | 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 | # Constants | ||
| Line 227: | Line 292: | ||
| STEAM_SENSOR.atten(ADC.ATTN_11DB) | STEAM_SENSOR.atten(ADC.ATTN_11DB) | ||
| STEAM_THRESHOLD = 800 # Analog value above this = steam detected | STEAM_THRESHOLD = 800 # Analog value above this = steam detected | ||
| + | |||
| + | current_user = " | ||
| Line 262: | Line 329: | ||
| - | async def scroll_text(text, | + | async def scroll_text(text, |
| if len(text) <= 16: | if len(text) <= 16: | ||
| lcd.move_to(0, | lcd.move_to(0, | ||
| Line 271: | Line 338: | ||
| lcd.putstr(text[i: | lcd.putstr(text[i: | ||
| await asyncio.sleep(delay) | await asyncio.sleep(delay) | ||
| - | + | | |
| - | async def show_message(upper, lower="" | + | async def message_handler(): |
| - | lcd.clear() | + | while True: |
| - | await scroll_text(upper, | + | |
| - | await scroll_text(lower, | + | lcd.clear() |
| + | await scroll_text(upper, | ||
| + | await scroll_text(lower, | ||
| # --- ASYNC TASKS --- | # --- ASYNC TASKS --- | ||
| Line 287: | Line 356: | ||
| data = sum(rc522.uid.uidByte[0: | data = sum(rc522.uid.uidByte[0: | ||
| print(" | print(" | ||
| + | current_user = data | ||
| + | print(" | ||
| + | | ||
| if data == AUTHORIZED_ID: | if data == AUTHORIZED_ID: | ||
| if door_opened: | if door_opened: | ||
| + | print(" | ||
| duration = time.time() - open_time | duration = time.time() - open_time | ||
| print(" | print(" | ||
| Line 294: | Line 367: | ||
| if duration > 15: | if duration > 15: | ||
| await play_alarm() | await play_alarm() | ||
| - | await show_message("Your indecision is heating the planet." | + | await message_queue.put(("Your indecision is heating the planet." |
| + | print(" | ||
| else: | else: | ||
| - | await show_message(" | + | await message_queue.put((" |
| else: | else: | ||
| await open_door() | await open_door() | ||
| Line 303: | Line 378: | ||
| current_hour = time.localtime()[3] | current_hour = time.localtime()[3] | ||
| if current_hour >= 23 or current_hour < 5: | if current_hour >= 23 or current_hour < 5: | ||
| - | await show_message("You hungry or just emotionally empty again?", | + | await message_queue.put(("You hungry or just emotionally empty again?", |
| + | print(" | ||
| else: | else: | ||
| - | await show_message(" | + | await message_queue.put((" |
| else: | else: | ||
| print(" | print(" | ||
| - | await show_message(" | + | await message_queue.put((" |
| - | await asyncio.sleep(0.5) | + | await asyncio.sleep(1) |
| def monitor_steam_sensor(): | def monitor_steam_sensor(): | ||
| Line 320: | Line 396: | ||
| if analog_value > STEAM_THRESHOLD: | if analog_value > STEAM_THRESHOLD: | ||
| - | await show_message("The fridge is not your sauna, pal." | + | await message_queue.put(("The fridge is not your sauna, pal.", "")) |
| - | print(" | + | print(" |
| await asyncio.sleep(2) | await asyncio.sleep(2) | ||
| Line 327: | Line 403: | ||
| except Exception as e: | except Exception as e: | ||
| print(" | print(" | ||
| - | await asyncio.sleep(4) | + | await asyncio.sleep(2) |
| | | ||
| async def monitor_humidity(): | async def monitor_humidity(): | ||
| Line 339: | Line 415: | ||
| print(' | print(' | ||
| if temperature_value > TEMP_THRESHOLD: | if temperature_value > TEMP_THRESHOLD: | ||
| - | await show_message("Want to cool the Sahara too?") | + | await message_queue.put(("Want to cool the Sahara too?", "" |
| + | print(" | ||
| elif humidity_value > HUMIDITY_THRESHOLD: | elif humidity_value > HUMIDITY_THRESHOLD: | ||
| - | await show_message("Too hot in here!", | + | await message_queue.put(("Too hot in here!", |
| + | print(" | ||
| except Exception as e: | except Exception as e: | ||
| print(" | print(" | ||
| - | await asyncio.sleep(4) | + | await asyncio.sleep(2) |
| async def monitor_compartments(): | async def monitor_compartments(): | ||
| Line 360: | Line 438: | ||
| if(btnVal1 == 0): | if(btnVal1 == 0): | ||
| + | await message_queue.put((" | ||
| - | print(" | + | print(" |
| btnVal2 = button2.value() | btnVal2 = button2.value() | ||
| if(btnVal2 == 0): | if(btnVal2 == 0): | ||
| + | await message_queue.put((" | ||
| - | print(" | + | print(" |
| except Exception as e: | except Exception as e: | ||
| print(" | print(" | ||
| - | await asyncio.sleep(0.1) | + | await asyncio.sleep(0.5) |
| async def monitor_gas(): | async def monitor_gas(): | ||
| Line 378: | Line 458: | ||
| print(" | print(" | ||
| if not gas_level: | if not gas_level: | ||
| - | await show_message("You really like cultivating diseases, huh?", "Did your fruit die?") | + | await message_queue.put(("You really like cultivating diseases, huh?", "Did your fruit die?")) |
| + | print(" | ||
| except Exception as e: | except Exception as e: | ||
| print(" | print(" | ||
| - | await asyncio.sleep(5) | + | await asyncio.sleep(3) |
| # --- MAIN --- | # --- MAIN --- | ||
| Line 390: | Line 471: | ||
| monitor_compartments(), | monitor_compartments(), | ||
| monitor_steam_sensor(), | monitor_steam_sensor(), | ||
| - | monitor_gas() | + | monitor_gas(), |
| + | message_handler() | ||
| ) | ) | ||