Un pack de 10 capteurs de temperature DS18B20 coute entre 15 et 20€ chez les chinois sur eBay, et on peut en brancher autant qu'on veux sur a même broche de l'arduino.
Ca en fait un très bon choix quand on veux mesurer des températures et qu'on est pas pressé (parce que c'est un peu lent ces machins quand même).
La resolution de température est d'a peu près 0,06 °C, soit largement assez pour une regul de température simple ou une station météo. La précision est incertaine parce que ca reste des machins chinois pas cher, mais c''es de toutes façons au moins aussi bien que n'importe quel thermomètre de chez Bricomerdier qui de toutes façons est made in china aussi.

Les principales forces de l'arduino sont son coté "pas cher", sa facilité a comprendre et a utiliser et sa communauté qui joue beaucoup sur l'open source.
Le soft de développement est open source et multiplateforme, le hardware est lui aussi libre. Du coup une grande partie des utilisateurs n'hésite pas a partager son code.
Ca tombe bien, moi aussi j'aime bien partager mes programmes !
Tout d'abord je precise que mon code est largement inspiré de http://www.mon-club-elec.fr, sauf que j'ai corrigé un gros bug qui causait des résultats faux avec les températures négatives, et que j'ai supprimé l'usage des variables globales, parce que j'aime pas ca :).
Et aussi comme je connais a l'avance les adresses de mes capteurs, ça raccourci pas mal le programme.

#include  // librairie pour capteur OneWire

//---- code des instructions du capteur
const int modeLecture=0xBE;
const int lancerMesure=0x44;

// --- constantes des broches ---
const int broche_OneWire=2; // declaration constante de broche des capteurs
const int ledPin = 13;      // LED connectée à la broche n°13
const int inPin = 7;        // un bouton poussoir connecté à la broche 7 
                            // avec une résistance de pulldown


// --- Déclaration des variables globales ---
//byte data[12]; // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
OneWire  capteur(broche_OneWire);  // crée un objet One Wire sur la broche voulue

void setup()   {
  pinMode(ledPin, OUTPUT);  // configure la broche 13 en SORTIE
  pinMode(inPin, INPUT);    // configure la broche 7 en ENTREE
  Serial.begin(115200);     // initialise connexion série à 115200 bauds
} 

void loop(){
  unsigned long tps;
  int Temp1=0;
  byte Adresse1[8]={0x28,0xBF,0xF5,0x33,0x03,0x00,0x00,0x6D};
  int Temp2=0;
  byte Adresse2[8]={0x28,0x4D,0xF0,0x33,0x03,0x00,0x00,0xA3};
delay (500);
 while (1){
  Temp1=capteurMesureTemp(Adresse1)*10;
  Serial.print (Temp1,DEC);
  Temp2=capteurMesureTemp(Adresse2)*10;
  Serial.print (":");Serial.println(Temp2,DEC);
  digitalWrite(ledPin,0);
  tps=millis()+28500; // 30-1.5 secondes pour 2 pts/minute
  while (millis()<=tps){
     if (digitalRead(inPin)) break;
    }
  digitalWrite(ledPin,1);
 }
}

float capteurMesureTemp(byte adressecapteur[8]) { //fonction qui renvoie résultat float et ne reçoit rien
  //-------- variable locale de la fonction ----------
  byte data[12]; // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire 
  int tempet=0; // variable pour resultat brute  de la mesure
  float tempetf=0.0; // variable pour resultat à virgule de la mesure
  // XXXXXXXXXXXXXXXXXXXXXX Lancement d'une mesure et lecture du résultat XXXXXXXXXXXXXXXXXXXXXXX 
  // Serial.println("**** Acquisition d'une mesure de la temperature **** "); 
  // avant chaque nouvelle instruction, il faut : 
  //    * initialiser le bus 1-wire
  //    * sélectionner le capteur détecté
  //    * envoyer l'instruction 
  //--------- lancer une mesure --------
  capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
  capteur.select(adressecapteur); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  capteur.write(lancerMesure,1); // lance la mesure et alimente le capteur par la broche de donnée
  //-------- pause d'une seconde ----- 
  delay(750);     // au moins 750 ms
  // il faudrait mettre une instruction capteur.depower ici, mais le reset va le faire
  //---------- passer en mode LECTURE ------------- 
  capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
  capteur.select(adressecapteur); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  capteur.write(modeLecture,1); // passe en mode lecture de la RAM du capteur
  // ----------- lire les 9 octets de la RAM (appelé Scratchpad) ----
  for ( int i = 0; i < 9; i++) {           // 9 octets de RAM stockés dans 9 octets
    data[i] = capteur.read();             // lecture de l'octet de rang i stocké dans tableau data
  }
  //----- caclul de la température mesurée (enfin!) ---------
  /*data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles  <- Le bug était caché la
  tempet=data[1]; // bits de poids fort
  tempet=tempet<<8; 
  tempet=tempet+data[0]; // bits de poids faible
  */
  tempet=(data[1]<<8)|data[0]; // a l'arrache style !
  // --- en mode 12 bits, la résolution est de 0.0625°C - cf datasheet DS18B20
  tempetf=float(tempet)*6.25;
  tempetf=tempetf/100.0;
  return (tempetf);
}

Ca marche tellement bien que j'ai commandé des capteurs d'hygrométrie,de pression atmosphérique et des photorésistances sur ebay pour compléter ma mini station météo.
J'ai aussi commandé un machin bluetooth histoire de pouvoir faire marcher le biniou "sans fil" parce pour moment c'est un peu chiant d'avoir le câble a la pate sur mon macbook pro qui deviens beaucoup moins portable du coup !

Coté MAC j'ai utilisé processing pour écrire un traceur de courbes sympathique, lui aussi largement inspiré du site linké plus haut mais largement plus retravaillé que la lecture des capteurs de température.
Comme je découvre seulement ce langage depuis quelques jours, que mon programme va surement évoluer beaucoup vu les trucs que j'ai commandé, je ne publie pas le code source tout de suite. Il est trop "sale" pour être montré :-$ .
Processing c'est open source, multi plateforme etc, etc. C'est concu pour les non-informaticiens.
Ca me rappelle un peu Amos sur l'amiga. Ca semble simple a utiliser et ça permets de faire pleins de trucs sans forcement devoir maitriser toutes les subtilités de la machine sur laquelle il tourne. C'est un peu du Java pour les noobs quoi. Parfait pour moi.
Je pense que je vais m'amuser pas mal avec ce nouveau jouet :)