Bought some Pro Mini clones for about $.90 each only to realize the WAVGAT boards have some compatibility issues once I tried to use them. Searched through the forum and found out how to get rid of the 4x slower issue and to get the IDE to recognize them. Couldn't get it to work with v1.8.8 so I'm using v1.8.6 (just like with the Digispark). The WAVGAT Pro Mini clone says "WAVGAT AVGA328P AU1738" on the chip, and I realize it's using the LGT8F328D chip.
I don't have the 12 pixel ring, but that's the closest Fritzing had. I have an 8 pixel ring with 1 pixel soldered in the middle opening. I'm using the NeoPixel library and buttoncycler sketch modified to match the pin configurations in my setup. I did try various pin combinations, but I had the same results for all except pin 4; it didn't do anything when connected to that pin. I also tried the strandtest example with no success, but the Blink sketch did blink the LED 1s off/1s on. Eventually switched back to the buttoncycler so I would know when a new function started.
The initial issue was all the pixels turned white after powering up. Solved this with adding the updates to the Documents/Arduino folder. Now the issue is the Neopixels behave unpredictably. They are never all the same color, don't even stay the same color on a given function, and don't light up in the right pattern. I measured the WAVGAT VCC going to the NeoPixels at 4.98V. I have a better Pro Mini clone ('The Simple' written on the back) that has no issue with the Neopixels or sketch, even after I stopped troubleshooting the WAVGAT. It's the one I prototype with, and I don't have another to replace it right now.
So to me it looks like a compatibility issue between the WAVGAT board and the NeoPixel library. Does anyone have a suggestion/solution/work around....besides not using the board? Am I going to have issues with configuring the WAVGAT board for low power since it uses other libraries?
The WAVGAT boards.txt has the following info for the board:
lardu_328s.name= WAVGAT Pro mini
lardu_328s.upload.tool=avrdude
lardu_328s.upload.protocol=arduino
lardu_328s.upload.maximum_size=29696
lardu_328s.upload.speed=57600
lardu_328s.bootloader.tool=avrdude
lardu_328s.bootloader.high_fuses=0xff
lardu_328s.bootloader.low_fuses=0xff
lardu_328s.bootloader.extended_fuses=0x07
lardu_328s.bootloader.path=lgt8fx8e
lardu_328s.bootloader.file=lgt8fx8e\optiboot_lgt8f328d.hex
lardu_328s.bootloader.unlock_bits=0x3f
lardu_328s.bootloader.lock_bits=0x3f
lardu_328s.build.mcu=atmega328p
lardu_328s.build.f_cpu=16000000L
lardu_328s.build.core=lgt8f
lardu_328s.build.variant=lgt8fx8ds20
lardu_328s.build.board=AVR_LARDU_328E
Setup:
// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
// You should wire a momentary push button to connect from ground to a digital IO pin. When you
// press the button it will change to a new pixel animation. Note that you need to press the
// button once to start the first animation!
#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN 2 // Digital IO pin connected to the button. This will be
// driven with a pull-up resistor so the switch should
// pull the pin to ground momentarily. On a high -> low
// transition the button press logic will execute.
#define PIXEL_PIN 3 // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 9
// Parameter 1 = number of pixels in strip, neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_RGB Pixels are wired for RGB bitstream
// NEO_GRB Pixels are wired for GRB bitstream, correct for neopixel stick
// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels)
// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
bool oldState = HIGH;
int showType = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT);
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
// Get current button state.
bool newState = digitalRead(BUTTON_PIN);
// Check if state changed from high to low (button press).
if (newState == LOW && oldState == HIGH) {
// Short delay to debounce button.
delay(20);
// Check if button is still low after debounce.
newState = digitalRead(BUTTON_PIN);
if (newState == LOW) {
showType++;
if (showType > 9)
showType=0;
startShow(showType);
}
}
// Set the last button state to the old state.
oldState = newState;
}
void startShow(int i) {
switch(i){
case 0: colorWipe(strip.Color(0, 0, 0), 50); // Black/off
break;
case 1: colorWipe(strip.Color(255, 0, 0), 50); // Red
break;
case 2: colorWipe(strip.Color(0, 255, 0), 50); // Green
break;
case 3: colorWipe(strip.Color(0, 0, 255), 50); // Blue
break;
case 4: theaterChase(strip.Color(127, 127, 127), 50); // White
break;
case 5: theaterChase(strip.Color(127, 0, 0), 50); // Red
break;
case 6: theaterChase(strip.Color( 0, 0, 127), 50); // Blue
break;
case 7: rainbow(20);
break;
case 8: rainbowCycle(20);
break;
case 9: theaterChaseRainbow(50);
break;
}
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
void rainbow(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256; j++) {
for(i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i+j) & 255));
}
strip.show();
delay(wait);
}
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j=0; j<10; j++) { //do 10 cycles of chasing
for (int q=0; q < 3; q++) {
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, c); //turn every third pixel on
}
strip.show();
delay(wait);
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q=0; q < 3; q++) {
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
}
strip.show();
delay(wait);
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}