Microcontrollers
Microcontrollers
SparkFun – Tri-Axis Gyro Breakout – L3G4200D
SparkFun: SEN-10612
Description: This is a breakout board for the L3G4200D low-power three-axis angular rate sensor. The L3G4200D is a MEMS motion sensor and has a full scale of ±250/±500/±2000 dps and is capable of measuring rates with a user-selectable bandwidth. These work great in gaming and virtual reality input devices, GPS navigation systems and robotics.
Features:
- Three selectable full scales (250/500/2000 dps)
- I2C/SPI digital output interface
- 16 bit-rate value data output
- 8-bit temperature data output
- Wide supply voltage: 2.4 V to 3.6 V
- Low voltage-compatible IOs (1.8 V)
- Embedded power-down and sleep mode
- Embedded temperature sensor
- High shock survivability
Don Luc
SparkFun – XBee Explorer Regulated
SparkFun: WRL-09132
Description: The XBee Explorer Regulated takes care of the 3.3V regulation, signal conditioning, and basic activity indicators (Power, RSSI and DIN/DOUT activity LEDs). It translates the 5V serial signals to 3.3V so that you can connect a 5V (down to 3.3V) system to any XBee module. The board was conveniently designed to mate directly with Arduino Pro boards for wireless bootloading and USB based configuration.
This unit works with all XBee modules including the Series 1 and Series 2.5, standard and Pro versions. Plug an XBee into this breakout and you will have direct access to the serial and programming pins on the XBee unit and will be able to power the XBee with 5V.
This board comes fully populated with 3.3V regulator (16V max input), XBee socket, four status LEDs, and a diode to allow 5V systems to communicate safely with the 3.3V XBees. This board does not include and XBee module. XBee modules sold below.
Don Luc
SparkFun – Breakout Board for XBee Module
SparkFun: BOB-08276
Description: This is a simple breakout board for the popular XBee product from Digi. This board breaks out all 20 pins of the XBee to a 0.1″ standard spacing dual row header. The spacing between 0.1″ headers is 0.5″ making it breadboard DIP friendly. We highly recommend using the female sockets to avoid having to solder the XBee permanently to the breakout board. This is the PCB only. Please order the accompanying 2mm sockets (you’ll need 2!) and 0.1″ headers below.
Don Luc
SparkFun – XBee 1mW Chip Antenna – Series 1 (802.15.4)
SparkFun: WRL-08664
Description: This is the very popular 2.4GHz XBee module from Digi. These modules take the 802.15.4 stack (the basis for Zigbee) and wrap it into a simple to use serial command set. These modules allow a very reliable and simple communication between microcontrollers, computers, systems, really anything with a serial port! Point to point and multi-point networks are supported.
Features:
- 3.3V @ 50mA
- 250kbps Max data rate
- 1mW output (+0dBm)
- 300ft (100m) range
- Built-in antenna
- Fully FCC certified
- 6 10-bit ADC input pins
- 8 digital IO pins
- 128-bit encryption
- Local or over-air configuration
- AT or API command set
Don Luc
SparkFun – Arduino Fio
SparkFun: DEV-10116
Description: The Arduino Funnel I/O (Fio) is a board designed by Shigeru Kobayashi, based on the original design from LilyPad.
Funnel is a toolkit to sketch your idea physically, and consists of software libraries and hardware. By using Funnel, the user can interface to sensors and/or actuators with various programming languages such as ActionScript 3, Processing, and Ruby.
Arduino Fio is compatible with Funnel. It has connections for a Lithium Polymer battery and includes a charge circuit over USB. An XBee socket is available on the bottom of the board. The Fio has been designed to be wirelessly reprogrammable. Checkout our tutorial on wireless bootloading!
Note: The miniUSB connector is used for battery charging only. To bootload new firmware, you will need an external serial connection over an FTDI Basic, FTDI cable, or other serial connection. Check the related products below.
Note: The XBee socket and FTDI connection live on the same TX/RX pins of the ATmega328. You will need to remove the XBee module while reprogramming over serial. We recommend using a wireless bootloader whenever possible to avoid this step.
Note: A portion of this sale is given back to Arduino LLC to help fund continued development of new tools and new IDE features.
Features:
- ATmega328V running at 8MHz
- Arduino Bootloader
- XBee socket
- Lithium Polymer battery compatible
- MCP73831T LiPo Charger
- Reset button
- On/Off Switch
- Status/Charge/RSSI LEDs
Don Luc
SparkFun – Arduino Pro Mini 328 – 3.3V/8MHz
SparkFun: DEV-11114
Description: It’s blue! It’s thin! It’s the Arduino Pro Mini! SparkFun’s minimal design approach to Arduino. This is a 3.3V Arduino running the 8MHz bootloader. Arduino Pro Mini does not come with connectors populated so that you can solder in any connector or wire with any orientation you need. We recommend first time Arduino users start with the Uno R3. It’s a great board that will get you up and running quickly. The Arduino Pro series is meant for users that understand the limitations of system voltage (3.3V), lack of connectors, and USB off board.
We really wanted to minimize the cost of an Arduino. In order to accomplish this we used all SMD components, made it two layer, etc. This board connects directly to the FTDI Basic Breakout board and supports auto-reset. The Arduino Pro Mini also works with the FTDI cable but the FTDI cable does not bring out the DTR pin so the auto-reset feature will not work. There is a voltage regulator on board so it can accept voltage up to 12VDC. If you’re supplying unregulated power to the board, be sure to connect to the “RAW” pin on not VCC.
The latest and greatest version of this board breaks out the ADC6 and ADC7 pins as well as adds footprints for optional I2C pull-up resistors! We also took the opportunity to slap it with the OSHW logo.
Dimensions: 0.7×1.3″ (18x33mm)
Features:
- ATmega328 running at 8MHz with external resonator (0.5% tolerance)
- Low-voltage board needs no interfacing circuitry to popular 3.3V devices and modules (GPS, accelerometers, sensors, etc)
- 0.8mm Thin PCB
- USB connection off board
- Weighs less than 2 grams!
- Supports auto-reset
- 3.3V regulator
- Max 150mA output
- Over current protected
- DC input 3.3V up to 12V
- On board Power and Status LEDs
- Analog Pins: 8
- Digital I/Os: 14
Don Luc
Project #3 – LCD Shield – Mk5
LCDShieldMk5.1.ino
// ***** Don Luc ***** // Software Version Information // 5.1 // include the library code: #include <Wire.h> #include <Adafruit_MCP23017.h> #include <Adafruit_RGBLCDShield.h> #include <SPI.h> #include <RTClib.h> #include <RTC_DS3231.h> #include <OneWire.h> RTC_DS3231 RTC; #define SQW_FREQ DS3231_SQW_FREQ_1024 //0b00001000 1024Hz Adafruit_RGBLCDShield RGBLCDShield = Adafruit_RGBLCDShield(); // These #defines make it easy to set the backlight color #define OFF 0x0 #define RED 0x1 #define YELLOW 0x3 #define GREEN 0x2 #define TEAL 0x6 #define BLUE 0x4 #define VIOLET 0x5 #define WHITE 0x7 int yy = 0; uint8_t momentaryButton = 0; // Chorno boolean isChorno = true; boolean isChor = false; char datastr[100]; int zz = 0; // LDR (light dependent resistor) int LDR_Pin = A0; int LDRReading = 0; String LDR = ""; // Temperature chip i/o int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2 OneWire ds(DS18S20_Pin); // on digital pin 2 float temperature = 0; String tempZ = ""; // Potentiometer int potPin = A2; // select the input pin for the potentiometer int ledPin = 4; // select the pin for the LED boolean isVal = false; int potPot = 0; String cap = ""; void loop() { RGBLCDShield.clear(); // ChronoDot // set the cursor to column 0, line 1 RGBLCDShield.setCursor(0, 1); timeChrono(); // LDR (light dependent resistor) timeLDR(); // Temperature chip i/o temperatu(); // Potentiometer getPotentio(); momentaryButton = RGBLCDShield.readButtons(); // set the cursor to column 0, line 0 RGBLCDShield.setCursor(0,0); switch ( yy ) { case 1: // LDR (light dependent resistor) isLDR(); break; case 2: // Temperature chip i/o isTe(); break; case 3: // Potentiometer isCap(); break; case 4: // Yellow RGBLCDShield.print("YELLOW - RIGHT"); break; case 5: // OFF RGBLCDShield.print("OFF"); break; default: yy = 0; RGBLCDShield.print("Don Luc!!!"); } if ( momentaryButton ) { if ( momentaryButton & BUTTON_UP ) { isChorno = true; yy = 1; // LDR (light dependent resistor) RGBLCDShield.setBacklight(GREEN); } if ( momentaryButton & BUTTON_DOWN ) { isChorno = true; yy = 2; // Temperature chip i/o RGBLCDShield.setBacklight(RED); } if ( momentaryButton & BUTTON_LEFT ) { isChorno = true; yy =3; // Potentiometer RGBLCDShield.setBacklight(BLUE); } if ( momentaryButton & BUTTON_RIGHT ) { isChorno = true; yy = 4; //RGBLCDShield.print("YELLOW - RIGHT"); RGBLCDShield.setBacklight(YELLOW); } if ( momentaryButton & BUTTON_SELECT ) { isChorno = false; yy = 5; //RGBLCDShield.print("OFF"); RGBLCDShield.setBacklight(OFF); } } delay(5000); }
setup.ino
void setup() { // set up the LCD's number of columns and rows: RGBLCDShield.begin(16, 2); RGBLCDShield.setBacklight(VIOLET); // ChronoDot setupChrono(); // Pot pinMode(ledPin, OUTPUT); }
ChronoDot.ino
void setupChrono() { RTC.begin(); DateTime now = RTC.now(); DateTime compiled = DateTime(__DATE__, __TIME__); RTC.getControlRegisterData( datastr[0] ); } void timeChrono() { DateTime now = RTC.now(); DateTime isNow (now.unixtime() + 5572 * 86400L + 26980); if ( isChorno == true ) { if ( isChor == false ) { isChor = true; RGBLCDShield.print(isNow.year(), DEC); RGBLCDShield.print('/'); RGBLCDShield.print(isNow.month(), DEC); RGBLCDShield.print('/'); RGBLCDShield.print(isNow.day(), DEC); RGBLCDShield.print(' '); RGBLCDShield.print(' '); } else if ( isChor == true ) { isChor = false; RGBLCDShield.print(isNow.hour(), DEC); RGBLCDShield.print(':'); RGBLCDShield.print(isNow.minute(), DEC); RGBLCDShield.print(':'); RGBLCDShield.print(isNow.second(), DEC); RGBLCDShield.print(' '); RGBLCDShield.print(' '); } } }
getLDR.ino
void timeLDR() { // LDR LDRReading = analogRead(LDR_Pin); } void isLDR() { LDR = "LDR: "; LDR.concat(LDRReading); // LDR (light dependent resistor) RGBLCDShield.print( LDR ); }
getPot.ino
void getPotentio() { if ( isVal == false ) { isVal = true; digitalWrite(ledPin, HIGH); // turn the ledPin on } else if ( isVal == true ) { isVal = false; digitalWrite(ledPin, LOW); // turn the ledPin off } potPot = analogRead(potPin); // read the value from the sensor } void isCap(){ cap = "Pot: "; cap.concat(potPot); RGBLCDShield.print( cap ); }
getTemperature.ino
float getTemp() { //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1001; } if ( OneWire::crc8( addr, 7) != addr[7]) { return -1002; } if ( addr[0] != 0x10 && addr[0] != 0x28) { return -1003; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; } void temperatu(){ temperature = getTemp(); } void isTe() { tempZ = "Temp: "; tempZ.concat(temperature); tempZ.concat("C"); RGBLCDShield.print( tempZ ); }
Don Luc
Project #3 – LCD Shield – Mk4
1 X Mini Photocell
1 X Resistor 10k Ohm
1 X One Wire Digital Temperature Sensor – DS18B20
1 X Resistor 4.7k Ohm
1 X Trimpot 10K with Knob
1 X Resistor 1.65k Ohm
1 X 3MM Low Current Red LED
14 X Jumper Wires Premium 3″ M/M
1 X Project #3 – LED Shield – Mk3
LCDShieldMk4.3.ino
// ***** Don Luc ***** // Software Version Information // 4.3 // include the library code: #include <Wire.h> #include <Adafruit_MCP23017.h> #include <Adafruit_RGBLCDShield.h> #include <SPI.h> #include <RTClib.h> #include <RTC_DS3231.h> #include <OneWire.h> RTC_DS3231 RTC; #define SQW_FREQ DS3231_SQW_FREQ_1024 //0b00001000 1024Hz Adafruit_RGBLCDShield RGBLCDShield = Adafruit_RGBLCDShield(); // These #defines make it easy to set the backlight color #define OFF 0x0 #define RED 0x1 #define YELLOW 0x3 #define GREEN 0x2 #define TEAL 0x6 #define BLUE 0x4 #define VIOLET 0x5 #define WHITE 0x7 // Chorno boolean isChorno = false; char datastr[100]; // LDR (light dependent resistor) int LDR_Pin = A0; String LDR = ""; // Temperature chip i/o int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2 OneWire ds(DS18S20_Pin); // on digital pin 2 String tempZ = ""; // Potentiometer int potPin = A2; // select the input pin for the potentiometer int ledPin = 4; // select the pin for the LED boolean isVal = false; int potPot = 0; String cap = ""; void loop() { // timeChrono(); timeChrono(); uint8_t momentaryButton = RGBLCDShield.readButtons(); if ( momentaryButton ) { RGBLCDShield.clear(); RGBLCDShield.setCursor(0,0); if ( momentaryButton & BUTTON_UP ) { timeLDR(); RGBLCDShield.print( LDR ); RGBLCDShield.setBacklight(GREEN); } if ( momentaryButton & BUTTON_DOWN ) { temperatu(); RGBLCDShield.print( tempZ ); RGBLCDShield.setBacklight(RED); } if ( momentaryButton & BUTTON_LEFT ) { getPotentio(); RGBLCDShield.print( cap ); RGBLCDShield.setBacklight(BLUE); } if ( momentaryButton & BUTTON_RIGHT ) { RGBLCDShield.print("YELLOW - RIGHT"); RGBLCDShield.setBacklight(YELLOW); } if ( momentaryButton & BUTTON_SELECT ) { RGBLCDShield.print("OFF"); RGBLCDShield.setBacklight(OFF); } } delay(3000); }
setup.ino
void setup() { // set up the LCD's number of columns and rows: RGBLCDShield.begin(16, 2); RGBLCDShield.print("Don Luc!!!"); RGBLCDShield.setBacklight(VIOLET); // ChronoDot setupChrono(); // Pot pinMode(ledPin, OUTPUT); }
ChronoDot.ino
void setupChrono() { RTC.begin(); DateTime now = RTC.now(); DateTime compiled = DateTime(__DATE__, __TIME__); RTC.getControlRegisterData( datastr[0] ); } void timeChrono() { DateTime now = RTC.now(); DateTime isNow (now.unixtime() + 5572 * 86400L + 26980); // set the cursor to column 0, line 1 RGBLCDShield.setCursor(0, 1); if ( isChorno == false ) { isChorno = true; RGBLCDShield.print(isNow.year(), DEC); RGBLCDShield.print('/'); RGBLCDShield.print(isNow.month(), DEC); RGBLCDShield.print('/'); RGBLCDShield.print(isNow.day(), DEC); RGBLCDShield.print(' '); RGBLCDShield.print(' '); } else if ( isChorno == true ) { isChorno = false; RGBLCDShield.print(isNow.hour(), DEC); RGBLCDShield.print(':'); RGBLCDShield.print(isNow.minute(), DEC); RGBLCDShield.print(':'); RGBLCDShield.print(isNow.second(), DEC); RGBLCDShield.print(' '); RGBLCDShield.print(' '); } }
getLDR.ino
void timeLDR() { // LDR int LDRReading = analogRead(LDR_Pin); LDR = "LDR: "; LDR.concat(LDRReading); }
getPot.ino
void getPotentio() { if ( isVal == false ) { isVal = true; digitalWrite(ledPin, HIGH); // turn the ledPin on } else if ( isVal == true ) { isVal = false; digitalWrite(ledPin, LOW); // turn the ledPin off } potPot = analogRead(potPin); // read the value from the sensor cap = "Pot: "; cap.concat(potPot); }
getTemperature.ino
float getTemp() { //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1001; } if ( OneWire::crc8( addr, 7) != addr[7]) { return -1002; } if ( addr[0] != 0x10 && addr[0] != 0x28) { return -1003; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; } void temperatu(){ float temperature = getTemp(); tempZ = "Temp: "; tempZ.concat(temperature); tempZ.concat("C"); }
Don Luc
Project #3 – LCD Shield – Mk3
2 X Jumper Wires Premium 3″ M/M
1 X Project #3 – LED Shield – Mk2
LCDShieldMk3.0.ino
// ***** Don Luc ***** // Software Version Information // 3.0 // include the library code: #include <Wire.h> #include <Adafruit_MCP23017.h> #include <Adafruit_RGBLCDShield.h> #include <SPI.h> #include <RTClib.h> #include <RTC_DS3231.h> RTC_DS3231 RTC; #define SQW_FREQ DS3231_SQW_FREQ_1024 //0b00001000 1024Hz Adafruit_RGBLCDShield RGBLCDShield = Adafruit_RGBLCDShield(); // These #defines make it easy to set the backlight color #define OFF 0x0 #define RED 0x1 #define YELLOW 0x3 #define GREEN 0x2 #define TEAL 0x6 #define BLUE 0x4 #define VIOLET 0x5 #define WHITE 0x7 boolean isChorno = false; char datastr[100]; void loop() { // timeChrono(); timeChrono(); uint8_t momentaryButton = RGBLCDShield.readButtons(); if ( momentaryButton ) { RGBLCDShield.clear(); RGBLCDShield.setCursor(0,0); if ( momentaryButton & BUTTON_UP ) { RGBLCDShield.print("GREEN - UP"); RGBLCDShield.setBacklight(GREEN); } if ( momentaryButton & BUTTON_DOWN ) { RGBLCDShield.print("RED - DOWN"); RGBLCDShield.setBacklight(RED); } if ( momentaryButton & BUTTON_LEFT ) { RGBLCDShield.print("BLUE - LEFT"); RGBLCDShield.setBacklight(BLUE); } if ( momentaryButton & BUTTON_RIGHT ) { RGBLCDShield.print("YELLOW - RIGHT"); RGBLCDShield.setBacklight(YELLOW); } if ( momentaryButton & BUTTON_SELECT ) { RGBLCDShield.print("OFF"); RGBLCDShield.setBacklight(OFF); } } delay(3000); }
setup.ino
void setup() { // set up the LCD's number of columns and rows: RGBLCDShield.begin(16, 2); RGBLCDShield.print("Don Luc!!!"); RGBLCDShield.setBacklight(VIOLET); // ChronoDot setupChrono(); }
ChronoDot.ino
void setupChrono() { RTC.begin(); DateTime now = RTC.now(); DateTime compiled = DateTime(__DATE__, __TIME__); RTC.getControlRegisterData( datastr[0] ); } void timeChrono() { DateTime now = RTC.now(); DateTime isNow (now.unixtime() + 5572 * 86400L + 26980); // set the cursor to column 0, line 1 RGBLCDShield.setCursor(0, 1); if ( isChorno == false ) { isChorno = true; RGBLCDShield.print(isNow.year(), DEC); RGBLCDShield.print('/'); RGBLCDShield.print(isNow.month(), DEC); RGBLCDShield.print('/'); RGBLCDShield.print(isNow.day(), DEC); RGBLCDShield.print(' '); RGBLCDShield.print(' '); } else if ( isChorno == true ) { isChorno = false; RGBLCDShield.print(isNow.hour(), DEC); RGBLCDShield.print(':'); RGBLCDShield.print(isNow.minute(), DEC); RGBLCDShield.print(':'); RGBLCDShield.print(isNow.second(), DEC); RGBLCDShield.print(' '); RGBLCDShield.print(' '); } }
Don Luc
Project #3 – LCD Shield – Mk2
1 X ChronoDot
1 X ProtoScrewShield
1 X Breadboard
4 X Jumper Wires Premium 3″ M/M
1 X CR1632
1 X Project #3 – LED Shield – Mk1
LCDShieldMk2.2.ino
// ***** Don Luc ***** // Software Version Information // 2.2 // include the library code: #include <Wire.h> #include <Adafruit_MCP23017.h> #include <Adafruit_RGBLCDShield.h> Adafruit_RGBLCDShield RGBLCDShield = Adafruit_RGBLCDShield(); // These #defines make it easy to set the backlight color #define OFF 0x0 #define RED 0x1 #define YELLOW 0x3 #define GREEN 0x2 #define TEAL 0x6 #define BLUE 0x4 #define VIOLET 0x5 #define WHITE 0x7 uint8_t i = 0; void loop() { timeChrono(); uint8_t momentaryButton = RGBLCDShield.readButtons(); if ( momentaryButton ) { RGBLCDShield.clear(); RGBLCDShield.setCursor(0,0); if ( momentaryButton & BUTTON_UP ) { RGBLCDShield.print("GREEN - UP "); RGBLCDShield.setBacklight(GREEN); } if ( momentaryButton & BUTTON_DOWN ) { RGBLCDShield.print("RED - DOWN "); RGBLCDShield.setBacklight(RED); } if ( momentaryButton & BUTTON_LEFT ) { RGBLCDShield.print("BLUE - LEFT "); RGBLCDShield.setBacklight(BLUE); } if ( momentaryButton & BUTTON_RIGHT ) { RGBLCDShield.print("YELLOW - RIGHT "); RGBLCDShield.setBacklight(YELLOW); } if ( momentaryButton & BUTTON_SELECT ) { RGBLCDShield.print("OFF "); RGBLCDShield.setBacklight(OFF); } } delay(1000); }
setup.ino
void setup() { // set up the LCD's number of columns and rows: RGBLCDShield.begin(16, 2); RGBLCDShield.print("Don Luc!!!"); RGBLCDShield.setBacklight(VIOLET); // ChronoDot setupChrono(); }
ChronoDot.ino
void setupChrono() { // clear /EOSC bit // Sometimes necessary to ensure that the clock // keeps running on just battery power. Wire.beginTransmission(0x68); // address DS3231 Wire.write(0x0E); // select register Wire.write(0b00011100); // write register bitmap, bit 7 is /EOSC Wire.endTransmission(); } void timeChrono() { // set the cursor to column 0, line 1 RGBLCDShield.setCursor(0, 1); // send request to receive data starting at register 0 Wire.beginTransmission(0x68); // 0x68 is DS3231 device address Wire.write((byte)0); // start at register 0 Wire.endTransmission(); Wire.requestFrom(0x68, 3); // request three bytes (seconds, minutes, hours) while(Wire.available()) { int seconds = Wire.read(); // get seconds int minutes = Wire.read(); // get minutes int hours = Wire.read(); // get hours seconds = (((seconds & 0b11110000)>>4)*10 + (seconds & 0b00001111)); // convert BCD to decimal minutes = (((minutes & 0b11110000)>>4)*10 + (minutes & 0b00001111)); // convert BCD to decimal hours = (((hours & 0b00100000)>>5)*20 + ((hours & 0b00010000)>>4)*10 + (hours & 0b00001111)); // convert BCD to decimal (assume 24 hour mode) // print the number of seconds since reset: RGBLCDShield.print(hours); RGBLCDShield.print(":"); RGBLCDShield.print(minutes); RGBLCDShield.print(":"); RGBLCDShield.print(seconds); } }
Don Luc