/*
/ u8x8
/ home :https://github.com/olikraus/u8g2/wiki
/ reference:https://github.com/olikraus/u8g2/wiki/u8x8reference#setflipmode
/
/ DHT22
/ https://github.com/nethoncho/Arduino-DHT22
/
/
*/
#include <U8x8lib.h>
#include <DHT.h>
#include <stdio.h>
#define ledR 4
#define ledG 5
#define SW 6
#define BZZ 7
#define DHTpin 8
#define MODE 0 //0:3通り 1:VRで設定
const int prm[3][5] PROGMEM = {
{0, 35, 30, 10, 0},
{1, 40, 35, 20, 10},
{2, 30, 25, 5, 0},
};
int slevel[5] = {0, 35, 30, 10, 0};
float temp;
byte swr = HIGH;
byte mode = 0;
byte ledMODE = 3;
byte bzzf=0;
unsigned long tb;
U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(U8X8_PIN_NONE);
DHT dht(DHTpin, DHT22);
void setup() {
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(BZZ, OUTPUT);
pinMode(SW, INPUT_PULLUP);
Serial.begin(115200);
u8x8.begin();
u8x8.setFlipMode(1);
//u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.setFont(u8x8_font_8x13_1x2_r);
u8x8.setCursor(0, 0);
u8x8.print("Wite!");
dht.begin();
delay(2000);
dspLevel();
}
void loop() {
byte sw, wk;
static byte dt = 0;
if (dt > 25) {
dspTemp();
setLed();
dt = 0;
}
ledBLK();
if(bzzf==1 && (millis()-tb>=60000)){
tone(BZZ,440,100);
tb=millis();
}
if (getSW()) {
setTempLevel();
}
dt++;
delay(20);
}
void setTempLevel() {
if (MODE == 0) {
setMode0();
} else {
setMode1();
}
}
void setMode0() {
int i,r;
r=(slevel[0]+1)%3;
for(i=0;i<5;i++)
slevel[i]=pgm_read_word(&prm[r][i]);
dspLevel();
}
void setMode1() {
int lv = 1, val;
char buf[16];
u8x8.clear();
u8x8.setCursor(0, 0);
u8x8.print("Set Temp. level");
while (lv < 5) {
u8x8.setCursor(0, 2);
sprintf(buf, "Level-%d: ", lv);
u8x8.print(buf);
sprintf(buf, "%3d", slevel[lv]);
u8x8.print(buf);
while (getSW() == 0) {
val = analogRead(A0);
val = map(val, 0, 1024, -40, 80);
u8x8.setCursor(0, 4);
sprintf(buf, "%10d", val);
u8x8.print(buf);
delay(20);
}
slevel[lv] = val;
lv++;
}
dspLevel();
}
void setLedMode(float tv) {
if (tv >= slevel[1]) {
ledMODE = 1;
} else if (tv >= slevel[2]) {
ledMODE = 2;
} else if (tv > slevel[3]) {
ledMODE = 3;
} else if (tv > slevel[4]) {
ledMODE = 4;
} else {
ledMODE = 5;
}
Serial.println(ledMODE);
}
void setLed() {
byte wk = ledMODE;
setLedMode(temp);
if (wk == ledMODE)return;
if (ledMODE == 3) {
digitalWrite(ledR, LOW);
digitalWrite(ledG, LOW);
}
if (ledMODE < 3) {
digitalWrite(ledG, LOW);
digitalWrite(ledR, HIGH);
}
if (ledMODE > 3) {
digitalWrite(ledR, LOW);
digitalWrite(ledG, HIGH);
}
if(ledMODE==1 || ledMODE==5){
bzzf=1;
tone(BZZ,440,100);
tb=millis();
}else{
bzzf=0;
}
}
void ledBLK() {
static byte t = 0;
t++;
if (t < 10)return;
if (ledMODE == 5) {
digitalWrite(ledG, !digitalRead(ledG));
}
if (ledMODE == 1) {
digitalWrite(ledR, !digitalRead(ledR));
}
t = 0;
}
byte getSW() {
byte sw, ret = 0;
sw = digitalRead(SW);
if (sw == LOW && swr == HIGH)ret = 1;
swr = sw;
return ret;
}
void dspLevel() {
u8x8.clear();
u8x8.setCursor(0, 0);
u8x8.print("Temperature");
u8x8.setCursor(0, 6);
u8x8.print("SL:");
for (int i = 1; i < 5; i++) {
u8x8.print(slevel[i]);
u8x8.print(" ");
}
}
void dspTemp() {
u8x8.setCursor(0, 2);
u8x8.print(getTemp());
}
float getTemp() {
temp = dht.readTemperature();
return temp;
}