/**
* 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_RF24
//#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);
}