Hi,
my wife like to use essential oil in the house, but basic humidifier use a lot of water and increase the ambiant humidity in the room.
I notice also that the smell of the oil is not really intense.
So the idea, modify a cheap ultrasonic humidifier and create an oil diffuser without dealing with water.
The start, a cheap Donut humidifier 6$ on ebay.
then, I decide to build a wood enclosure with a removable top for easy oil bottle changing and put everything together.
The top is maintain by 2 small magnet, and the ceramic caps just touch the top of the Bottle wick.
Regarding the Sketch, Its like a dimmer, V_status for the On/Off state, V_percentage for the frequency.
/**
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
*/
//#################
// INCLUDE
//#################
#include <SPI.h>
#include <MySensor.h>
#include <Time.h>
//#################
// OPTION
//#################
#define DEBUG
#define MIN_DELAY 10
#define MAX_DELAY 90
bool Diffuser_status;
uint8_t Diffuser_Freq;
int delaytowait;
unsigned long lastUpdate;
int nbseconds = 0;
//#################
// CHILD ID
//#################
#define CHILD_ID_DIFFUSER 0
//#################
// PIN DEF
//#################
#define DIFFUSER_PIN A3
//#################
// VAR
//#################
MySensor gw;
//#################
// Messsage Settings
//#################
MyMessage IntensityMsg(CHILD_ID_DIFFUSER, V_PERCENTAGE);
MyMessage StatusMsg(CHILD_ID_DIFFUSER, V_STATUS);
void setup()
{
gw.begin(incomingMessage, AUTO, false);
pinMode(DIFFUSER_PIN, OUTPUT);
digitalWrite(DIFFUSER_PIN, HIGH);
//#################
// Info
//#################
gw.sendSketchInfo("Difuser", "1.0");
//#################
// Send Presentation
//#################
gw.present( CHILD_ID_DIFFUSER, S_DIMMER );
Diffuser_status = gw.loadState(5);
Diffuser_Freq = gw.loadState(8);
gw.send(StatusMsg.set(Diffuser_status ? true : false), true);
gw.wait(200);
gw.send(IntensityMsg.set(Diffuser_Freq),true);
}
void loop()
{
unsigned long now = millis();
gw.process();
if (now - lastUpdate > 1000) {
nbseconds++;
lastUpdate = now;
}
float delaytowaittmp = ((MAX_DELAY - MIN_DELAY) / 100.0) * Diffuser_Freq;
int delaytowait = delaytowaittmp;
if ((Diffuser_status == true) && (nbseconds > delaytowait)) {
digitalWrite(DIFFUSER_PIN, LOW);
delay(100);
digitalWrite(DIFFUSER_PIN, HIGH);
delay(100);
digitalWrite(DIFFUSER_PIN, LOW);
delay(100);
digitalWrite(DIFFUSER_PIN, HIGH);
delay(100);
nbseconds = 0;
}else if(nbseconds > delaytowait)
{
nbseconds = 0;
}
}
void incomingMessage(const MyMessage &message) {
if (message.type == V_STATUS || message.type == V_PERCENTAGE) {
int req_status = -1;
int req_percentage = -1;
if (message.type == V_STATUS)
{
req_status = message.getBool();
Diffuser_status = req_status;
gw.saveState(5, Diffuser_status);
}
if (message.type == V_PERCENTAGE)
{
req_percentage = message.getByte();
Diffuser_Freq = req_percentage;
gw.saveState(8, Diffuser_Freq);
}
}
}
Now, you can have good smell in every room for some dollars when you arrived from work, when you start cooking, when going to sleep or entering in your Bat Cave !