David Mellis —

Arduino 1.0 is coming soon. The first release candidate was posted to our development site for Maker Faire NYC and is available for public download. It brings a number of improvements and changes to the software that we encourage you to test before the final Arduino 1.0 release, scheduled for the end of the month.

The Arduino development environment (IDE) has undergone a number of adjustments:

The file extension for sketches has changed from .pde to .ino, to avoid conflicts with the Processing software (“ino” are the last three letters in “Arduino”).

There are a new set of toolbar icons, including a checkmark icon to verify (compile) a sketch and an arrow for upload. The serial monitor icon has moved to the right of the toolbar. Also, shift-clicking the upload icon now uploads using a programmer (selected in the Tools menu). You can still enable verbose output in the preferences dialog. (Icons were designed by Nicholas Zambetti.)

There’s a new color scheme and about image for the IDE (by ToDo.to.it).

The name of the currently selected board and serial port are now shown at the bottom of the editor. (Code from Wiring.)

A progress bar is displayed during compilation and upload. (Code from Wiring.)

The changes of perhaps larger practical impact, though, are those to the Arduino language. Here are some of the bigger changes:

Serial transmission is now asynchronous – that is, calls to Serial.print(), etc. add data to an outgoing buffer which is transmitted in the background. Also, the Serial.flush() command has been repurposed to wait for outgoing data to be transmitted, rather than dropping received incoming data.

The behavior of Serial.print() on a byte has been changed to align it with the other numeric data types. In particular, it will now print the digits of its argument as separate ASCII digits (e.g. ‘1’, ‘2’, ‘3’) rather than a single byte. The BYTE keyword has been removed. To send a single byte of data, use Serial.write() (which is present in Arduino 0022 as well).

The Serial class (as well as other classes inheriting from Stream, like EthernetClient, SoftwareSerial, Wire and more) now contains functions for parsing incoming data, based on the TextFinder library by Michael Margolis. They include find() and findUntil() to search for data, parseInt() and parseFloat() for converting incoming characters into numeric values, and readBytes() and readBytesUntil() for reading multiple bytes into a buffer. They use a timeout that can be set with the new setTimeout().

The SoftwareSerial class has been reimplemented, using the code originally written for the NewSoftSerial library by Mikal Hart. This allows for multiple simultaneous instances, although only one can receive at a time.

Support has been added for printing strings stored in flash (program memory) rather than RAM. Wrap double-quoted strings in F() to indicate that they should be stored in flash, e.g. F(“hello world”).

The String class has been reimplemented as well, by Paul Stoffregen. This new version is more memory-efficient and robust. Some functions which previously returned new string instances (e.g. trim() and toUpperCase()) have been changed to instead modify strings in place.

Support for DHCP and DNS has been added to the Ethernet library, thanks to integration by Adrian McEwen. Most classes in the Ethernet library have been renamed to add a “Ethernet” prefix and avoid conflicts with other networking libraries. In particular, “Client” is now “EthernetClient”, “Server” is “EthernetServer”, and “UDP” is “EthernetUDP”. A new IPAddress class makes it easier to manipulate those values.

The UDP API has been changed to be more similar to other libraries. Outgoing packets are now constructed using calls to the standard write(), print(), and println() functions – bracketed by beginPacket() and endPacket(). The parsePacket() function checks for and parses an incoming packet, which can then be read using available(), read(), and peek(). The remoteIP() and remotePort() functions provide information about the packet’s origin. (Again, thanks to Adrian McEwen for the implementation.)

The Wire library has also been modified to use the standard read() and write() functions instead of send() and receive(). You can also use print() and println() for outgoing data.

The SD library now supports multiple simultaneous open files. It also provides the isDirectory(), openNextFile(), and rewindDirectory() functions for iterating through all the files in a directory. (Thanks to Limor Fried.)

There are some other small additions that will be documented in the reference updates for Arduino 1.0.

Finally, a few other notes of particular concern to those developing libraries or otherwise interested in the internals of the Arduino software:

The WProgram.h file, which provides declarations for the Arduino API, has been renamed to Arduino.h. To create a library that will work in both Arduino 0022 and Arduino 1.0, you can use an #ifdef that checks for the ARDUINO constant, which was 22 and is now 100.

The write(), print(), and println() functions in Stream now return a size_t (instead of void). This indicates the number of bytes actually written by the function. Any classes that inherit from Stream will need to change accordingly. Additionally the write(str) function has been given a concrete implementation – it calls write(buf, len) – so sub-classes don’t need to (and shouldn’t) implement it.

There are new abstract base-classes for Client, Server, and UDP to provide portability across networking libraries.

The pin definitions for the Arduino boards (i.e. the mappings from pin numbers to port register / bit pairs) is now stored in a sub-folder of a new variants/ folder in the hardware folder. The variant to use for a given board is specified by the BOARD.build.variant preference in the boards.txt file.

The new, variant-specific pins_arduino.h files now provides additional macros with information about the characteristics of the board (e.g. the locations of the SPI and TWI pins, and the number of digital and analog pins).

The avrdude included with the Mac and Windows versions of the Arduino software has been upgraded to avrdude 5.11 (from an Arduino-specific version of avrdude 5.4). The software now uses the “arduino” programmer type in place of “stk500v1” for uploading to most Arduino boards.

Please try out the release candidate and give us feedback. If you find a bug or a specific issue that needs addressing, please open a new issue on the Google Code issue list. For more general discussion, see the developers mailing list or the suggestions forum.

If you develop an Arduino library, we encourage you to try it out with the Arduino 1.0 release candidate, as you’re likely to find some things that will stop it from compiling. The fixes should be straightforward, so please open an issue or contact the developers list if you have any problems.

Again, we’re hoping to do the final Arduino 1.0 release at the end of the month, so there’s not much time to do fixes or make further changes. Your help and understanding is greatly appreciated. And, don’t worry, there are plenty more versions of the Arduino software to come!