Loading...
  Show Posts
Pages: [1] 2 3
1  International / Deutsch / Re: Platinen ätzen oder ätzen lassen? on: October 03, 2012, 03:18:34 pm
Ich nehme bei Durchkontaktierungen Silberdraht. Das funktioniert erstaunlich gut.
2  International / Deutsch / Re: Platinen ätzen oder ätzen lassen? on: October 03, 2012, 08:58:35 am
Und hier der Rest, also der eigentliche Teil: smiley-razz
Kurze Erklärung: Den Lock&Lock behälter konnte ich damals meiner Frau abschwatzen. (Danke hierfür!) Ein Abflußrohr samt Deckel für weniger als 1 Euro bei Baumarkt eures Vertrauens. In einer Zoohandlung dann einen Sauerstoffstein, Membranpumpe und einer Aquariumheizung, welches im Abflußrohr eingebaut wurde. Wobei das die teuersten Sachen waren......und ja, nicht zu vergessen den "Heiß" geliebten Kleber! smiley

Letzten Bild zeit den Platinenhalter. Platine hängt dann über dem Sauerstoffstein. Die Luftblasen intensität kann mit einem Ventil eingestellt werden. Das Bad muss nach dem Anrühren ca. 30min vorheizen und dann kann geätzt werden. Zeit beträgt ca. 15min zum ätzen einer Europlatine.
3  International / Deutsch / Re: Platinen ätzen oder ätzen lassen? on: October 03, 2012, 08:51:00 am
Ok,

also hier das Gehäuse der Belichtungsmaschine. Als Belichtungszeit haben sich 135s als optimal herausgestellt.
4  International / Deutsch / Re: Platinen ätzen oder ätzen lassen? on: October 03, 2012, 04:58:13 am
Eagle installieren und Platine selber machen. Solange Du einseitige oder max. 2 seite Platinen machst, kannst die prima Daheim selber herstellen. Habe einen Belichter aus einem alten Scanner und nem Gesichstbräuner gebaut. Hat 5 Euro gekostet. Und dann meine "Ätzanlage" aus Aquariumartikel. Kosten hier: 25 Euro.

Mache alle meine Platinen so. Funktioniert einwandfrei. Falls interesse besteht, kann ich Bilder schicken.
5  International / Deutsch / Re: PHP Frage zum Arduino Webserver / PHP / Text parsen on: July 20, 2012, 12:11:25 am
Guten morgen,

habe gestern noch den Code versucht. Leider kommt nur "Interner Server Fehler 500" als ausgabe. Sonst nix mehr. Sowohl wenn ich den Code in die gepostete Index.php einbinde, sowie in eine "Nackte" Index.php welches nur den von Dir geposteten Code enthält. Beides mal erscheint der "Interner Server Fehler 500".

Bin grad etwas ratlos.....Kann man das den nicht irgendwie auf Error Reporting stellen? Irgendwie bin ich ja Blind und kann euch und mir ja auch keine weiteren Fehlerbeschreibung liefern.

@Voralpenkreuz: Nur zur Info, Du hast recht. Wenn ich den Code so umstelle wie Du es gepostet hast, funktioniert es. smiley
6  International / Deutsch / Re: PHP Frage zum Arduino Webserver / PHP / Text parsen on: July 19, 2012, 09:36:36 am
Hi zusammen,

also ich habe mal grad den Code von Kudin eingebaut:

Code:
// read Temperature File
$TEMPhandle = fopen ("arduino/Arduino_Temp_2.txt", "r");
    $TEMPbuffer = fgets($TEMPhandle, 100);
fclose ($TEMPhandle);
if(preg_match('/Wohnzimmer: ([\-0-9.]+)(.*?)Aussen: ([\-0-9.]+)/i', $TEMPhandle, $result)
{
 // suchmuster gefunden, daten in der datei gültig
 $temp1 = intval($result[1]);  // temperaturwerte sind als string im $result-array gespeichert
 $temp2 = intval($result[3]); // intval macht einen integer-wert (bzw float) aus ihnen

}
else
{
 echo 'Suchmuster konnte nicht gefunden werden!';
}

leider geht dann gar nichts. Habe mit auskommentieren herausgefunden das es  an dem Befehl preg_match liegt oder zumindest was damit zu tun hat. Wahrscheinlich ist das Suchmuster falsch? Ich kann mir auch kein Error anzeigen lassen, dachte das funktioniert mit Error_all aber irgendwie nicht bei mir...

Andere Frage: muss in der if Zuweisung nicht TEMPbuffer statt TEMPhandle stehen?
7  International / Deutsch / Re: PHP Frage zum Arduino Webserver / PHP / Text parsen on: July 19, 2012, 04:28:42 am
Danke für eure Antworten. Komme erst heute Abend dazu eure Vorschläge umzusetzten und auszuprobieren.

@Voralpenkreuz: Welche Form meinst Du? Ich benutze das ENC28J60 Ethernet Modul mit diesem Treiber hier http://trollmaker.com/article11/arduino-1-0-with-enc28j60-ethernet-shield-v1-1/

Dieser Treiber scheint doch recht abgespeckt zu sein im Gegensatz zum Offiziele Shield. Aus diesem Grunde habe ich mich für das Parsen des Webservers entschieden. Jedoch hast Du mich auf folgende Idee gebracht: Wäre es möglich die Daten auf meinem Server zu Speichern (So wie Du es vorgeschlagen hast) und dann mit dem Ardunio die Datei einzulesen und dann den Grafischen Temperaturverlauf über den Ardunio Webserver anzeigen zu lassen? Grund hierfür ist der fehlenede SD Slot ^^
8  International / Deutsch / Re: PHP Frage zum Arduino Webserver / PHP / Text parsen on: July 18, 2012, 03:00:19 pm
Meine Vermutung:
$TEMPbuffer1 = fgets($TEMPhandle, 100);
gibt false zurück.

PHP-Referenz: "fgets — Liest eine Zeile von der Position des Dateizeigers"

Sprich: Du hast nur eine Zeile in der Datei, willst mit dem zweiten fgets aber eine zweite Zeile auslesen, weshalb du ein false von fgets zurückgegeben bekommst.

Ja ich dachte das er durch das erneute fget den inhalt der txt Datei nochmals ausließt. Also das in beiden $TEMPbuffern der selbe Inhalt drin steht. Dem ist wohl nicht so.....Mir qualmt der Kopf.... smiley-confuse
9  International / Deutsch / Re: PHP Frage zum Arduino Webserver / PHP / Text parsen on: July 18, 2012, 02:57:26 pm
Wäre es mit deinem Code einfacher es zu realisieren? Auch das er auf minus Temperaturen richtig reagiert? Also weil da ja noch ein - vor der Zahl steht? Oben ist der gesamte Code der Index.php hoffe Du / Ihr versteht ihn.
10  International / Deutsch / Re: PHP Frage zum Arduino Webserver / PHP / Text parsen on: July 18, 2012, 02:56:42 pm
Hallo Kudin,

danke für deine Antwort. Das problem ist, ich verstehe nicht wie ich es eleganter lösen könnte. Das mit preg_match und regular expressions hatte ich zwar mal angesehen aber auch hier fällt es mir schwer zu verstehen wie ich da vorgehen muss. Da tue ich micht mit der Arduino Sprache leichter ^^

Spass beiseite. Ich habe auch versucht mir mit echo es anzeigen zu lassen, leider bekomme ich nur eine weiße Seite.
Code:
<?php
//***************************************************************************************************
//   Initialization
//***************************************************************************************************

// set error handling to only report errors (no warnings, infos...)
// error_reporting( E_ALL );

function datumDeutsch($datumsstring){
$englisch = array("Morgen""Monday""Tuesday""Wednesday""Thursday""Friday""Saturday""Sunday""Mon""Tue""Wed""Thu""Fri""Sat""Sun""January""February""March""April""May""June""July""August""September""October""November""December""Jan""Feb""Mar""Apr""May""Jun""Jul""Aug""Sep""Oct""Nov""Dec""Motag");
$deutsch = array("Morgen""Montag""Dienstag""Mittwoch""Donnerstag""Freitag""Samstag""Sonntag""Mo""Di""Mi""Do""Fr""Sa""So""Januar""Februar""März""April""Mai""Juni""Juli""August""September""Oktober""November""Dezember""Jan""Feb""M&auml;r""Apr""Mai""Jun""Jul""Aug""Sep""Okt""Nov""Dez""Montag");
return str_replace($englisch$deutsch$datumsstring);
}



// read Temperature File
$TEMPhandle fopen ("arduino/Arduino_Temp_2.txt""r");
    
$TEMPbuffer fgets($TEMPhandle100);
    
$TEMPbuffer1 fgets($TEMPhandle100);
fclose ($TEMPhandle);


// print temperature
//Sensor0
$pos strpos($TEMPbuffer'Wohnzimmer:') + 12;
$posa strpos($TEMPbuffer'&'$pos);

$TempAkt substr($TEMPbuffer$pos$posa $pos);

//Sensor1
$pos1 strpos($TEMPbuffer1'Aussen:') + 8;
$pos1a strpos($TEMPbuffer1'&'$pos1);

$TempAkt1 substr($TEMPbuffer1$pos1$pos1a $pos1);





// load configuration
$config parse_ini_file("config.ini"true);
$sysconfig $config['System'];
// include path for zend framework
if ($sysconfig['zendfw_path'] != "") {
set_include_path(get_include_path() . PATH_SEPARATOR $sysconfig['zendfw_path']);
}
// set locale for date/time formatting
$loc setlocale(LC_ALL'de_DE.UTF8''de_DE''de''ge');

// includes
require_once 'library/tools.php';
require_once 
'library/dbconn.php';
require_once 
'library/iplugin.php';
 
// set the width and height of the new image in pixels
$image_width $sysconfig['image_width'];
$image_height $sysconfig['image_height'];

// create simple black image
$im ImageCreateTrueColor($image_width$image_height);
$backgroundcol ImageColorAllocate($im000);
ImageFillToBorder($im00$backgroundcol$backgroundcol);

// copy (resized) background image on background
$bgimagefile 'resources/background.jpg';
$bg = @ImageCreateFromJpeg ($bgimagefile); /* Versuch, Datei zu öffnen */
if ($bg) {
imagecopyresampled($im$bg0000$image_width$image_heightimagesx($bg), imagesy($bg));
}

// open database connection
$dbconn DbConnection::connect($sysconfig['db_host'], $sysconfig['db_name'], $sysconfig['db_user'], $sysconfig['db_password']);
if (!
$dbconn)
die('keine Datenbankverbindung möglich: ' mysql_error());

// create cache directory if it doesn't exist already
if (!file_exists('cache/'))
mkdir('cache');

// load and init plugins (calls, weather, calendar, mails...)
// every ini [group] except "System" is used as class name for a plugin and instantiated
$plugins = array();
foreach (
$config as $key=>$elem) {
if ($key != "System") {
// include class file
require_once 'plugins/' $key '.php';
// create instance
$plugins[$key] = new $key($dbconn$config[$key]);
}
}

// process call action if exist
if(($_GET['action'] == 'call') && $plugins['CallsPlugin'])
{
$plugins['CallsPlugin']->processCallEvent($_GET['event'], $_GET['src_name'], $_GET['src_address'], $_GET['src_numb'], $_GET['dst_name'], $_GET['dst_address'], $_GET['dst_numb'], $_GET['duration']);
}

//***************************************************************************************************
//   Check if plugin data is outdated and should be updated
//***************************************************************************************************

// do update of plugins data if last update is older than config:updatetime minutes
$updateInterval $sysconfig['updatetime'];
if ((
$updateInterval == null) || ($updateInterval == ""))
$updateInterval 5;
$updatePlugins false;
$query  "SELECT value FROM if_system where name = 'last_update'";
$result mysql_query($query$dbconn);
if (
mysql_num_rows($result) > 0) {
$row mysql_fetch_assoc($result);
$diff_seconds = (time() - $row['value']);
if ($diff_seconds >= (5*60))
{
$updatePlugins true;
// update last_update date
$query "UPDATE if_system SET value = '".time()."' WHERE name = 'last_update'";
mysql_query($query$dbconn) or die('Error, insert query failed: '.mysql_error());
}

} else {
$updatePlugins true;
// insert last_update date
$query "INSERT INTO if_system (name, value) VALUES ('last_update', '".time()."')";
mysql_query($query$dbconn) or die('Error, insert query failed: '.mysql_error());
}
mysql_free_result($result);

// debug: never do updates
//$updatePlugins = false;


//***************************************************************************************************
//   Output
//***************************************************************************************************

// styles
$style = array(); 
$style['textcolor'] = ImageColorAllocate ($im255255255);
$style['font'] = 'resources/calibri.ttf';
$style['fontb'] = 'resources/calibrib.ttf';

// current vertical offset for main info area. Must be increased by each plugin writing to this area,
// so that following plugins knows correct y position to start output from
$currentYOffset 160

// Do output of all plugins (calls, weather, calendar, mails...) with one exception:
// If the phone is currently ringing, skip displaying other plugins to show the name/number
// of the caller as fast and huge as possible and don't waste time/space for weather, mails etc...
if (($plugins['CallsPlugin']) && ($plugins['CallsPlugin']->isPhoneRinging())) {
// only print calls
$plugins['CallsPlugin']->doOutput($im$style$updatePlugins$currentYOffset);
} else {
// print all plugins in the order as they are in config
foreach ($plugins as $plugin) {
$plugin->doOutput($im$style$updatePlugins$currentYOffset);
}

$opt1 = array(
'width' => 150,
'align' => ALIGN_RIGHT
);
imagettftextboxopt($im200$image_width-162113$style['textcolor'], $style['font'], ' '.str_pad(number_format($TempAkt,1),3,'0',STR_PAD_LEFT).'°C'$opt1);
$Baum ImageCreateFromPNG 'resources/icons/tree.png' );
ImageCopy($im$Baum$image_width-10811100imagesx($Baum), imagesy($Baum));
ImageDestroy($Baum);
imagettftextboxopt($im200$image_width-285113$style['textcolor'], $style['font'], ' '.str_pad(number_format($TempAkt1,1),3,'0',STR_PAD_LEFT).'°C'$opt1);
$Haus ImageCreateFromPNG 'resources/icons/house.png' );
ImageCopy($im$Haus$image_width-23511200imagesx($Haus), imagesy($Haus));
ImageDestroy($Haus);


// check again for active incomming call (maybe we just get one in the meantime while updating/printing all other plugins)
// if so don't output any image to prevent overwriting the (incoming call) image already sent to another request
if (($plugins['CallsPlugin']) && ($plugins['CallsPlugin']->isPhoneRinging()))
die();
}

// print date & time
$opt = array(
    
'width' => 450,
    
'align' => ALIGN_LEFT
);
imagettftextboxopt($im7202025$style['textcolor'], $style['font'], strftime("%H:%M"), $opt);
imagettftextboxopt($im20020100$style['textcolor'], $style['font'], datumDeutsch(strftime("%A, %d. %B %Y (KW%V)")), $opt);   
imagesetthickness($im2);
imageline($im15140$image_width-20140$style['textcolor']);


// resize image
//$resized_image = imagecreatetruecolor(480, 324);
//imagecopyresampled($resized_image, $im, 0, 0, 0, 0, imagesx($resized_image), imagesy($resized_image), imagesx($im), imagesy($im));
//$im = $resized_image;   


// set the HTTP header type to jpeg
header("Content-type: image/jpeg"); 

// send the new PNG image to the browser
ImageJpeg($im);
 
// destroy the reference pointer to the image in memory to free up resources
ImageDestroy($im); 
 
// close database connection
DbConnection::disconnect();
 
?>
11  International / Deutsch / PHP Frage zum Arduino Webserver / PHP / Text parsen on: July 18, 2012, 12:59:11 pm
Hallo Forum,

bevor ich jetzt gleich Amok laufe, stelle ich mal mein (hoffentlich) letztes Problem hier ein. Ich habe einen Webserver auf dem Ardunio laufen mit dem enc28j60 Chipsatz. Alles funktioniert bestens. Jetzt möchte ich aber die Temperatur (nur Temperatur) per PHP Script auf meinem Infoframe anzeigen lassen. Dazu habe ich ein kleines zwischenscript geschrieben welches den Quellcode des Arduino Webservers parsed und mir in eine Text Datei auf meinem Server schreibt. Dies macht er alles wunderbar und es funktioniert auch alles Wunderbar. Hier mal der Inhalt der Textdatei:

Code:
<H1>THT - NET Webserver</H1><br/><table><br/><br/>Wohnzimmer: 25.0&deg;C / 44%<br/>Aussen: 15.9 &deg;C / 0%</table>

alles in eine Zeile. So jetzt mein PHP Script:

Code:
// read Temperature File
$TEMPhandle = fopen ("arduino/Arduino_Temp_2.txt", "r");
    $TEMPbuffer = fgets($TEMPhandle, 100);
    $TEMPbuffer1 = fgets($TEMPhandle, 100);
fclose ($TEMPhandle);


// print temperature
//Sensor0
$pos = strpos($TEMPbuffer, 'Wohnzimmer:') + 12;
$posa = strpos($TEMPbuffer, ' ', $pos);

$TempAkt = substr($TEMPbuffer, $pos, $posa - $pos);

//Sensor1
$pos1 = strpos($TEMPbuffer1, 'Aussen:') + 8;
$pos1a = strpos($TEMPbuffer1, ' ', $pos1);

$TempAkt1 = substr($TEMPbuffer1, $pos1, $pos1a - $pos1);

Und jetzt mein Problem. Die Temperatur vom Wohnzimmer wird mir angezeigt. Jedoch nicht die von Aussen. Egal was ich mache. Es will einfach nicht und ich habe keinen schimmer warum...... Kennt sich hier jemand mit PHP aus?
12  International / Deutsch / Re: Mal wieder millis()..... ;) on: July 08, 2012, 03:33:15 am
Also, ich habe trotz dem neuen Code von Dir immernoch das Problem. Ich habe im Moment die Verzögerung von 4s drin, jedoch hilft das auch nicht. Noch irgend eine andere Idee? Was kann man da noch machen?
13  International / Deutsch / Re: Mal wieder millis()..... ;) on: July 07, 2012, 07:05:27 am
So, inzwischen konnte ich folgendes beobachten. Ich habe alle meine "verzögerungen" auskommentiert. Ebenso die DS18B20 und habe anschließend die Loop so aufgebaut das nur noch NONSTOP DHT11 & DHT22 ohne jede verzögerung ausgelesen werden. Und siehe da......der Fehler ist zu sehen. Also scheint es wohl wirklich ein Timing Problem zu sein.......

Ich probiere jetzt mal deinen Code nochmals anderst einzubinden um den Interval entsprechend zu erhöhen....
14  International / Deutsch / Re: Mal wieder millis()..... ;) on: July 07, 2012, 02:39:09 am
So, das ist mein gesamter Code bis jetzt. Wie gesagt, eigentlich ist es schon fertig, bis auf den Fehler den ich gelegentlich bekomme. Alle Sensoren befinden sich auf dem Steckbrett und sollten demnach relativ identische Werte liefern. Ich habe öfters mal im Code versucht durch Tricks ein lcd.clear() zu vermeiden, da dadurch die Anzeige "flackert". Ich denke ihr werded schon sehen wo ich wie was gemacht habe.... smiley-wink Ist zwar nicht so dolle der Code, aber funktioniert bis auf meinen Fehler.......
15  International / Deutsch / Re: Mal wieder millis()..... ;) on: July 07, 2012, 02:35:08 am
Teil 5:
Code:
void digitalClockDisplay() // Uhrzeit Ausgabe auf LCD
{
  tempupdate = 1; // Tempupdate auf 1 setzten
  UpdateMinMax();
  time_t DCFtime = DCF.getTime(); // Prüfen ob neue Zeit vorhanden ist
  if (DCFtime!=0) {
    setTime(DCFtime); // Neue Zeit setzten
  }
  lcd.setCursor(0,0); // Cursorbeginn auf Zeichen 0, Zeile 1
  lcd.print("                    "); // Text "                    "
  lcd.setCursor(0,1); // Cursorbeginn auf Zeichen 0, Zeile 2
  lcd.print("     "); // Text "     "
  if (hour() < 10){
  lcd.setCursor(7,1); // Cursorbeginn auf Zeichen 7, Zeile 2
  } else {
      lcd.setCursor(6,1); // Cursorbeginn auf Zeichen 6, Zeile 2
  }
  lcd.print(hour()); // Stunden
  printDigits(minute()); // : Minuten
  printDigits(second()); // : Sekunden
  lcd.print("       "); // Text "       "
  lcd.setCursor(0,2); // Cursorbeginn auf Zeichen 0, Zeile 3
  if (day() < 10 && month() < 10){ // Wenn Tag < 10 und Monat < 10   
    lcd.print("      "); // Text "      "
  } else if (day() > 10 && month() < 10 || day() < 10 && month() > 10 ){ // Wenn Tag > 10 und Monat < 10 oder Tag < 10 und Monat > 10
      lcd.print("     "); // Text "     "
    } else { // alles andere
        lcd.print("    "); // Text "    "
      }
  lcd.print(day()); // Tag
  lcd.print("."); // Text "."
  lcd.print(month()); // Monat
  lcd.print("."); // Text "."
  lcd.print(year()); // Jahr
  lcd.print("       "); // Text "       "
  lcd.setCursor(0,3); // Cursorbeginn auf Zeichen 0, Zeile 4
  lcd.print("                    "); // Text "                    "
}

void printDigits(int digits) // Funktion um die : zwischen Std. / Min. / Sek. darzustellen
{
  lcd.print(":"); // Text ":"
  if(digits < 10) // Wenn Stunden weniger 10
      lcd.print('0'); // setzte 0 voran
      lcd.print(digits); // Ausgabe Digits
}


void SwitchButton () // Uhrzeit / Temperatur Taster überwachen
{
  int reading = digitalRead(analogPin3); // Taster einlesen
  if (reading != lastbuttonStateClock2) { // Prüfen ob Taster gedrückt wurde
    lastDebounceTime = millis(); // Debounce Timer reset
  }   
  if ((millis() - lastDebounceTime) > debounceDelay) {
    buttonStateClock = reading;
  } 
  lastbuttonStateClock2 = reading;
  if(buttonStateClock != lastbuttonStateClock) {
    lastbuttonStateClock = reading;
    buttonCount++;
  }
  if(buttonCount % 4==0) { // ButtonCount mit Mudolo zwischen 0 und 1 toggeln
    screen = 1; // setzt Screen auf 1
  }
  else {
    screen = 0; // oder Screen auf 0
  }
}


void loop(void) // Diese Loop wird ständig wiederholt
{
  Backlight(); // Aufruf der "Backlight" Loop
  UpdateMinMax(); // Min. und Max. Temp. / Luftfeuchte ermitteln und speichern
  SwitchButton(); // Uhrzeit / Temperatur Taster überwachen und Screen toggeln
  buttonState = digitalRead(analogPin1); // Min. Taster überwachen
  buttonState2 = digitalRead(analogPin2); // Max. Taster überwachen

  if (buttonState == HIGH && screen == 0 && tempupdate == 0) { // Wenn kein Taster gedrückt ist und Tempupdate = 0
    ShowActual(); // dann aktuelle Werte darstellen
  }     
  if
    (buttonState == LOW && screen == 0 && tempupdate == 0) {  // Wenn Min. Taster gedrückt ist und Tempupdate = 0   
    ShowMin(); // zeige Minimale Temperaturen und Luftfeuchte
  }
  if
    (buttonState2 == LOW && screen == 0 && tempupdate == 0) { // Wenn Max. Taster gedrückt ist und Tempupdate = 0   
    ShowMax(); // zeige Maximale Temperaturen und Luftfeuchte
  }
  if (screen == 1 ) { // Wenn kein Taster gedrückt ist und Screen == 1
    digitalClockDisplay(); // dann aktuelle Uhrzeit und Datum darstellen
  }
  if (screen == 0 && tempupdate == 1) { // Wenn kein Taster gedrückt ist, Screen == 0 und Tempupdate = 1
    ShowActualClock(); // dann zurück zur Temperaturanzeige aber vorher den Screen löschen
  }
}
Pages: [1] 2 3