Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save orderthruchaos/7b9b773c77e17831caa2777f6c3eea0f to your computer and use it in GitHub Desktop.
Save orderthruchaos/7b9b773c77e17831caa2777f6c3eea0f to your computer and use it in GitHub Desktop.
Concatenation of files for the Grove LED bar controller with the Bean+ project.
/* This is a concatenation of the following files from
https://github.com/Seeed-Studio/Grove_LED_Bar (LGPL):
- Grove_LED_Bar.h
- Grove_LED_Bar.cpp (less the #include for the above header)
and the code from
https://www.hackster.io/karel/grove-led-bar-controller-with-the-bean-c3b81e
(less the #include for the above header) with corrections from the
comments. */
// Start of Grove_LED_Bar.h
/*
LED bar library V2.0
2010 Copyright (c) Seeed Technology Inc. All right reserved.
Original Author: LG
Modify: Loovee, 2014-2-26
User can choose which Io to be used.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
Modify: Long, 2015-01-07
User can change the brightness level for each LED segment
Rename constant to avoid name conflict
*/
#ifndef Grove_LED_Bar_H
#define Grove_LED_Bar_H
#include <Arduino.h>
// Avoid name conflict
#define GLB_CMDMODE 0x00 // Work on 8-bit mode
#define GLB_ON 0xff // 8-bit 1 data
#define GLB_OFF 0x00 // 8-bit 0 data
class Grove_LED_Bar
{
private:
unsigned int __pinClock; // Clock pin
unsigned int __pinData; // Data pin
bool __greenToRed; // Orientation (0 = red to green, 1 = green to red)
unsigned char __state[10];// Led state, brightness for each LED
void sendData(unsigned int data); // Send a word to led bar
void latchData(void); // Load data into the latch register
void setData(unsigned char bits[]);//Set data array
public:
Grove_LED_Bar(unsigned char pinClock, unsigned char pinData, bool greenToRed); // Initialize
void begin(){pinMode(__pinClock, OUTPUT); pinMode(__pinData, OUTPUT);}
void setGreenToRed(bool greenToRed); // (Re)set orientation
void setLevel(float level); // Set level, range from 0 to 10
void setLed(unsigned char led, float brightness);// Set brightness for a single led, range from 0 to 1
void toggleLed(unsigned char led); // Toggle a single led
void setBits(unsigned int bits); // Toggle leds to match given bits
unsigned int const getBits(); // Get the current state
};
#endif
// End of Grove_LED_Bar.h
// Start of Grove_LED_Bar.cpp
/*
LED bar library V2.0
2010 Copyright (c) Seeed Technology Inc. All right reserved.
Original Author: LG
Modify: Loovee, 2014-2-26
User can choose which Io to be used.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
// #include "Grove_LED_Bar.h"
Grove_LED_Bar::Grove_LED_Bar(unsigned char pinClock, unsigned char pinData, bool greenToRed)
{
__pinClock = pinClock;
__pinData = pinData;
__greenToRed = greenToRed; // ascending or decending
for (byte i = 0; i < 10; i++)
__state[i] = 0x00; // persist state so individual leds can be toggled
pinMode(__pinClock, OUTPUT);
pinMode(__pinData, OUTPUT);
}
// Send the latch command
void Grove_LED_Bar::latchData()
{
digitalWrite(__pinData, LOW);
delayMicroseconds(10);
for (unsigned char i = 0; i < 4; i++)
{
digitalWrite(__pinData, HIGH);
digitalWrite(__pinData, LOW);
}
}
// Send 16 bits of data
void Grove_LED_Bar::sendData(unsigned int data)
{
for (unsigned char i = 0; i < 16; i++)
{
unsigned int state = (data & 0x8000) ? HIGH : LOW;
digitalWrite(__pinData, state);
state = digitalRead(__pinClock) ? LOW : HIGH;
digitalWrite(__pinClock, state);
data <<= 1;
}
}
// Change the orientation
// Green to red, or red to green
void Grove_LED_Bar::setGreenToRed(bool greenToRed)
{
__greenToRed = greenToRed;
setData(__state);
}
// Set level (0-10)
// Level 0 means all leds off
// Level 10 means all leds on
// Level 4.5 means 4 LEDs on and the 5th LED's half on
void Grove_LED_Bar::setLevel(float level)
{
level = max(0, min(10, level));
level *= 8; // there are 8 (noticable) levels of brightness on each segment
// Place number of 'level' of 1-bits on __state
for (byte i = 0; i < 10; i++) {
__state[i] = (level > 8) ? ~0 :
(level > 0) ? ~(~0 << byte(level)) : 0;
level -= 8;
};
setData(__state);
}
// Set a single led
// led (1-10)
// brightness (0-1)
void Grove_LED_Bar::setLed(unsigned char led, float brightness)
{
led = max(1, min(10, led));
brightness = max(0, min(brightness, 1));
// Zero based index 0-9 for bitwise operations
led--;
// 8 (noticable) levels of brightness
// 00000000 darkest
// 00000011 brighter
// ........
// 11111111 brightest
__state[led] = ~(~0 << (unsigned char) (brightness*8));
setData(__state);
}
// Toggle a single led
// led (1-10)
void Grove_LED_Bar::toggleLed(unsigned char led)
{
led = max(1, min(10, led));
// Zero based index 0-9 for bitwise operations
led--;
__state[led] = __state[led] ? 0 : ~0;
setData(__state);
}
// each element in the state will hold the brightness level
// 00000000 darkest
// 00000011 brighter
// ........
// 11111111 brightest
void Grove_LED_Bar::setData(unsigned char __state[])
{
sendData(GLB_CMDMODE);
for (unsigned char i = 0; i < 10; i++)
{
if (__greenToRed)
{
// Go backward on __state
sendData(__state[10-i-1]);
}
else
{
// Go forward on __state
sendData(__state[i]);
}
}
// Two extra empty bits for padding the command to the correct length
sendData(0x00);
sendData(0x00);
latchData();
}
void Grove_LED_Bar::setBits(unsigned int bits)
{
for (unsigned char i = 0; i < 10; i++)
{
if ((bits % 2) == 1)
__state[i] = 0xFF;
else
__state[i] = 0x00;
bits /= 2;
}
setData(__state);
}
// Return the current bits
unsigned int const Grove_LED_Bar::getBits()
{
unsigned int __bits = 0x00;
for (unsigned char i = 0; i < 10; i++)
{
if (__state[i] != 0x0)
__bits |= (0x1 << i);
}
return __bits;
}
// End of Grove_LED_Bar.cpp
// Start of grove_led_bar_with_rotary_controller.ino
#define ROTARY_ANGLE_SENSOR A3 // The input pin used for the sensor
#define ADC_REF 5 // This matches the operating voltage we set to 5V
#define GROVE_VCC 5 // VCC of the grove interface which is often 5V
#define NUM_OF_LEDS 10 // Number of LEDs in the LED bar
// #include <Grove_LED_Bar.h>
Grove_LED_Bar LEDbar(A4, A5, 1); // Setting the data and clock pins used
void setup()
{
pinMode(ROTARY_ANGLE_SENSOR, INPUT);
LEDbar.begin();
}
void loop()
{
// Set the number of LEDs to turn on based upon the angle of the rotary
// sensor
LEDbar.setLevel(getLightLevel());
delay(100);
}
int getLightLevel()
{
// Take reading, measure voltage, and calculate
// number of LEDs which should be turned on
int reading = analogRead(ROTARY_ANGLE_SENSOR);
float voltage = (float)reading*ADC_REF/1023;
float level = (voltage*NUM_OF_LEDS)/GROVE_VCC;
return level;
}
// End of grove_led_bar_with_rotary_controller.ino
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment