Circle.h
class Circle {
public:
Circle(int x_, int y_, int r_, uint16_t c_);
int x;
int y;
int r;
uint16_t c;
private:
};
Circle::Circle(int x_, int y_, int r_, uint16_t c_)
{
x = x_;
y = y_;
r = r_;
c = c_;
}
Raindrop.ino
#include <PxMatrix.h>
#ifdef ESP32
#define P_LAT 22
#define P_A 19
#define P_B 23
#define P_C 18
#define P_D 5
#define P_E 15
#define P_OE 2
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
#endif
#ifdef ESP8266
#include <Ticker.h>
Ticker display_ticker;
#define P_LAT 16
#define P_A 5
#define P_B 4
#define P_C 15
#define P_D 12
#define P_E 0
#define P_OE 2
#endif
// Pins for LED MATRIX
//PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C);
//PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D);
//PxMATRIX display(64,64,P_LAT, P_OE,P_A,P_B,P_C,P_D,P_E);
PxMATRIX display(64, 32, P_LAT, P_OE, P_A, P_B, P_C, P_D, P_E);
//== Circlez ==
int width = 64;
int height = 32;
int xo = width / 2;
int yo = height / 2;
#include "Circle.h"
int dropRate = 500;
unsigned long timeToDrop;
int dropCount = -1;
const int dropMax = 3;
Circle *drops[dropMax];
#ifdef ESP8266
// ISR for display refresh
void display_updater()
{
//display.displayTestPattern(70);
display.display(70);
}
#endif
#ifdef ESP32
void IRAM_ATTR display_updater() {
// Increment the counter and set the time of ISR
portENTER_CRITICAL_ISR(&timerMux);
//isplay.display(70);
display.displayTestPattern(70);
portEXIT_CRITICAL_ISR(&timerMux);
}
#endif
void InitDrops()
{
for (int i=0; i<dropMax; i++) {
drops[i] = new Circle(0,0,0,0);
}
}
void DropAnother()
{
if (millis()>timeToDrop) {
if (++dropCount>=dropMax) dropCount=0;
Circle *aDrop = drops[dropCount];
aDrop->x = random(0,width);
aDrop->y = random(0,height);
aDrop->r = 1;
aDrop->c = display.color565(random(8,32), random(8,64), random(8,32));
timeToDrop = millis() + dropRate;
}
}
void AnimateCircles()
{
display.fillScreen(0);
for (int i=0; i<dropMax; i++) {
Circle aCircle = *(drops[i]);
if (aCircle.r != 0) {
display.drawCircle(aCircle.x, aCircle.y, aCircle.r, aCircle.c);
drops[i]->r += 1;
}
}
delay(10);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
display.begin(16);
#ifdef ESP8266
display_ticker.attach(0.002, display_updater);
#endif
#ifdef ESP32
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &display_updater, true);
timerAlarmWrite(timer, 2000, true);
timerAlarmEnable(timer);
#endif
InitDrops();
}
void loop() {
DropAnother();
AnimateCircles();
}
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.