202 lines
6.0 KiB
C++
202 lines
6.0 KiB
C++
/**
|
|
* 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.
|
|
*
|
|
*******************************
|
|
*
|
|
* REVISION HISTORY
|
|
* Version 1.0 - Henrik Ekblad
|
|
*
|
|
* DESCRIPTION
|
|
* http://www.mysensors.org/build/scene_controller
|
|
* Touch Display Scene Controller build using a touch enabled tft display
|
|
* attached to a ATMega 2560. This example fetches time from controller and sends
|
|
* in scene commands to the controller.
|
|
* Short press sends V_SCENE_ON and long press (>0.5sec) sends V_SCENE_OFF.
|
|
*
|
|
* Henrik Ekblad <henrik.ekblad@mysensors.org>
|
|
*
|
|
* This example uses:
|
|
* UTFT library: http://www.henningkarlsen.com/electronics/library.php?id=51
|
|
* Convert your own images here: http://www.henningkarlsen.com/electronics/t_imageconverter565.php
|
|
*
|
|
* The 3v3 output on the ATMega2560 is especially bad. I had to use a step down
|
|
* on the 5V output to get solid transmissions.
|
|
*
|
|
*
|
|
* Connect radio
|
|
* ----------------------------------
|
|
* Radio Arduino Pin
|
|
* ----------------------------------
|
|
* GND GND
|
|
* 5V -> Step down -> 3V3 (see buying guide for help finding step-down)
|
|
* SCK 14
|
|
* MOSI 15
|
|
* MISO 16
|
|
* CE 17
|
|
* CSN 18
|
|
*
|
|
*/
|
|
|
|
// Enable debug prints to serial monitor
|
|
#define MY_DEBUG
|
|
|
|
// Enable soft spi as radio has a hard time sharing spi
|
|
#define MY_SOFTSPI
|
|
|
|
// Enable and select radio type attached
|
|
#define MY_RADIO_NRF24
|
|
//#define MY_RADIO_RFM69
|
|
|
|
#include <TimeLib.h>
|
|
#include <SPI.h>
|
|
#include <MySensors.h>
|
|
#include <stdarg.h>
|
|
#include <UTFT.h>
|
|
#include <UTouch.h>
|
|
#include <UTFT_Buttons.h>
|
|
#include <avr/pgmspace.h>
|
|
#include "arial_bold.c"
|
|
#include "ArialNumFontPlus.c"
|
|
#include "logo.c"
|
|
|
|
#define CHILD_ID 1
|
|
|
|
int LONG_PRESS = 500; // Number of millisecons to trinnger scene off for button push
|
|
int RESEND_DEBOUNCE = 2000; // Number of millisecons interval between sending of same
|
|
// scene number again.
|
|
// This is used to avoid unwanted re-trigger when using
|
|
// a sensetive touch diplay.
|
|
|
|
// Add your buttons here. Max is 5 if you still want time at the top.
|
|
char *buttons[] = {
|
|
(char *)"Good Morning",
|
|
(char *)"Clean Up!",
|
|
(char *)"All Lights Off",
|
|
(char *)"Music On/Off"
|
|
};
|
|
|
|
const int buttonCount = sizeof(buttons)/sizeof(char *);
|
|
const int padding = 10;
|
|
const int topBarHeight = 60;
|
|
|
|
MyMessage on(CHILD_ID, V_SCENE_ON);
|
|
MyMessage off(CHILD_ID, V_SCENE_OFF);
|
|
|
|
UTFT myGLCD(ITDB32S,38,39,40,41);
|
|
UTouch myTouch( 6, 5, 4, 3, 2);
|
|
UTFT_Buttons myButtons(&myGLCD, &myTouch);
|
|
bool timeReceived = false;
|
|
unsigned long lastTimeUpdate=0, lastRequest=0;
|
|
char timeBuf[20];
|
|
|
|
|
|
void setup()
|
|
{
|
|
myGLCD.InitLCD();
|
|
myGLCD.clrScr();
|
|
myGLCD.setFont((uint8_t*)ArialNumFontPlus);
|
|
myGLCD.setColor(100, 255, 100);
|
|
myGLCD.setBackColor(0, 0, 0);
|
|
myGLCD.drawBitmap (0, 0, 60, 60, (unsigned int*)logo);
|
|
|
|
myTouch.InitTouch();
|
|
myTouch.setPrecision(PREC_MEDIUM);
|
|
|
|
myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_WHITE, VGA_RED, VGA_BLUE);
|
|
myButtons.setTextFont((uint8_t*)arial_bold);
|
|
int height = (myGLCD.getDisplayYSize()-topBarHeight-(padding*(buttonCount+2)))/buttonCount;
|
|
|
|
// Add buttons
|
|
for (int i=0; i<buttonCount;i++) {
|
|
int y = topBarHeight + padding+(i*(height+padding));
|
|
myButtons.addButton( padding, y, myGLCD.getDisplayXSize()-padding*2, height, buttons[i]);
|
|
}
|
|
myButtons.drawButtons();
|
|
|
|
// Request time from controller.
|
|
requestTime();
|
|
}
|
|
|
|
void presentation() {
|
|
// Send the sketch version information to the gateway and Controller
|
|
sendSketchInfo("Scene Ctrl", "1.0");
|
|
present(CHILD_ID, S_SCENE_CONTROLLER);
|
|
}
|
|
|
|
|
|
int lastPressedButton = -1;
|
|
unsigned long lastPressedButtonTime = 0;
|
|
|
|
void loop()
|
|
{
|
|
unsigned long now = millis();
|
|
|
|
if (myTouch.dataAvailable()) {
|
|
int pressedButton = myButtons.checkButtons();
|
|
|
|
if (pressedButton>=0) {
|
|
bool longPress = millis()-now>(unsigned long)LONG_PRESS;
|
|
|
|
if (pressedButton != lastPressedButton || now-lastPressedButtonTime > (unsigned long)RESEND_DEBOUNCE) {
|
|
if (longPress) {
|
|
send(off.set(pressedButton));
|
|
Serial.print("Long pressed: ");
|
|
} else {
|
|
send(on.set(pressedButton));
|
|
Serial.print("Pressed: ");
|
|
}
|
|
Serial.println(pressedButton);
|
|
lastPressedButton = pressedButton;
|
|
lastPressedButtonTime=now;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If no time has been received yet, request it every 10 second from controller
|
|
// When time has been received, request update every hour
|
|
if ((!timeReceived && now-lastRequest > (unsigned long)10*1000)
|
|
|| (timeReceived && now-lastRequest > (unsigned long)60*1000*60)) {
|
|
// Request time from controller.
|
|
Serial.println("requesting time");
|
|
requestTime();
|
|
lastRequest = now;
|
|
}
|
|
|
|
// Update time every second
|
|
if (timeReceived && now-lastTimeUpdate > 1000) {
|
|
printTime();
|
|
lastTimeUpdate = now;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// This is called when a new time value was received
|
|
void receiveTime(unsigned long time) {
|
|
// Ok, set incoming time
|
|
setTime(time);
|
|
timeReceived = true;
|
|
}
|
|
|
|
void printTime() {
|
|
sprintf(timeBuf, "%02d:%02d:%02d", hour(), minute(), second());
|
|
myGLCD.print(timeBuf, 60,7);
|
|
}
|
|
|
|
|