Skip to content

Instantly share code, notes, and snippets.

@dmitmel
Last active November 2, 2015 15:47
Show Gist options
  • Save dmitmel/f9a3f0513b1f29626394 to your computer and use it in GitHub Desktop.
Save dmitmel/f9a3f0513b1f29626394 to your computer and use it in GitHub Desktop.
Clever House
// ######################################### Загружаем нужные библиотеки ########################################
#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);
}
}
#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