Digispark Quick Reference
Contents
This page is mirrored from the original Digistump/Digispark documentation, and is preserved here in case the original is taken offline.
- Note: Code examples are from the original documentation using Arduino c++.
- Original URL: http://digistump.com/wiki/digispark/quickref
- License: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
Frequently requested info
- GPIO output is 20 mA max per pin, same as a regular Arduino.
- I2C pins are Pin 0 (I2C data/SDA) and Pin 2 (I2C clock/SCL).
- USB communication uses pins #3 and #4. Using these pins for your circuit can interfere with the USB interface, e.g. reprogramming the Digispark. So it’s a good idea to provide some sort of disconnect ability if you use either of these two pins.
- PWM output available on Pins 0, 1, 4.
- LED is on P1 for all Digispark labeled Rev2 or higher., P0 for those with no Rev label.
- All Rev3 Digisparks are counterfeit! (we never made a rev3)
- VIN pin takes 7-12v (6-32 may work but over 12 will probably need some heat sinking) and can output 500ma (but over 100-200 might need some heat sinking)
- 5V pin takes 4.5-5.5v (3v+ may work, but not supported)
- USB connector takes 5v (4.5-6v may work but not supported)
- Pin 3 has a 1.5K pull-up (for USB communications)
- Pin 5 has some limitations it cannot handle as much current is outputs more like 3.6v - but works fine for most non-current sourcing uses
analogRead
ADC (analog input/analogRead) pins are 2, 3, 4, and 5. Keep in mind that the digital pin numbers are ”’not”’ the same as the analog inputs! The printed labels on the Digispark are the ”digital” pin numbers. Digital 2 is analog (ADC channel) 1 Digital 3 is analog (ADC channel) 3 Digital 4 is analog (ADC channel) 2 Digital 5 is analog (ADC channel) 0
More detailed info here: http://digistump.com/wiki/digispark/tutorials/basics
Internal Temperature Sensor
Add this code to your sketch (outside of the loop and setup) and then call get_temp to get the temperature in C. Remember the internal temperature sensor is subject to the heat of the chip and not pre-calibrated.
int get_temp() {
analogReference(INTERNAL1V1);
int raw = analogRead(A0+15);
/* Original code used a 13 deg adjustment. But based on my results, I didn't seem to need it. */
// raw -= 13; // raw adjust = kelvin //this value is used to calibrate to your chip
int in_c = raw - 273; // celcius
analogReference(DEFAULT);
return in_c;
}
Get operating voltage without using a pin
The following will display on the LCD the current voltage coming into the Digispark without having to use a pin to measure it!
#include <TinyWireM.h> // I2C Master lib for ATTinys which use USI - comment this out to use with standard arduinos
#include <LiquidCrystal_I2C.h> // for LCD w/ GPIO MODIFIED for the ATtiny85
LiquidCrystal_I2C lcd(0x27,16,2); // set address (0x27 is the address of the Digispark LCD modules) & 16 chars / 2 lines
void setup()
{
TinyWireM.begin(); // initialize I2C lib
lcd.init(); // initialize the lcd
lcd.backlight(); // Turn on the backlight
// Print startup message to the LCD
lcd.setCursor(0,0); lcd.print("Powered by");
lcd.setCursor(0,1); lcd.print("Digispark!");
//delay so we can see the message
delay(1000);
}
void loop()
{
//read and convert the voltage to a decimal
long voltage = readVcc();
double decimalVoltage = doubleMap(double(voltage),0,6000,0,6);
//update the LCD
lcd.clear();
lcd.setCursor(0,0); lcd.print("Voltage:");
lcd.setCursor(9,0); lcd.print(decimalVoltage);
// delay so this updates approximately 4 times per second
delay(250);
}
double doubleMap(double x, double in_min, double in_max, double out_min, double out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
long readVcc() {
// Read 1.1V reference against AVcc
// set the reference to Vcc and the measurement to the internal 1.1V reference
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA,ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
long result = (high<<8) | low;
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
return result; // Vcc in millivolts
}