Reloj 3D
Colocado enProgramando los wemos
A continuación encontrará el programa que debe colocarse en el módulo wifi wemos, que puede cargar a través del entorno Arduino . Si no sabes cómo hacer esto: https://opencircuit.be/Blog/Aan-de-slag-met-de-ESP8266 .
También necesitamos las siguientes bibliotecas: NTPClient, WiFiUdp y Ticker. Si no sabes cómo instalarlo, echa un vistazo aquí: https://www.arduino.cc/en/guide/Libraries
Como puede leer en el código, se configura un servidor web para que pueda, por ejemplo, vincular su reloj a su sistema domótico. Por ejemplo, solo puede hacer que el reloj se encienda cuando haya alguien en la habitación o que parpadee en caso de alarma. Las URL con una acción son:
Acción | URL |
ON | http://Dirección IP/on |
APAGADO | http://Dirección IP/off |
En lugar de Dirección IP, ingrese la dirección IP de los wemos.
De code:
x
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <Ticker.h>
const char *ssid = "WIFI NAAM";
const char *password = "WIFI WACHTWOORD";
const long utcOffsetInSeconds = 3600; //hoeveelheid seconden wijkt de tijdzone af van utc tijd
bool zomertijd = 1; //zet deze variable gelijk aan 1 voor zomertijd, 0 voor wintertijd
// open een webserver op poort 80
ESP8266WebServer server(80);
// maak een nieuwe timeClient
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
// maak een nieuw ticker
Ticker seconds;
// defineer variabeles
int latchPin = D2;
int clockPin = D4;
int dataPin = D1;
int outputEnable = D3;
byte data;
byte dataArray[10];
bool off = false;
int hours = 0;
int minutes = 0;
int digitValues[4];
// deze functie word elke seconde aangeroepen
void tick(){
if(!off){
digitalWrite(D0,!(digitalRead(D0))); // zet het dubbel punt aan of uit
timeClient.update(); // Update de tijd
hours = timeClient.getHours()+1;
minutes = timeClient.getMinutes();
// verdeel de tijd over de 4 digits
digitValues[0] = (hours / 10) % 10;
digitValues[1] = hours % 10;
digitValues[2] = (minutes / 10) % 10;
digitValues[3] = minutes % 10;
}else{
digitalWrite(D0,LOW);
}
}
void setup() {
//Serial.begin(115200); // enable for debugging
//set pins to output
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(outputEnable, OUTPUT);
pinMode(D8,OUTPUT);
pinMode(D7,OUTPUT);
pinMode(D6,OUTPUT);
pinMode(D5,OUTPUT);
pinMode(D0,OUTPUT);
digitalWrite(D8,HIGH);
digitalWrite(D7,HIGH);
digitalWrite(D6,HIGH);
digitalWrite(D5,HIGH);
digitalWrite(D0,HIGH);
WiFi.begin(ssid, password); // maak verbinding met het wifi netwerk
// wacht to we verbonden zijn met het wifi netwerk
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
//Serial.print ( "." );
}
// zet de klok aan als de url /on wordt aangeroepen
server.on("/on", []() {
server.send(200, "text/plain", "ok");
off = false;
});
// zet de klok uit als de url /off wordt aangeroepen
server.on("/off", []() {
server.send(200, "text/plain", "ok");
off = true;
});
timeClient.begin();
seconds.attach(1, tick); //laat de functie 'tick' elke seconde lopen
server.begin(); //start de webserver op poort 80
//Binary values to display number on digit
// Pas dit aan als de cijfers verkeerd worden weergeven
dataArray[0] = 0b11101110;
dataArray[1] = 0b01001000;
dataArray[2] = 0b11010110;
dataArray[3] = 0b11011010;
dataArray[4] = 0b01111000;
dataArray[5] = 0b10111010;
dataArray[6] = 0b10111110;
dataArray[7] = 0b11001000;
dataArray[8] = 0b11111110;
dataArray[9] = 0b11111010;
}
void setDigit(int n){
/* zet de getallen 0,1,2,3 in een andere volgorde
als de tijd in de verkeerde volgorde word weergeven*/
switch(n){
case 0: //first digit
digitalWrite(D8,HIGH);
digitalWrite(D7,HIGH);
digitalWrite(D6,LOW);
digitalWrite(D5,HIGH);
break;
case 1: //second digit
digitalWrite(D8,HIGH);
digitalWrite(D7,HIGH);
digitalWrite(D6,HIGH);
digitalWrite(D5,LOW);
break;
case 2: //third digit
digitalWrite(D8,LOW);
digitalWrite(D7,HIGH);
digitalWrite(D6,HIGH);
digitalWrite(D5,HIGH);
break;
case 3: //last digit
digitalWrite(D8,HIGH);
digitalWrite(D7,LOW);
digitalWrite(D6,HIGH);
digitalWrite(D5,HIGH);
}
}
void loop() {
server.handleClient();
if(!off){ // kijk of de klok niet is uitgeschakeld
for (int i = 0; i < 4; i++){
//zet de output uit
digitalWrite(outputEnable, HIGH);
// Selecteer de juiste digit
setDigit(i);
// zet de latch pin laag, zodat de chip weet
// dat het moet luisteren voor informatie
digitalWrite(latchPin, 0);
// Schrijf het juiste getal naar de digit
shiftOut(dataPin, clockPin,LSBFIRST, dataArray[digitValues[i]]);
//zet de latch pin terug hoog, zodat de chip weet
//dat het niet langer voor informatie moet wachten
digitalWrite(latchPin, 1);
//zet de output terug aan
digitalWrite(outputEnable, LOW);
delayMicroseconds(500); // pas dit aan als de klok te veel flikkert
}
}else{
digitalWrite(outputEnable, HIGH);
}
}