Reset Arduino programmatically

This code resets Arduino – in-line – in program, whenever called. Ugly, but works.


// definition
void(* resetFunc) (void) = 0; //declare reset function @ address 0

Source: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1288779911/3#3

433 MHz receiver and NewSoftSerial

If you’re having problem with NewSoftSerial versus SoftwareSerial when using 434 MHz (433.92MHz) – receiver, it’s because the receiver cannot pull down the RX pin on your arduino. The library changes the input pin to be pull-up when non-inversion is used.

Change the library in following manner:

NewSoftSerial.cpp:

void NewSoftSerial::setRX(uint8_t rx)
{
pinMode(rx, INPUT);
/*
if (!_inverse_logic)
digitalWrite(rx, HIGH); // pullup for normal logic!
*/
_receivePin = rx;
_receiveBitMask = digitalPinToBitMask(rx);
uint8_t port = digitalPinToPort(rx);
_receivePortRegister = portInputRegister(port);
}

More info :

http://arduiniana.org/libraries/newsoftserial/
http://www.sparkfun.com/commerce/product_info.php?products_id=8950

Barometer units

1 atmosphere => 29.92 in Hg /760 mm Hg => 1.01325 bar => 1013.25 mb => 101.325 kPa => 1013.25 hPa

1 mb = 100 Pa = 0.1 kPa = 1 hPa = 0.0295 inches Hg = 0.75 mm Hg.

Source: http://www.islandnet.com/~see/weather/eyes/barometer2.htm

Howto: Safari cookies – Session only

If you want to block Safari from remembering your cookies (and you should if you care about your privacy) you can force Safari from writing cookies to file with following steps:

1) Quit Safari
2) Remove the Cookies-file from /Users/[yourusername]/Library/Cookies. The file is called Cookies.plist
3) Open Safari and visit some random page that uses Cookies
4) Now you should have the Cookies.plist file again in the folder
5) Open the Cookies.plist in Finder “Get Info” and choose “Locked”

Working: XBee 2.5

Communicating between two XBee 2.5’s quick instructions:

– XBee is very versatile radio modem which works trough serial connection. It’s really simple when you get it working; everything you send to the XBee Serial port is coming out of other XBee serial port. That’s it. And it works on 2.4 gig frequency. It’s very very the same as old modems that were used trough telephones. Here, just replace the telephone line with built-in 2.4 GHz support.
– However you have to configure the 2.5 version first to get things right. It doesn’t work out of the box!
– You *NEED* to use the X-CTU and configure other as ZNET 2.5 COORDINATOR AT (“master”)and the other as ZNET 2.5 ROUTER/END DEVICE AT (node).
– Make sure XBee answers to +++ command. If it doesn’t work your communication is not working, probably your COM speed is incorrect.
– You *MUST* dial from the master to node with the ATDN command. Otherwise it’s in broadcast mode and it’s unreliable. However the communcation works in broadcast but in broadcast you might also loose the connection quite easily. If the master is rebooted it might not connect automatically to node in broadcast.
– PAN ID is your network ID, this must be the same between all devices that communicate together
– Arduino Fio cannot be programmed when XBee is connected (same Serial line)
– You can use the SparkFun XBee shield together with FTDI adapter to program the XBee with X-CTU. Just connect Serial (3.3V level!!) and VCC (3.3!!) and GND. XBee doesn’t need anything else. Of course disconnect the Arduino board from the shield so that you don’t connect the two serial lines together :)

These instructions really helped me: http://t413.com/news/fast-2-way-xbee-series-2-data

Thanks to SparkFun again for great products and support.

Some links:

http://www.sparkfun.com/commerce/product_info.php?products_id=9588
http://www.sparkfun.com/commerce/product_info.php?products_id=8691

What does “Barometric pressure inches” mean at Weather Undeground API and

Weather Undeground wants the pressure in their API (http://wiki.wunderground.com/index.php/PWS_-_Upload_Protocol) as “barometric pressure inches” which is the same as “inches of mercur” or inHg or just hg. Notice that it changes based on temperature.

Millibars aka hPa (the one’s around 1000) can be converted to Hg by multiplying with 0.02953 when tempeature is 32 fahrenheit (= 0 celcius, the water freezing point).

So: barometric pressure inches/inches of mercury/inHg = millibars/hPa * 0.02953

More here: http://www.csgnetwork.com/meteorologyconvtbl.html

BMP085 with Arduino (tested & working)

I tested & corrected and this code really works.


// BMP08 with Arduino

// DANGER: The BMP08 accepts 1.8 to 3.6 Volts – so no chance to connect it directly to 5 Volts.

// Connect VCC to VCC and GND to GND, SCL goes to analogue pin 5, SDA to analogue pin4.
// Notice! Sparkfun breakoutboard contains already 4.7K pull ups,
// If not using pre-built pull-ups:
// --> Add some pull up resistors (1K to 20K, most often something like 4.7K) between SDA, SCL and VCC finishes the setup.

// References: http://interactive-matter.org/2009/12/arduino-barometric-pressure-sensor-bmp085/ and http://news.jeelabs.org/2009/02/19/hooking-up-a-bmp085-sensor/
// Specification: http://www.bosch-sensortec.com/content/language1/downloads/BST-BMP085-DS000-05.pdf
// SparkFun breakout board: http://www.sparkfun.com/commerce/product_info.php?products_id=9694

#include "Wire.h"

#define I2C_ADDRESS 0x77

const unsigned char oversampling_setting = 3; //oversamplig for measurement
const unsigned char pressure_waittime[4] = { 5, 8, 14, 26 };

//just taken from the BMP085 datasheet
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

void setup()
{
Serial.begin(9600); // start serial for output
Serial.println("Setting up BMP085");
Wire.begin();
bmp085_get_cal_data();
}
void bmp085_read_temperature_and_pressure(int& temperature, long& pressure);
void loop()
{
int temperature = 0;
long pressure = 0;

bmp085_read_temperature_and_pressure(&temperature,&pressure);
Serial.print(temperature,DEC);
Serial.print(" ");
Serial.print(pressure,DEC);
Serial.println();
delay(100);
}

void bmp085_read_temperature_and_pressure(int* temperature, long* pressure) {
int ut= bmp085_read_ut();
long up = bmp085_read_up();
long x1, x2, x3, b3, b5, b6, p;
unsigned long b4, b7;

//calculate the temperature
x1 = ((long)ut - ac6) * ac5 >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
*temperature = (b5 + 8) >> 4;

//calculate the pressure
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
x2 = ac2 * b6 >> 11;
x3 = x1 + x2;

//b3 = (((int32_t) ac1 * 4 + x3)<> 2;

if (oversampling_setting == 3) b3 = ((int32_t) ac1 * 4 + x3 + 2) << 1;
if (oversampling_setting == 2) b3 = ((int32_t) ac1 * 4 + x3 + 2);
if (oversampling_setting == 1) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 1;
if (oversampling_setting == 0) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 2;

x1 = ac3 * b6 >> 13;
x2 = (b1 * (b6 * b6 >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (uint32_t) (x3 + 32768)) >> 15;
b7 = ((uint32_t) up - b3) * (50000 >> oversampling_setting);
p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;

x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
*pressure = p + ((x1 + x2 + 3791) >> 4);

}

unsigned int bmp085_read_ut() {
write_register(0xf4,0x2e);
delay(5); //longer than 4.5 ms
return read_int_register(0xf6);
}

void bmp085_get_cal_data() {
Serial.println("Reading Calibration Data");
ac1 = read_int_register(0xAA);
Serial.print("AC1: ");
Serial.println(ac1,DEC);
ac2 = read_int_register(0xAC);
Serial.print("AC2: ");
Serial.println(ac2,DEC);
ac3 = read_int_register(0xAE);
Serial.print("AC3: ");
Serial.println(ac3,DEC);
ac4 = read_int_register(0xB0);
Serial.print("AC4: ");
Serial.println(ac4,DEC);
ac5 = read_int_register(0xB2);
Serial.print("AC5: ");
Serial.println(ac5,DEC);
ac6 = read_int_register(0xB4);
Serial.print("AC6: ");
Serial.println(ac6,DEC);
b1 = read_int_register(0xB6);
Serial.print("B1: ");
Serial.println(b1,DEC);
b2 = read_int_register(0xB8);
Serial.print("B2: ");
Serial.println(b1,DEC);
mb = read_int_register(0xBA);
Serial.print("MB: ");
Serial.println(mb,DEC);
mc = read_int_register(0xBC);
Serial.print("MC: ");
Serial.println(mc,DEC);
md = read_int_register(0xBE);
Serial.print("MD: ");
Serial.println(md,DEC);
}

long bmp085_read_up() {
write_register(0xf4,0x34+(oversampling_setting<<6));
delay(pressure_waittime[oversampling_setting]);

unsigned char msb, lsb, xlsb;
Wire.beginTransmission(I2C_ADDRESS);
Wire.send(0xf6); // register to read
Wire.endTransmission();

Wire.requestFrom(I2C_ADDRESS, 3); // read a byte
while(!Wire.available()) {
// waiting
}
msb = Wire.receive();
while(!Wire.available()) {
// waiting
}
lsb |= Wire.receive();
while(!Wire.available()) {
// waiting
}
xlsb |= Wire.receive();
return (((long)msb<<16) | ((long)lsb<<8) | ((long)xlsb)) >>(8-oversampling_setting);
}

void write_register(unsigned char r, unsigned char v)
{
Wire.beginTransmission(I2C_ADDRESS);
Wire.send(r);
Wire.send(v);
Wire.endTransmission();
}

char read_register(unsigned char r)
{
unsigned char v;
Wire.beginTransmission(I2C_ADDRESS);
Wire.send(r); // register to read
Wire.endTransmission();

Wire.requestFrom(I2C_ADDRESS, 1); // read a byte
while(!Wire.available()) {
// waiting
}
v = Wire.receive();
return v;
}

int read_int_register(unsigned char r)
{
unsigned char msb, lsb;
Wire.beginTransmission(I2C_ADDRESS);
Wire.send(r); // register to read
Wire.endTransmission();

Wire.requestFrom(I2C_ADDRESS, 2); // read a byte
while(!Wire.available()) {
// waiting
}
msb = Wire.receive();
while(!Wire.available()) {
// waiting
}
lsb = Wire.receive();
return (((int)msb<<8) | ((int)lsb));
}

Links: http://sensorapp.net/?p=278

OS X application tips

Struggling with applications that open certain extension files? For example opening mp3-files causes iTunes to open them default and copy the files to it’s own library.. Get RCDefaultApp http://www.rubicode.com/Software/RCDefaultApp/

Fast, simple mp3-player: Cog http://cogx.org/

LineIn is a simple application for OS X to enable the soft playthru of audio from input devices. In simpler terms, you can use LineIn to play sound coming in through a microphone or any other device plugged in to your Sound In port, just as was once available with OS 9’s “Play input through output device” option. http://rogueamoeba.com/freebies/

Text editor Smultron http://en.wikipedia.org/wiki/Smultron

Easy and simple DVD/CD burner http://burn-osx.sourceforge.net/Pages/English/home.html

Remember that OS X internal Preview can do lot’s of stuff for images, no need to find any application for basic image manipulation.

Technology snippets