Close

Raindrop Desk Toy

A project log for Playing with 64x32 RGB Matrix

P3 64x32 RGB Matrix

hari-wigunaHari Wiguna 06/22/2018 at 05:240 Comments

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