废墟 发表于 2015-5-7 00:31:55

根据温度自动开关空调,已成功。【付代码下载】

本帖最后由 废墟 于 2015-5-7 23:44 编辑

家有龙猫,那玩意儿太怕热,夏天就要来了,以前都是上班的时候就要把空调打开,琢磨着太费电,于是有了这个小玩意儿。

uno只有一个5v输出口,所以我把温度传感器的供电放在3.3V上,经过测试没有问题,可以正常使用。

需要:
arduino uno
温度传感器DS18B20模块
红外发射模块
9V电池

代码如下,参考了很多人的帖子,不一一致谢。


#include <avr/sleep.h>
#include <avr/wdt.h>
#include <IRremote.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2

volatile byte count = 0;
volatile byte stat = 0;

unsigned int raw_AC_open = {8950, 4350, 700, 1600, 700, 500, 650, 550, 650, 1600, 700, 500, 650, 550, 650, 500, 650, 550, 650, 500, 650, 1600, 700, 500, 700, 1550, 700, 500, 700, 500, 650, 500, 700, 500, 650, 550, 650, 500, 650, 500, 700, 500, 700, 450, 700, 500, 700, 500, 650, 500, 700, 500, 650, 550, 650, 450, 700, 550, 650, 1550, 700, 550, 650, 1550, 700, 500, 700, 500, 700, 1550, 700, 500, 700};

unsigned int raw_AC_close = {9000, 4350, 700, 1600, 650, 500, 700, 500, 650, 500, 700, 500, 700, 450, 700, 550, 650, 500, 650, 500, 700, 1600, 700, 450, 700, 1600, 700, 450, 700, 500, 700, 450, 700, 500, 700, 450, 750, 500, 650, 500, 700, 450, 700, 500, 700, 500, 650, 500, 700, 500, 650, 500, 700, 500, 650, 550, 650, 450, 750, 1550, 700, 500, 700, 1550, 700, 500, 700, 450, 700, 1600, 700, 450, 700};

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

IRsendirsend;

float maxTemperature = 32.00;
float minTemperature = 27.00;

void setup() {
        sensors.begin();
        Setup_watchdog(9);
        ACSR |= _BV(ACD); //OFF ACD
        ADCSRA = 0; //OFF ADC
        Sleep_avr();//Sleep_Mode
}

void Setup_watchdog(byte time) {
        byte w_time;
        if (time > 9 ) time = 9;
        w_time = time & 7;
        if (time > 7) w_time |= (1 << 5);
        w_time |= (1 << WDCE);

        MCUSR &= ~(1 << WDRF);
        // start timed sequence
        WDTCSR |= (1 << WDCE) | (1 << WDE);
        // set new watchdog timeout value
        WDTCSR = w_time;
        WDTCSR |= _BV(WDIE);
}

ISR(WDT_vect) {
        ++count;
}

void Sleep_avr() {
        set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
        sleep_enable();
        sleep_mode();                        // System sleeps here
}

void loop()
{
        if (count >= 8) {
                count = 0;
//-------------------------------
                digitalWrite(13, HIGH);
                delay(100);
                sensors.requestTemperatures();
                if (sensors.getTempCByIndex(0) > maxTemperature) {
                        irsend.sendRaw(raw_AC_open, 74, 40);
                        stat = 1;
                } else if (sensors.getTempCByIndex(0) < minTemperature && stat == 1) {
                        irsend.sendRaw(raw_AC_close, 74, 40);
                        stat = 0;
                }
                digitalWrite(13, LOW);
//--------------------------------
                Sleep_avr();
        }
        else {
                Sleep_avr();//Continue Sleep
        }


}

havor 发表于 2015-5-7 09:44:24

有爱心的达人啊,非常实用的应用。激发了一个想法,要是客厅没人多长时间,就把空调和电视、机顶盒这些东西关掉来省电。

mavericklx 发表于 2015-5-7 11:40:50

顶~~! 参考着做一个玩玩

suoma 发表于 2015-5-7 21:22:52

谢谢分享学习一下

suoma 发表于 2015-5-7 21:23:35

温度传感器的供电放在3.3V上,我也试过

可恨的大菠萝 发表于 2015-5-7 22:56:41

楼主可以用半导体制冷片给龙猫单独做小空调哇,节约电还方便

yuanrongfa 发表于 2015-5-7 23:10:34

楼主,能不能把你可以用的IRremote库和那几个不是自带的库打包发上来的啊?你的空调是通过什么方式获得raw数组的? 我今天试了一个下午都没办法开得空调

废墟 发表于 2015-5-7 23:24:19

可恨的大菠萝 发表于 2015-5-7 22:56 static/image/common/back.gif
楼主可以用半导体制冷片给龙猫单独做小空调哇,节约电还方便

那个工作量太大了。。还是算了吧。。

废墟 发表于 2015-5-7 23:25:28

yuanrongfa 发表于 2015-5-7 23:10 static/image/common/back.gif
楼主,能不能把你可以用的IRremote库和那几个不是自带的库打包发上来的啊?你的空调是通过什么方式获得raw数 ...


这是全部打包代码,至于发送的开启和关闭空调代码你需要自己根据空调来弄,帖子也很多,我就不重复了。

可恨的大菠萝 发表于 2015-5-8 12:54:17

楼主可以买个小冷风机,我家仓鼠就是这样过的。一个月才2度电。
页: [1]
查看完整版本: 根据温度自动开关空调,已成功。【付代码下载】