Lab_interaccio/2016/piramidon/Piramidon.ino

237 lines
5.4 KiB
Arduino
Raw Normal View History

2025-02-25 21:29:42 +01:00
#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;
}