253 lines
5.7 KiB
C++
253 lines
5.7 KiB
C++
#include <Arduino.h>
|
|
#include "LedControl.h"
|
|
#include "RTClib.h" // RTC library
|
|
|
|
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
|
|
#include <ESP8266WebServer.h>
|
|
#include "WiFiManager.h" //https://github.com/tzapu/WiFiManager
|
|
|
|
#include <SPI.h>
|
|
#include <Wire.h>
|
|
#include <Adafruit_GFX.h>
|
|
#include <Adafruit_SSD1306.h>
|
|
|
|
/*
|
|
|
|
Now we need a LedControl to work with.
|
|
***** These pin numbers will probably not work with your hardware *****
|
|
|
|
pin 12 is connected to the DataIn
|
|
|
|
pin 11 is connected to the CLK
|
|
|
|
pin 10 is connected to LOAD
|
|
|
|
We have only a single MAX72XX.
|
|
|
|
*/
|
|
|
|
|
|
int iteration = 0;
|
|
|
|
|
|
|
|
|
|
// initialize RTC library
|
|
RTC_DS1307 rtc;
|
|
DateTime now;
|
|
|
|
#define SCREEN_WIDTH 128 // OLED display width, in pixels
|
|
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
|
|
|
|
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
|
|
#define OLED_RESET D8-1 // Reset pin # (or -1 if sharing Arduino reset pin)
|
|
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
|
|
|
|
|
// Max7219 PINs:
|
|
#define MAX_CLK D5
|
|
#define MAX_CS D3
|
|
#define MAX_DIN D7
|
|
|
|
LedControl lc = LedControl(MAX_DIN, MAX_CLK, MAX_CS, 1);
|
|
|
|
/* we always wait a bit between updates of the display */
|
|
|
|
unsigned long delaytime = 500;
|
|
|
|
void configModeCallback(WiFiManager *myWiFiManager);
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(115200);
|
|
//WiFiManager
|
|
//Local intialization. Once its business is done, there is no need to keep it around
|
|
WiFiManager wifiManager;
|
|
//reset settings - for testing
|
|
//wifiManager.resetSettings();
|
|
|
|
//set callback that gets called when connecting to previous WiFi fails, and enters Access Point mode
|
|
wifiManager.setAPCallback(configModeCallback);
|
|
|
|
|
|
|
|
//fetches ssid and pass and tries to connect
|
|
//if it does not connect it starts an access point with the specified name
|
|
//here "AutoConnectAP"
|
|
//and goes into a blocking loop awaiting configuration
|
|
if (!wifiManager.autoConnect())
|
|
{
|
|
Serial.println("failed to connect and hit timeout");
|
|
//reset and try again, or maybe put it to deep sleep
|
|
ESP.reset();
|
|
delay(1000);
|
|
}
|
|
|
|
|
|
|
|
//if you get here you have connected to the WiFi
|
|
Serial.println("connected...yeey :)");
|
|
|
|
|
|
/* The MAX72XX is in power-saving mode on startup, we have to do a wakeup call */
|
|
|
|
lc.shutdown(0, false);
|
|
|
|
/* Set the brightness to a medium values */
|
|
|
|
lc.setIntensity(0, 15);
|
|
|
|
lc.clearDisplay(0);
|
|
|
|
/* and clear the display */
|
|
|
|
|
|
|
|
|
|
Serial.println("starting");
|
|
|
|
delay(3000); // wait for console opening
|
|
|
|
//rtc.begin();
|
|
|
|
if (! rtc.begin()) {
|
|
Serial.println("Couldn't find RTC");
|
|
//while (1);
|
|
return;
|
|
}
|
|
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
|
|
|
|
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
|
|
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
|
|
Serial.println(F("SSD1306 allocation failed"));
|
|
return;
|
|
}
|
|
|
|
// Show initial display buffer contents on the screen --
|
|
// the library initializes this with an Adafruit splash screen.
|
|
display.display();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void configModeCallback(WiFiManager *myWiFiManager)
|
|
{
|
|
Serial.println("Entered config mode");
|
|
Serial.println(WiFi.softAPIP());
|
|
//if you used auto generated SSID, print it
|
|
Serial.println(myWiFiManager->getConfigPortalSSID());
|
|
}
|
|
|
|
|
|
void printNumber(int v) {
|
|
int ones;
|
|
int tens;
|
|
int hundreds;
|
|
boolean negative;
|
|
|
|
if(v < -999 || v > 999)
|
|
return;
|
|
if(v<0) {
|
|
negative=true;
|
|
v=v*-1;
|
|
}
|
|
ones=v%10;
|
|
v=v/10;
|
|
tens=v%10;
|
|
v=v/10;
|
|
hundreds=v;
|
|
if(negative) {
|
|
//print character '-' in the leftmost column
|
|
lc.setChar(0,3,'-',false);
|
|
}
|
|
else {
|
|
//print a blank in the sign column
|
|
lc.setChar(0,3,' ',false);
|
|
}
|
|
//Now print the number digit by digit
|
|
lc.setDigit(0,2,(byte)hundreds,false);
|
|
lc.setDigit(0,1,(byte)tens,false);
|
|
lc.setDigit(0,0,(byte)ones,false);
|
|
}
|
|
|
|
|
|
|
|
|
|
void loop()
|
|
{
|
|
|
|
DateTime now = rtc.now();
|
|
|
|
Serial.print(now.year(), DEC);
|
|
Serial.print('/');
|
|
Serial.print(now.month(), DEC);
|
|
Serial.print('/');
|
|
Serial.print(now.day(), DEC);
|
|
Serial.print(" (");
|
|
Serial.print(") ");
|
|
Serial.print(now.hour(), DEC);
|
|
Serial.print(':');
|
|
Serial.print(now.minute(), DEC);
|
|
Serial.print(':');
|
|
Serial.print(now.second(), DEC);
|
|
Serial.println();
|
|
|
|
Serial.print(" since midnight 1/1/1970 = ");
|
|
Serial.print(now.unixtime());
|
|
Serial.print("s = ");
|
|
Serial.print(now.unixtime() / 86400L);
|
|
Serial.println("d");
|
|
|
|
// calculate a date which is 7 days and 30 seconds into the future
|
|
DateTime future (now + TimeSpan(7,12,30,6));
|
|
|
|
Serial.print(" now + 7d + 30s: ");
|
|
Serial.print(future.year(), DEC);
|
|
Serial.print('/');
|
|
Serial.print(future.month(), DEC);
|
|
Serial.print('/');
|
|
Serial.print(future.day(), DEC);
|
|
Serial.print(' ');
|
|
Serial.print(future.hour(), DEC);
|
|
Serial.print(':');
|
|
Serial.print(future.minute(), DEC);
|
|
Serial.print(':');
|
|
Serial.print(future.second(), DEC);
|
|
Serial.println();
|
|
|
|
Serial.println();
|
|
|
|
|
|
display.clearDisplay();
|
|
|
|
display.setTextSize(1); // Normal 1:1 pixel scale
|
|
display.setTextColor(WHITE); // Draw white text
|
|
display.setCursor(0, 0); // Start at top-left corner
|
|
display.cp437(true); // Use full 256 char 'Code Page 437' font
|
|
|
|
|
|
char buffer[20];
|
|
|
|
sprintf(buffer, "%02d:%02d:%02d %02d/%02d/%02d", now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year());
|
|
|
|
display.write(buffer);
|
|
|
|
display.display();
|
|
|
|
|
|
lc.setDigit(0,3,now.hour()/10,false);
|
|
lc.setDigit(0,2,now.hour()%10,false);
|
|
lc.setDigit(0,1,now.minute()/10,false);
|
|
lc.setDigit(0,0,now.minute()%10,false);
|
|
|
|
/*
|
|
lc.setDigit(0,0,3,false);
|
|
lc.setDigit(0,1,2,false);
|
|
lc.setDigit(0,2,1,false);
|
|
lc.setDigit(0,3,0,false);
|
|
*/
|
|
delay(1000);
|
|
|
|
} |