Identifying your Arduino board from code
For my IoT project I needed to write code slightly differently for specific Arduino boards. E.g. for Arduino UNO I wanted to use Serial to talk to ESP8266 and for Arduino Mega wanted to use Serial1. So basically I wanted to use Board specific #defines
#ifdef MEGA
#define SERIAL Serial1
#elif UNO
#define SERIAL Serial
#endif
SERIAL.println("Something")
For that I needed to get board specific #defines for each of the board options in the Arduino IDE, so that as I change the board type in the IDE, I automatically build code for that specific board.
That information is actually available in a file called board.txt inside your arduino install folder. For me it is G:\arduino-1.6.5\arduino-1.6.5-r5\hardware\arduino\avr\boards.txt. For each board there is a section inside that file and the relevant entries look something as follows
##############################################################
uno.name=Arduino/Genuino Uno
uno.vid.0=0x2341
uno.pid.0=0x0043
uno.vid.1=0x2341
uno.pid.1=0x0001
...
uno.build.board=AVR_UNO
uno.build.core=arduino
uno.build.variant=standard
The .board entry when prefixed by ARDUINO_ becomes the #define. I wrote a quick PowerShell routine to get all such entires. The code for it is in GitHub at https://github.com/bonggeek/Samples/blob/master/Arduino/ListBoard.ps1
$f = Get-ChildItem -Path $args[0] -Filter "boards.txt" -Recurse
foreach($file in $f)
{
Write-Host "For file" $file.FullName
foreach ($l in get-content $file.FullName) {
if($l.Contains(".name")) {
$b = $l.Split('=')[1];
}
if($l.Contains(".board")) {
$s = [string]::Format("{0,-40}ARDUINO_{1}", $b, ($l.Split('=')[1]));
Write-Host $s
}
}
}
Given the argument of root folder or Arduino install, you get the following.
PS C:\Users\abhinaba> D:\SkyDrive\bin\ListBoard.ps1 G:\arduino-1.6.5\
For file G:\arduino-1.6.5\arduino-1.6.5-r5\hardware\arduino\avr\boards.txt
Arduino Yún ARDUINO_AVR_YUN
Arduino/Genuino Uno ARDUINO_AVR_UNO
Arduino Duemilanove or Diecimila ARDUINO_AVR_DUEMILANOVE
Arduino Nano ARDUINO_AVR_NANO
Arduino/Genuino Mega or Mega 2560 ARDUINO_AVR_MEGA2560
Arduino Mega ADK ARDUINO_AVR_ADK
Arduino Leonardo ARDUINO_AVR_LEONARDO
Arduino/Genuino Micro ARDUINO_AVR_MICRO
Arduino Esplora ARDUINO_AVR_ESPLORA
Arduino Mini ARDUINO_AVR_MINI
Arduino Ethernet ARDUINO_AVR_ETHERNET
Arduino Fio ARDUINO_AVR_FIO
Arduino BT ARDUINO_AVR_BT
LilyPad Arduino USB ARDUINO_AVR_LILYPAD_USB
LilyPad Arduino ARDUINO_AVR_LILYPAD
Arduino Pro or Pro Mini ARDUINO_AVR_PRO
Arduino NG or older ARDUINO_AVR_NG
Arduino Robot Control ARDUINO_AVR_ROBOT_CONTROL
Arduino Robot Motor ARDUINO_AVR_ROBOT_MOTOR
Arduino Gemma ARDUINO_AVR_GEMMA
So now I can use
#ifdef ARDUINO_AVR_MEGA2560
// Serial 1: 19 (RX) 18 (TX);
#define SERIAL Serial1
#elif ARDUINO_AVR_NANO
#define SERIAL Serial
#endif // ARDUINO_MEGA