237 lines
5.4 KiB
C++
237 lines
5.4 KiB
C++
#include "Adafruit_NeoPixel.h"
|
|
#include <avr/power.h>
|
|
#include <Wire.h>
|
|
#include <EEPROM.h>
|
|
#include "RTClib.h"
|
|
|
|
#define PIN0 37
|
|
#define PIN1 35
|
|
#define PIN2 33
|
|
#define PIN3 31
|
|
|
|
#define N0 196
|
|
#define N1 200
|
|
#define N2 180
|
|
#define N3 144
|
|
#define TEMP 200
|
|
|
|
#define invierno 1
|
|
#define verano 0
|
|
|
|
int temporada = 0;
|
|
|
|
// Parameter 1 = number of pixels in strip
|
|
// Parameter 2 = Arduino pin number (most are valid)
|
|
// Parameter 3 = pixel type flags, add together as needed:
|
|
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
|
|
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
|
|
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
|
|
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
|
|
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
|
|
Adafruit_NeoPixel strip0 = Adafruit_NeoPixel(N0, PIN0, NEO_GRB + NEO_KHZ800);
|
|
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(N1, PIN1, NEO_GRB + NEO_KHZ800);
|
|
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(N2, PIN2, NEO_GRB + NEO_KHZ800);
|
|
Adafruit_NeoPixel strip3 = Adafruit_NeoPixel(N3, PIN3, NEO_GRB + NEO_KHZ800);
|
|
|
|
// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
|
|
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
|
|
// and minimize distance between Arduino and first pixel. Avoid connecting
|
|
// on a live circuit...if you must, connect GND first.
|
|
RTC_DS1307 rtc;
|
|
|
|
void setup() {
|
|
// delay(4000);
|
|
// Serial.println("hola");
|
|
Serial.begin(57600);
|
|
if (! rtc.begin()) {
|
|
Serial.println("Couldn't find RTC");
|
|
while (1);
|
|
}
|
|
config();
|
|
strip0.begin();
|
|
strip1.begin();
|
|
strip2.begin();
|
|
strip3.begin();
|
|
clear();
|
|
// piramidon_time(720);
|
|
|
|
}
|
|
|
|
int time(int hour, int minute)
|
|
{
|
|
int minutes = 0;
|
|
if (hour>=12)
|
|
{
|
|
minutes = 720 - minute - (hour-12)*60;
|
|
}
|
|
else
|
|
{
|
|
minutes = minute + hour*60;
|
|
}
|
|
return minutes-1;
|
|
}
|
|
|
|
void test()
|
|
{
|
|
for (int i=0; i<720; i++)
|
|
{
|
|
piramidon_time(i);
|
|
delay(1);
|
|
}
|
|
for (int i=719; i>0; i--)
|
|
{
|
|
piramidon_time(i);
|
|
delay(1);
|
|
}
|
|
}
|
|
|
|
uint16_t minute_ant = -20;
|
|
byte temp_actual = 0;
|
|
|
|
void loop() {
|
|
|
|
DateTime now = rtc.now();
|
|
|
|
int minute = time(now.hour(), now.minute());
|
|
if (minute!=minute_ant)
|
|
{
|
|
Serial.print(now.hour());
|
|
Serial.print(':');
|
|
Serial.print(now.minute());
|
|
Serial.print(", que son ");
|
|
Serial.print(minute);
|
|
piramidon_time(minute);
|
|
Serial.println(" minutos");
|
|
minute_ant= minute;
|
|
}
|
|
|
|
// test();
|
|
// piramidon_time(719);
|
|
}
|
|
|
|
|
|
|
|
|
|
void show()
|
|
{
|
|
strip0.show();
|
|
strip1.show();
|
|
strip2.show();
|
|
strip3.show();
|
|
}
|
|
|
|
void clear()
|
|
{
|
|
for (int i=0; i<=200; i++)
|
|
{
|
|
strip0.setPixelColor(i, 0, 0, 0);
|
|
strip1.setPixelColor(i, 0, 0, 0);
|
|
strip2.setPixelColor(i, 0, 0, 0);
|
|
strip3.setPixelColor(i, 0, 0, 0);
|
|
}
|
|
show();
|
|
}
|
|
|
|
int limit[3] = { N0, N0 + N1, N0 + N1 + N2};
|
|
|
|
void minute_color(int number, byte red, byte green, byte blue)
|
|
{
|
|
if (number<limit[0])
|
|
{
|
|
strip0.setPixelColor(number, red, green, blue);
|
|
}
|
|
else if (number<limit[1])
|
|
{
|
|
strip1.setPixelColor(number-limit[0], red, green, blue);
|
|
}
|
|
else if (number<limit[2])
|
|
{
|
|
strip2.setPixelColor(number-limit[1], red, green, blue);
|
|
}
|
|
else
|
|
{
|
|
strip3.setPixelColor(number-limit[2], red, green, blue);
|
|
}
|
|
}
|
|
|
|
byte temporada_actual(byte month)
|
|
{
|
|
if ((month>3)&&(month<11))
|
|
{
|
|
return verano;
|
|
}
|
|
else
|
|
{
|
|
return invierno;
|
|
}
|
|
}
|
|
|
|
void piramidon_time(int minute)
|
|
{
|
|
if (minute>=0)
|
|
{
|
|
for (int i=0; i<=minute; i++) minute_color(i, 150, 60, 0);
|
|
for (int i=minute + 1; i<720; i++) minute_color(i, 0, 0, 0);
|
|
show();
|
|
}
|
|
else clear();
|
|
}
|
|
|
|
void config(){
|
|
Serial.println("Hola!!");
|
|
if (!compareData(__TIME__, readData(0)))
|
|
{
|
|
for(uint16_t i=0; i<120; i++) EEPROM.write(i, 0x00); // Memory erasing
|
|
writeData(0, __TIME__);
|
|
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
|
|
|
|
DateTime now = rtc.now();
|
|
byte temp_actual = temporada_actual(now.month());
|
|
EEPROM.write(TEMP, temp_actual);
|
|
Serial.println("ok!!");
|
|
}
|
|
// delay(4000);
|
|
// temporada = EEPROM.read(TEMP);
|
|
// Serial.println(temporada);
|
|
}
|
|
|
|
#define buffer_length 32
|
|
static char buffer[buffer_length];
|
|
|
|
void writeData(uint32_t eeaddress, char* text)
|
|
{
|
|
uint16_t eeaddressfree = eeaddress + buffer_length;
|
|
for (uint16_t i = eeaddressfree; i< (eeaddressfree + buffer_length); i++) EEPROM.write(i, 0x00);
|
|
for (uint16_t i = eeaddressfree; text[i - eeaddressfree]!= 0x00; i++)
|
|
{
|
|
EEPROM.write(i, text[i - eeaddressfree]);
|
|
}
|
|
}
|
|
|
|
char* readData(uint16_t eeaddress)
|
|
{
|
|
eeaddress = eeaddress + buffer_length;
|
|
uint16_t i;
|
|
uint8_t temp = EEPROM.read(eeaddress);
|
|
for ( i = eeaddress; ((temp!= 0x00)&&(temp<0x7E)&&(temp>0x1F)&&((i - eeaddress)<buffer_length)); i++)
|
|
{
|
|
buffer[i - eeaddress] = EEPROM.read(i);
|
|
temp = EEPROM.read(i + 1);
|
|
}
|
|
buffer[i - eeaddress] = 0x00;
|
|
return buffer;
|
|
}
|
|
|
|
boolean compareData(char* text, char* text1)
|
|
{
|
|
if ((strlen(text))!=(strlen(text1))) return false;
|
|
else
|
|
{
|
|
for(int i=0; i<strlen(text); i++)
|
|
{
|
|
if (text[i]!=text1[i]) return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|