Last active
November 2, 2015 15:47
-
-
Save dmitmel/f9a3f0513b1f29626394 to your computer and use it in GitHub Desktop.
Clever House
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ######################################### Загружаем нужные библиотеки ######################################## | |
#include <IRremote.h> | |
#include <LiquidCrystal.h> | |
#include <Ultrasonic.h> | |
// ######################################### Объвляем нужные объекты ############################################ | |
IRrecv irrecv(3); | |
decode_results results; | |
// ######################################### Объвляем нужные переменные ######################################### | |
char* labels[] = {"Pretty-Lights", "Disco!", "Light-Piano", "E-Ruler", "Temperature", "Cooler", "Timer", "Reset"}; | |
const int funcCount = 8; | |
int page = 5; | |
boolean lights = true; | |
boolean debug = false; | |
boolean mute = debug; | |
int cmd = -1; | |
bool funcs[] = {false, false, false, false, false, false, false, false}; | |
boolean trig = false; | |
const int ledsPin = 9; | |
const int dispPin = 2; | |
const int buzzerPin = 7; | |
float dist = 0; | |
float temp = 0; | |
float timer = 10.0; | |
boolean waiting = false; | |
// ######################################### Спец-символы для загрузки ######################################### | |
byte s20[8] = { | |
0b10000, | |
0b10000, | |
0b10000, | |
0b10000, | |
0b10000, | |
0b10000, | |
0b10000, | |
0b10000, | |
}; | |
byte s40[8] = { | |
0b11000, | |
0b11000, | |
0b11000, | |
0b11000, | |
0b11000, | |
0b11000, | |
0b11000, | |
0b11000, | |
}; | |
byte s60[8] = { | |
0b11100, | |
0b11100, | |
0b11100, | |
0b11100, | |
0b11100, | |
0b11100, | |
0b11100, | |
0b11100, | |
}; | |
byte s80[8] = { | |
0b11110, | |
0b11110, | |
0b11110, | |
0b11110, | |
0b11110, | |
0b11110, | |
0b11110, | |
0b11110, | |
}; | |
byte s100[8] = { | |
0b11111, | |
0b11111, | |
0b11111, | |
0b11111, | |
0b11111, | |
0b11111, | |
0b11111, | |
0b11111, | |
}; | |
// ######################################### Объвляем нужные классы ############################################# | |
LiquidCrystal lcd(4, 5, 10, 11, 12, 13); | |
Ultrasonic ruler(8, 6); | |
void setup() { | |
// ######################################### Тех-старт ######################################################## | |
Serial.begin(9600); | |
irrecv.enableIRIn(); | |
pinMode(2, OUTPUT); | |
pinMode(9, OUTPUT); | |
lcd.begin(16, 2); | |
lcd.createChar(0, s20); // Создание символов | |
lcd.createChar(1, s40); | |
lcd.createChar(2, s60); | |
lcd.createChar(3, s80); | |
lcd.createChar(4, s100); | |
digitalWrite(2, HIGH); // Вкл. подсветки | |
// ######################################### Старт загрузки ################################################### | |
if (!debug) { | |
lcd.setCursor(0, 0); | |
lcd.print(" LOADING... "); | |
for (int i = 0; i < 16; i++) { | |
for (int var = 0; var < 5; var++) { | |
lcd.setCursor(i, 1); | |
if (var == 0 || var == 1) lcd.write(var); | |
else lcd.write(var); | |
delay(25); | |
} | |
} | |
delay(250); | |
lcd.setCursor(0, 0); | |
lcd.clear(); | |
lcd.print(" COMPLETED! "); | |
} | |
// ######################################### "ЭПИЧНЫЙ ЗВУК" ################################################### | |
if (!mute) { | |
tone(buzzerPin, 4500, 500); | |
delay(500); | |
tone(buzzerPin, 4000, 500); | |
delay(500); | |
tone(buzzerPin, 3500, 500); | |
delay(500); | |
tone(buzzerPin, 4000, 500); | |
delay(500); | |
tone(buzzerPin, 4500, 500); | |
delay(1000); | |
} | |
lcd.clear(); | |
} | |
void loop() { | |
// ######################################### Вот здесь принимаем DAT'у с пульта ################################ | |
if (irrecv.decode(&results)) { | |
cmd = results.value; | |
if (debug) Serial.println(cmd, DEC); | |
if (cmd == -7651) { // ВКЛ./ВЫКЛ. звука | |
mute = !mute; | |
} | |
if (cmd == -23971) { // Подсветка экрана | |
lights = !lights; | |
} | |
if (cmd == -28561) { // Перемотка страниц | |
page++; | |
lcd.clear(); | |
} | |
if (cmd == -22441) { | |
page--; | |
lcd.clear(); | |
} | |
if (cmd == 25245 && page != 5 && page != 8) { // ВКЛ./ВЫКЛ. функций на страницах | |
funcs[page - 1] = !funcs[page - 1]; | |
} | |
if (page == 7 && cmd == -15811 && timer <= 180) timer += 5.0; // Функции для таймера - специально чтоб изменять время ожидания | |
if (page == 7 && cmd == 765 && timer > 0) timer -= 5.0; | |
if (page == 7 && (cmd == 8925 || cmd == 25245)) waiting = !waiting; // Функция для таймера - старт/стоп | |
if (page == 8 && cmd == -26521) { //Пере-запуск основной платы (мастера) | |
lcd.clear(); | |
Serial.print("reset();"); | |
} | |
irrecv.resume(); | |
} | |
// ################################################# А здесь код для каждой страницы ################################################## | |
if (lights) { // Подсветка экрана | |
digitalWrite(dispPin, HIGH); | |
} else { | |
digitalWrite(dispPin, LOW); | |
} | |
if (!mute && cmd != -1) { // ВКЛ./ВЫКЛ. звука | |
tone(buzzerPin, 3700, 100); | |
cmd = -1; | |
} | |
if (page < 1) page = funcCount; // Дли-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-инный на код для страниц | |
if (page > funcCount) page = 1; | |
lcd.setCursor(0, 0); | |
lcd.print(page); | |
lcd.print(". "); | |
lcd.print(labels[page - 1]); | |
lcd.setCursor(0, 1); | |
if (page != 4 && page != 8 && page != 5) { | |
if (funcs[page - 1]) { | |
lcd.setCursor(13, 1); | |
lcd.print(" ON"); | |
} else { | |
lcd.setCursor(12, 1); | |
lcd.print(" OFF"); | |
} | |
} | |
if (page == 4) { // Линейка | |
if (millis() % 100 == 0) dist = ruler.Ranging(CM); | |
lcd.setCursor(0, 1); | |
lcd.print(dist); | |
lcd.print(" "); | |
} | |
if (funcs[0] || funcs[1]) { // Гирлянда и "ДИСКО!" режим | |
if (funcs[0]) digitalWrite(ledsPin, HIGH); | |
if (funcs[1] && millis() % random(30, 40) == 0) trig = !trig; | |
} else { | |
digitalWrite(ledsPin, LOW); | |
} | |
if (funcs[1]) { | |
if (trig) { | |
digitalWrite(ledsPin, HIGH); | |
} else { | |
digitalWrite(ledsPin, LOW); | |
} | |
} | |
if (funcs[2]) { //П-п-пи-и-иа-а-ан-н-ни-и-ин-н-но-о-о | |
int val = analogRead(A1); | |
int freq = map(val, 925, 1010, 3500, 4500); | |
if (val < 980) { | |
tone(buzzerPin, freq, 100); | |
} | |
} | |
if (page == 7) { // Если на странице таймера... | |
funcs[6] = waiting; | |
lcd.setCursor(0, 1); | |
lcd.print("T:"); // 1. Печатаем время | |
lcd.print(timer); | |
lcd.print(" "); | |
if (timer < 0) timer = 0; | |
if (timer > 180) timer = 180; | |
if (waiting && timer > 0 && millis() % 2) timer -= 0.041; // 2. Отнимаем число | |
if (timer <= 0 && !mute && waiting) { // 3.1. Делаем звук | |
tone(buzzerPin, 3500, 1000); | |
delay(1000); | |
} | |
if (timer <= 0) waiting = false; // 4. Тонкости настройки | |
if (!mute && waiting && int(timer * 10) % 10 == 0 && timer > 0) tone(buzzerPin, 3500, 35); // 3.2. Делаем звук | |
Serial.print("servo("); // 5. Отправляем команду серве | |
Serial.print(int(timer) % 180); | |
Serial.print(");"); | |
} | |
if (page == 8) { // страница пере-запуска основной платы (мастера) | |
lcd.setCursor(11, 1); | |
lcd.print("RESET"); | |
} | |
if (page == 5) { | |
lcd.setCursor(0, 1); | |
lcd.print("Temp: "); | |
int temp = analogRead(A0); | |
temp = map(temp, 0, 1023, 0, 25); | |
lcd.print(temp); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Servo.h> | |
#define VALUE 0 | |
#define COMMAND 1 | |
Servo servo; | |
String message; | |
int servoState = 0; | |
String cmd = ""; | |
String scan(int action, String msg) { | |
String out = ""; | |
if (action == COMMAND) { | |
for (int i = 0; msg[i] != '('; i++) { | |
out += msg[i]; | |
} | |
} else if (action == VALUE) { | |
int var = 0; | |
for (int i = 0; msg[i] != '('; i++) { | |
var++; | |
} | |
for (int i = var + 1; msg[i] != ')'; i++) { | |
out += msg[i]; | |
} | |
} | |
return out; | |
} | |
void setup() { | |
servo.attach(9); | |
Serial.begin(9600); | |
servo.write(0); | |
pinMode(12, OUTPUT); | |
digitalWrite(12, HIGH); | |
} | |
void loop() { | |
while (Serial.available()) { | |
char input = Serial.read(); | |
if (input == ';') { | |
cmd = message; | |
message = ""; | |
Serial.println(scan(COMMAND, cmd)); | |
Serial.println(scan(VALUE, cmd)); | |
if (scan(COMMAND, cmd) == "servo") { | |
int servoNew = scan(VALUE, cmd).toInt(); | |
while (servoState > servoNew) { | |
servoState--; | |
servo.write(servoState); | |
delay(5); | |
} | |
while (servoState < servoNew) { | |
servoState++; | |
servo.write(servoState); | |
delay(1); | |
} | |
} else if (scan(COMMAND, cmd) == "reset") { | |
digitalWrite(12, LOW); | |
delay(10); | |
digitalWrite(12, HIGH); | |
} | |
} else { | |
message += input; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment