Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Work from Stream 4 & 5 & 6
- Adding Google maps
- removing google maps
- Adding daylight savings support
- Adding in IP address display on startup
- Adding WifiManager
  • Loading branch information
witnessmenow committed Mar 27, 2018
1 parent e31e958 commit d8a36fb
Show file tree
Hide file tree
Showing 2 changed files with 199 additions and 39 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -0,0 +1 @@
AlarmClock/secret.h
237 changes: 198 additions & 39 deletions AlarmClock/AlarmClock.ino
Expand Up @@ -7,21 +7,46 @@

#include <TM1637Display.h>

#include "secret.h"

const char *ssid = "<SSID>";
const char *password = "<PASSWORD>";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

#include <Timezone.h> // https://github.com/JChristensen/Timezone Modified!

// For Webserver
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

// For WifiManager
#include <DNSServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager

#include <ArduinoJson.h>
// Available on the library manager (ArduinoJson)
// https://github.com/bblanchon/ArduinoJson

#include <GoogleMapsDirectionsApi.h>

#include <WiFiClientSecure.h>

bool enableTrafficAdjust = false;

//Free Google Maps Api only allows for 2500 "elements" a day, so carful you dont go over
unsigned long api_mtbs = 60000; //mean time between api requests
unsigned long api_due_time = 0;
bool firstTime = true;

String origin = "40.8359838,-73.8734402";
String destination = "40.8536064,-73.9667197";
String waypoints = ""; //You need to include the via: before your waypoint

//Optional
DirectionsInputOptions inputOptions;

// For storing configurations
#include "FS.h"
Expand All @@ -45,45 +70,81 @@ const uint8_t LETTER_F = SEG_A | SEG_E | SEG_F | SEG_G;

const uint8_t LETTER_O = SEG_C | SEG_D | SEG_E | SEG_G;

const uint8_t SEG_CONF[] = {
LETTER_C, // C
LETTER_O, // o
SEG_C | SEG_E | SEG_G, // n
LETTER_F // F
};

const uint8_t SEG_BOOT[] = {
LETTER_B, // b
LETTER_O, // o
LETTER_O, // o
SEG_D | SEG_E | SEG_F | SEG_G // t - kinda
};
};

ESP8266WebServer server(80);

const char *webpage =
const char *webpage =
#include "alarmWeb.h"
;
;

void handleRoot() {

server.send(200, "text/html", webpage);
}

void handleNotFound(){
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}

//MAPS_API_KEY

int alarmHour = 0;
int alarmMinute = 0;
bool alarmActive = false;
bool alarmHandled = false;
bool buttonPressed = false;

int trafficOffset = 0;

WiFiClientSecure client;
GoogleMapsDirectionsApi api(MAPS_API_KEY, client);

// From World clock example in timezone library
// United Kingdom (London, Belfast)
TimeChangeRule BST = {"BST", Last, Sun, Mar, 1, 60}; // British Summer Time
TimeChangeRule GMT = {"GMT", Last, Sun, Oct, 2, 0}; // Standard Time
Timezone UK(BST, GMT);

TimeChangeRule aEDT = {"AEDT", First, Sun, Oct, 2, 660}; // UTC + 11 hours
TimeChangeRule aEST = {"AEST", First, Sun, Apr, 3, 600}; // UTC + 10 hours
Timezone ausET(aEDT, aEST);

// US Eastern Time Zone (New York, Detroit)
TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, -240}; // Eastern Daylight Time = UTC - 4 hours
TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -300}; // Eastern Standard Time = UTC - 5 hours
Timezone usET(usEDT, usEST);

void configModeCallback (WiFiManager *myWiFiManager) {
Serial.println("Entered config mode");
Serial.println(WiFi.softAPIP());

display.setSegments(SEG_CONF);
}

void setup() {
Serial.begin(115200);

Expand All @@ -93,7 +154,7 @@ void setup() {
}

loadConfig();

display.setBrightness(0xff);
display.setSegments(SEG_BOOT);

Expand All @@ -104,18 +165,23 @@ void setup() {

attachInterrupt(BUTTON, interuptButton, RISING);

WiFi.begin(ssid, password);

while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
WiFiManager wifiManager;
wifiManager.setAPCallback(configModeCallback);
wifiManager.autoConnect("AlarmClock", "password");

Serial.println("");
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

IPAddress ipAddress = WiFi.localIP();
Serial.println(ipAddress);

display.showNumberDec(ipAddress[3], false);

delay(1000);



if (MDNS.begin("alarm")) {
Serial.println("MDNS Responder Started");
Expand All @@ -124,7 +190,7 @@ void setup() {
server.on("/", handleRoot);
server.on("/setAlarm", handleSetAlarm);



timeClient.begin();

Expand All @@ -133,6 +199,12 @@ void setup() {
server.begin();
Serial.println("HTTP Server Started");

//These are all optional (although departureTime needed for traffic)
inputOptions.departureTime = "now"; //can also be a future timestamp
inputOptions.trafficModel = "best_guess"; //Defaults to this anyways
inputOptions.avoid = "ferries";
inputOptions.units = "metric";

}

bool loadConfig() {
Expand Down Expand Up @@ -187,8 +259,8 @@ bool saveConfig() {
void handleSetAlarm() {

Serial.println("Setting Alarm");
for (uint8_t i=0; i<server.args(); i++){
if(server.argName(i) == "alarm") {
for (uint8_t i = 0; i < server.args(); i++) {
if (server.argName(i) == "alarm") {
String alarm = server.arg(i);
int indexOfColon = alarm.indexOf(":");
alarmHour = alarm.substring(0, indexOfColon).toInt();
Expand All @@ -204,7 +276,7 @@ void handleSetAlarm() {
server.send(200, "text/html", "Set Alarm");
}

void soundAlarm(){
void soundAlarm() {
digitalWrite(ALARM, HIGH);
delay(1000);
digitalWrite(ALARM, LOW);
Expand All @@ -214,30 +286,115 @@ bool dotsOn = false;

unsigned long oneSecondLoopDue = 0;

void checkGoogleMaps() {
Serial.println("Getting traffic for " + origin + " to " + destination);
DirectionsResponse response = api.directionsApi(origin, destination, inputOptions);
if (response.duration_value == 0) {
delay(100);
response = api.directionsApi(origin, destination, inputOptions);
}
Serial.println("Response:");
Serial.print("Trafic from ");
Serial.print(response.start_address);
Serial.print(" to ");
Serial.println(response.end_address);

Serial.print("Duration in Traffic text: ");
Serial.println(response.durationTraffic_text);
Serial.print("Duration in Traffic in Seconds: ");
Serial.println(response.durationTraffic_value);

Serial.print("Normal duration text: ");
Serial.println(response.duration_text);
Serial.print("Normal duration in Seconds: ");
Serial.println(response.duration_value);

Serial.print("Distance text: ");
Serial.println(response.distance_text);
Serial.print("Distance in meters: ");
Serial.println(response.distance_value);

trafficOffset = (response.durationTraffic_value - response.duration_value) / 60 ;

Serial.print("Traffic Offset: ");
Serial.println(trafficOffset);
}

void loop() {
unsigned long now = millis();
if(now > oneSecondLoopDue){
if (now > oneSecondLoopDue) {
timeClient.update();
displayTime(dotsOn);
dotsOn = !dotsOn;
checkForAlarm();
if(buttonPressed){
if (buttonPressed) {
alarmHandled = true;
buttonPressed = false;
}
oneSecondLoopDue = now + 1000;
}


if (enableTrafficAdjust)
{
if ((now > api_due_time)) {
inputOptions.waypoints = waypoints;
checkGoogleMaps();
api_due_time = now + api_mtbs;
}
}

server.handleClient();
}

int hour;
int minutes;
int timeHour;
int timeMinutes;

int lastEffectiveAlarm = 0;

//bool checkForAlarm()
//{
// int effectiveAlarmMinute = alarmMinute;
// int effectiveAlarmHour = alarmHour;
// int actualAlarmMinutesFromMidnight = (alarmHour * 60) + alarmMinute;
// int effectiveAlarmMinutesFromMidnight = actualAlarmMinutesFromMidnight;
// if (trafficOffset != 0)
// {
// effectiveAlarmMinutesFromMidnight -= trafficOffset;
//
// if (effectiveAlarmHour > 1439)
// {
// effectiveAlarmMinutesFromMidnight = effectiveAlarmMinutesFromMidnight % 1440;
// }
//
// if (effectiveAlarmHour < 0)
// {
// effectiveAlarmMinutesFromMidnight = (1440 + effectiveAlarmMinutesFromMidnight) % 1440;
// }
// }
//
// int minutesSinceMidnight = (hour * 60) + minutes;
//
// if (alarmActive) {
// if (minutesSinceMidnight >= effectiveAlarmMinutesFromMidnight) {
// if (minutesSinceMidnight <= actualAlarmMinutesFromMidnight + 30) {
// if (!alarmHandled)
// {
// soundAlarm();
// }
// }
// }
//
// } else if (minutesSinceMidnight = 0) {
// alarmHandled = false;
// }
//
// lastEffectiveAlarm = effectiveAlarmMinutesFromMidnight;
//}

bool checkForAlarm()
{
if(alarmActive && hour == alarmHour && minutes == alarmMinute){
if(!alarmHandled)
if (alarmActive && timeHour == alarmHour && timeMinutes == alarmMinute) {
if (!alarmHandled)
{
soundAlarm();
}
Expand All @@ -254,31 +411,33 @@ void interuptButton()
}

void displayTime(bool dotsVisible) {
unsigned long epoch = timeClient.getEpochTime();
hour = (epoch % 86400L) / 3600;
minutes = (epoch % 3600) / 60;

unsigned long epoch = UK.toLocal(timeClient.getEpochTime());

timeHour = (epoch % 86400L) / 3600;
timeMinutes = (epoch % 3600) / 60;

uint8_t data[4];

if(hour < 10) {
if (timeHour < 10) {
data[0] = display.encodeDigit(0);
data[1] = display.encodeDigit(hour);
data[1] = display.encodeDigit(timeHour);
} else {
data[0] = display.encodeDigit(hour /10);
data[1] = display.encodeDigit(hour % 10);
data[0] = display.encodeDigit(timeHour / 10);
data[1] = display.encodeDigit(timeHour % 10);
}

if(dotsVisible){
if (dotsVisible) {
// Turn on double dots
data[1] = data[1] | B10000000;
data[1] = data[1] | B10000000;
}

if(minutes < 10) {
if (timeMinutes < 10) {
data[2] = display.encodeDigit(0);
data[3] = display.encodeDigit(minutes);
data[3] = display.encodeDigit(timeMinutes);
} else {
data[2] = display.encodeDigit(minutes /10);
data[3] = display.encodeDigit(minutes % 10);
data[2] = display.encodeDigit(timeMinutes / 10);
data[3] = display.encodeDigit(timeMinutes % 10);
}

display.setSegments(data);
Expand Down

0 comments on commit d8a36fb

Please sign in to comment.