Update vom 19.05.2019 (Datum der Migration): Links zum Code wurden in den Post integriert. An dieser Stelle gilt ein riesiger Dank der Wayback Machine vom Internet Archive, ohne deren Hilfe der Code nicht mehr verfügbar wäre.

Update 07.03.2021: Toter Link gefixt.

(Anmerkung: Zur Zeit ist das wirklich nur eine sehr kurze Anleitung, die ich zu einem späteren Zeitpunkt hoffentlich noch ausbauen kann) Vor kurzem habe ich ein Arduino-Board erworben. Da ich noch zusätzlich ein LCD hatte, wollte ich natürlich auch damit arbeiten. Nach einiger Einarbeitung kam ich auch zum Beispiel “Texte per serieller Schnittstelle an das Arduino-Board senden”. Da war auch schon die Idee da: Ich lasse mir übers Internet Nachrichten ans LCD schicken.

Neu ist die Idee nicht, ich hab das schon irgendwo mal gesehen. Dennoch wollte ich das mal probieren. Da ich kein Ethernet-Shield habe, muss das Board per USB am PC bleiben, die Kommunikation erfolgt per serieller Schnittstelle. Das Board muss also die ganze Zeit am USB hängen. Da ich eigentlich an meiner Belegarbeit arbeiten müsste, nur eine (ganz kurze) Projektvorstellung: Was wird benötigt?

Hardware

Erstmal braucht man ein Board. Ich verwende das Arduino Duemilanove. Wer das ältere Diecimila benutzt, ist sogar besser dran - siehe weiter unten, warum.
Weiterhin braucht man ein LCD (jedes sollte funktionieren, sofern es sich per LiquidCrystal-Bibliothek ansteuern lässt), evtl. eine Diode (ich hab hier eine 1N4007). Ein Potentiometer zur Kontrasteinstellung sollte auch vorhanden sein. Wer ein Board mit Autoreset hat, braucht auch einen 110~120 Ohm Widerstand. (2x 220 Ohm parallel tun es natürlich auch). (edit, 09.09.2010)

Fritzing sei dank kann ich euch meine Schaltung zur Verfügung stellen:

Für den Aufbau der Schaltung siehe obige Abbildung.
Weiterhin verweise ich hier auf https://www.arduino.cc/en/Tutorial/LibraryExamples/HelloWorld/ und auf https://www.ladyada.net/learn/lcd/charlcd.html. Lest zur Pinbelegung des LCD auf jeden Fall das Datenblatt. Meins LCD verträgt z.B. nur 4,2 Volt am Eingang des Backlight-Pins. Daher brauch ich die Diode, um die Spannung von 5V auf 4,3 V runterzubekommen. (Wenn Ihr wollt, könnt ihr auch einen Spannungsteiler mit einem 2. Poti aufbauen, damit ihr die Helligkeit regeln könnt).

Nochmal zum Autoreset: Wenn ihr per echo Daten an /dev/ttyUSB0 sendet, resettet sich das Board, Das führt dazu, dass die Nachricht am Ende nicht auf dem LCD angezeigt wird. Deshalb muss der Reset-Pin über einen 110 Ohm-Wiederstand mit 5V verbunden werden. Ist der Widerstand größer, resettet sich das Board trotzdem, ist er kleiner, zerschießt ihr evtl. euer Board (danke an die Leute vom arduino.cc Forum) DAS führt natürlich dazu, dass Arduino(IDE) das Board beim Programmieren nicht automatisch resettet. Also den Wiederstand beim Programmieren entfernen oder manuell resetten. (Ich muss sowieso den 5V-Stecker beim Programmieren entfernen, da der Programmer sonst nicht erreichbar ist.) Wie oben erwähnt: Die älteren Diecimila haben kein Autoreset und brauchen das nicht.

Software

Ich gehe hier nur auf Linux ein. Ich hab keine Ahnung, wie man unter Windows Daten direkt an nen COM-Port per Kommandozeile schickt. Vll. kann ja jemand was dazu beitragen.
Weiterhin solltet ihr auf eurem PC einen Webserver mit PHP-Unterstützung haben. Ich hab hier Lampp laufen.
Arduino-Entwicklungsumgebung sollte installiert sein, wenn ihr wisst wie, könnt ihr auch direkt in Emacs rumhacken, das ganze per avr-gcc kompilieren und dann mit avrdude brennen (Arduino-Entwicklungsumgebung macht nichts anderes). Hier der Code von der Sketch:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(2, 3, 8, 9, 10, 11);
int count=0;

void setup(){
  // set up the LCD's number of rows and columns: 
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(9600);
  lcd.print("Send serial data");
}

// Scrolling *very* long messages results in error (line jumping etc).
// This function *should* prevent it
void overflow() {
  // Autoscroll schonmal aus, brauchen wir dann bis zum "neuen" 32. Chr eh nicht mehr
  lcd.noAutoscroll();

  // lass den Nutzer noch zu Ende lesen
  delay(1500);

  // Loeschen und zur ersten Position
  lcd.clear();

  // Counter wieder auf 0
  count=0;
}

void loop()
{
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
    // clear the screen
    lcd.clear();
    // read all the available characters
    while (Serial.available() > 0) {
      // display each character to the LCD
      count++;
      lcd.write(Serial.read());

      // wechsele in die naechste Zeile
      if(count==16) lcd.setCursor(0,1);

      // Autoscroll an und warten bis der Nutzer die Displayanzeige gelesen hat
      if(count==32) { lcd.autoscroll(); delay(2000); }

      //Und los geht das scrollen
      if(count>=32) delay(500);

      // Bevor der Pufferueberluf (?) beginnt
      if(count==54) overflow();
    }
    lcd.noAutoscroll();
  }
  count = 0;
}

Ich hab hier ein 16x2 LCD mit meiner Anschlussbelegung. Wie das LCD-Objekt initialisiert werden muss, steht auch auf der arduino.cc Seite.
Wenn ihr ein 4-zeiliges LCD habt, könnt ihr den Quelltext natürlich anpassen.

Bash-Skript:

#Pfad zur Text-Datei anpassen
FILE="/opt/lampp/htdocs/test/text.txt"
LASTMOD=`stat -c '%Y' $FILE`

while [ 1 ]; do
NOWMOD=`stat -c '%Y' $FILE`
if [ $NOWMOD -ne $LASTMOD ]; then
   LASTMOD=$NOWMOD;
   cat $FILE > /dev/ttyUSB0
	#Zusätzliches Nachrichtenlog
   cat $FILE >> /home/user/arduino/newslog.txt
   echo >> /home/user/arduino/newslog.txt
fi

Das Bash Skript prüft die Text-Datei, in die per PHP die Nachrichten geschrieben werden.
Das Bash-Skript muss evtl noch ergänzt werden, sodass zu Beginn der /dev/ttyUSB-Port mit einer Baud von 9600 initialisiert wird. Dazu wird der Befehl stty -F /dev/ttyUSB0 9600 als erstes ausgeführt werden. Falsche Baud führt jedenfalls zu falschen Zeichen auf dem Display Zuletzt noch die Seiten für den Webserver:
Das Formular:

<form action="proc.php" method="post"> 

<p>Nachricht eingeben: <br />
<input type="Text" name="text" size=44 maxlength=42></p>

<input type="Submit" name="" value="speichern">

</form>

Und die Seite, die die Eingaben verarbeitet:

<?php
$text = $_POST['text'];
if ( strlen($text) >= 43 ) {
	echo "Nachricht zu lang!";
	exit;
}

if ( strlen($text) == 0 ) {
	echo "Keine Nachricht eingegeben!";
	exit;
}

if ( $text <> "" ) {
	$handle = fopen ( "text.txt", "w" );
	fwrite ( $handle, $text );
	fclose ( $handle );
	echo "Nachricht wurde gespeichert: " . $text;
	exit;
}
?>

Es empfiehlt sich ggf, das Formular mit einem Captcha zu schützen oder andere Schutzmaßnahmen einzubauen. Ansonsten kann es passieren, dass man zugespammt wird. Mit curl ist es z.B. möglich, Daten an Formulare (sowohl POST als auch GET) zu senden. Sollte ich in meiner Eile was vergessen haben, sagt Bescheid ^^
Hier noch ein Bild vom Ergebnis. Hier kann man auch gleich etwas von der Verkabelung erkennen, der +Pin ist 5V, der -Pin logischerweise auf GND

ArduLCD