Hauptmenü

Firmata+Arduino

Begonnen von Rohan, 31 Januar 2013, 14:31:12

Vorheriges Thema - Nächstes Thema

T.ihmann

Hallo ich würde gerne nach dieser Anleitung einen Wasserstandssenor für meine Zisterne realisieren:

http://forum.hanfburg.de/fhb/showthread.php?t=299000

Es wird mittels Ultraschallsensor die Höhe gemessen, auf dem Arduino wird die Berechnung vorgenommen und im Beispiel auf der seriellen Konsole ausgegeben. Kann ich das Ergebnis auch mit Firmata ausgeben lassen, also Messung und Berechnung auf dem Arduino und Ausgabe per Firmata / Ethernet an Fhem...

Wzut

Tipp : nimm als Sensor den SFR02 und hänge ihn mit Onewire an Firmata. Um den SFR02 an Onwire zu bringen gibt es fertig :http://forum.fhem.de/index.php/topic,10962.0.html oder   http://forum.fhem.de/index.php/topic,21512.msg149891.html#msg149891
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Tobias

#317
mit dem Pullup klappts auch nicht... Habe das Gefühl mit dem Pin passt etwas nicht.
Habe beim OWX Pin9 angegeben, auf dem Arduino steht auch 9. Hoffe das ist richtig... ODer muss ich den ATMEGA-Pin angeben??
D9 = Atmega Pin 13 = PB1
Im Log mit frm verbose=5 hab ich  folgendes...
2014.05.17 19:26:41 4: Connection accepted from FRM:192.168.10.19:1027
2014.05.17 19:26:41 5: FRM:>ff
2014.05.17 19:26:44 3: querying Firmata Firmware Version
2014.05.17 19:26:44 5: FRM:>f079f7
2014.05.17 19:26:44 5: FRM:<f079020643006f006e0066006900670075007200610062006c0065004600690072006d006100740061002e0069006e006f00f7
2014.05.17 19:26:44 3: Firmata Firmware Version: ConfigurableFirmata.ino V_2_06
2014.05.17 19:26:44 5: FRM:>f069f7
2014.05.17 19:26:44 5: FRM:>f06bf7
2014.05.17 19:26:46 5: FRM:>f07a6807f7
2014.05.17 19:26:46 5: FRM:>f40907
2014.05.17 19:26:46 1: possible freeze: timer should 17:26:42, delay is 3.47404909133911
2014.05.17 19:26:46 5: FRM:>f0734009f7
2014.05.17 19:26:49 1: OWX: 1-Wire devices found on bus owxFRM ()
2014.05.17 19:26:49 1: possible freeze: timer should 17:26:47, delay is 2.13275909423828
2014.05.17 19:26:49 5: FRM:>f0730109f7
2014.05.17 19:26:56 5: FRM:>f0734009f7
2014.05.17 19:26:59 1: OWX: 1-Wire devices found on bus owxFRM ()
2014.05.17 19:26:59 1: possible freeze: timer should 17:26:56, delay is 2.86885595321655
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

T.ihmann

Welchen Arduino hast Du denn ? Pin ist nicht gleich Pin, das war auch erst mein Problem

T.ihmann

#319
Beim Arduino Nano ist Pin D9 z.B. Pin 12. Sollte auf dem Arduino auch stehen...

Bildquelle: http://www.reseau.org/arduinorc/index.php?n=Main.HomePage

Tobias

Mein Arduino:
http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Boards/Arduino-Pro-Mini-v13.pdf
Wenn ich das richtig sehe ist D9 der Pin13?? Trotzdem kommt nichts per autocreate :(
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Wzut

Zitat von: Tobias am 17 Mai 2014, 19:21:20
mit dem Pullup klappts auch nicht... Habe das Gefühl mit dem Pin passt etwas nicht.
Habe beim OWX Pin9 angegeben, auf dem Arduino steht auch 9. Hoffe das ist richtig... ODer muss ich den ATMEGA-Pin angeben??
D9 = Atmega Pin 13 = PB1

2014.05.17 19:26:49 1: OWX: 1-Wire devices found on bus owxFRM ()
9 stimmt ein deinem Fall , siehe -> http://arduino.cc/en/Hacking/PinMapping168
die Zeile oben in deinem log zeigt doch auch das an dem Pin etwas in Richtung 1-W gefunden wird.
Teste doch zuerst mal OneWire alleine mit einem simplen Arduino Sketch ganz ohne Firmata. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

T.ihmann

#322
Ich bräuchte doch mal Hilfe mit meinem Arduino + Firmata + Ethernet. Das Problem ist der Arduino verschwindet irgendwann, Fhem Log ist dann, Fhem hängt dann komplett:

2014.05.18 11:29:08 1: 3030 disconnected, waiting to reappear (FRM:192.168.178.150:1026)
2014.05.18 11:29:30 1: 192.168.178.25:1000 reappeared (HMLAN1)
2014.05.18 11:29:30 1: HMLAN_Parse: HMLAN1 new condition init
2014.05.18 11:29:31 1: HMLAN_Parse: HMLAN1 new condition ok
2014.05.18 11:31:39 1: CallBlockingFn: Can't connect to localhost:7072


Weiter oben war mal der Vorschlag gekommen, ich solle es mal mit einem Watchdog versuchen, habe ich gemacht, hat aber nichts gebracht, der Arduino hängt dann immer noch, eine LED blinkt ganz wild. Anbei mein Sketch:

/*
* Firmata is a generic protocol for communicating with microcontrollers
* from software on a host computer. It is intended to work with
* any host computer software package.
*
* To download a host software package, please click on the following link
* to open the download page in your default browser.
*
* http://firmata.org/wiki/Download
*/

/*
  Copyright (C) 2006-2008 Hans-Christoph Steiner.  All rights reserved.
  Copyright (C) 2010-2011 Paul Stoffregen.  All rights reserved.
  Copyright (C) 2009 Shigeru Kobayashi.  All rights reserved.
  Copyright (C) 2009-2013 Jeff Hoefs.  All rights reserved.
  Copyright (C) 2013 Norbert Truchsess. All rights reserved.
  Copyright (C) 2014 Nicolas Panel. All rights reserved.
 
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  See file LICENSE.txt for further informations on licensing terms.

  formatted using the GNU C formatting and indenting
*/


#include <Firmata.h>

/*
* by default Firmata uses the Serial-port (over USB) of Arduino.
* ConfigurableFirmata may also comunicate over ethernet using tcp/ip.
* To configure this 'Network Firmata' to use the original WIZ5100-based
* ethernet-shield or Arduino Ethernet uncomment the includes of 'SPI.h' and 'Ethernet.h':
*/

//#include <SPI.h>
//#include <Ethernet.h>

/*
* To configure 'Network Firmata' to use an ENC28J60 based board include
* 'UIPEthernet.h' (no SPI.h required). The UIPEthernet-library can be downloaded
* from: https://github.com/ntruchsess/arduino_uip
*/

#include <UIPEthernet.h>

#if defined ethernet_h || defined UIPETHERNET_H
/*==============================================================================
* Network configuration for Network Firmata
*============================================================================*/
#define NETWORK_FIRMATA
//replace with ip of server you want to connect to, comment out if using 'remote_host'
#define remote_ip IPAddress(192,168,178,20)
//replace with hostname of server you want to connect to, comment out if using 'remote_ip'
//#define remote_host "server.local"
//replace with the port that your server is listening on
#define remote_port 3030
//replace with arduinos ip-address. Comment out if Ethernet-startup should use dhcp
#define local_ip IPAddress(192,168,178,150)
//replace with ethernet shield mac. It's mandatory every device is assigned a unique mac
const byte mac[] = {0x90,0xA2,0xDA,0x0D,0x08,0x03};
#endif

// To configure, save this file to your working directory so you can edit it
// then comment out the include and declaration for any features that you do
// not need below.

// Also note that the current compile size for an Arduino Uno with all of the
// following features enabled is about 22.4k. If you are using an older Arduino
// or other microcontroller with less memory you will not be able to include
// all of the following feature classes.

#include <utility/DigitalInputFirmata.h>
DigitalInputFirmata digitalInput;

#include <utility/DigitalOutputFirmata.h>
DigitalOutputFirmata digitalOutput;

#include <avr/wdt.h>

//#include <utility/AnalogInputFirmata.h>
//AnalogInputFirmata analogInput;

//#include <utility/AnalogOutputFirmata.h>
//AnalogOutputFirmata analogOutput;

//#include <Servo.h> //wouldn't load from ServoFirmata.h in Arduino1.0.3
//#include <utility/ServoFirmata.h>
//ServoFirmata servo;

//#include <Wire.h> //wouldn't load from I2CFirmata.h in Arduino1.0.3
//#include <utility/I2CFirmata.h>
//I2CFirmata i2c;

#include <utility/OneWireFirmata.h>
OneWireFirmata oneWire;

//#include <utility/StepperFirmata.h>
//StepperFirmata stepper;

#include <utility/FirmataExt.h>
FirmataExt firmataExt;

//include <utility/FirmataScheduler.h>
//FirmataScheduler scheduler;

#include <utility/EncoderFirmata.h>
EncoderFirmata encoder;


// dependencies. Do not comment out the following lines
#if defined AnalogOutputFirmata_h || defined ServoFirmata_h
#include <utility/AnalogWrite.h>
#endif

#if defined AnalogInputFirmata_h || defined I2CFirmata_h || defined EncoderFirmata_h
#include <utility/FirmataReporting.h>
FirmataReporting reporting;
#endif

// dependencies for Network Firmata. Do not comment out.
#ifdef NETWORK_FIRMATA
#if defined remote_ip && defined remote_host
#error "cannot define both remote_ip and remote_host at the same time!"
#endif
#include <utility/EthernetClientStream.h>
EthernetClient client;
#if defined remote_ip && !defined remote_host
#ifdef local_ip
  EthernetClientStream stream(client,local_ip,remote_ip,NULL,remote_port);
#else
  EthernetClientStream stream(client,IPAddress(0,0,0,0),remote_ip,NULL,remote_port);
#endif
#endif
#if !defined remote_ip && defined remote_host
#ifdef local_ip
  EthernetClientStream stream(client,local_ip,IPAddress(0,0,0,0),remote_host,remote_port);
#else
  EthernetClientStream stream(client,IPAddress(0,0,0,0),IPAddress(0,0,0,0),remote_host,remote_port);
#endif
#endif
#endif

/*==============================================================================
* FUNCTIONS
*============================================================================*/

void systemResetCallback()
{
  // initialize a defalt state

  // pins with analog capability default to analog input
  // otherwise, pins default to digital output
  for (byte i=0; i < TOTAL_PINS; i++) {
    if (IS_PIN_ANALOG(i)) {
#ifdef AnalogInputFirmata_h
      // turns off pullup, configures everything
      Firmata.setPinMode(i, ANALOG);
#endif
    } else if (IS_PIN_DIGITAL(i)) {
#ifdef DigitalOutputFirmata_h
      // sets the output to 0, configures portConfigInputs
      Firmata.setPinMode(i, OUTPUT);
#endif
    }
  }

#ifdef FirmataExt_h
  firmataExt.reset();
#endif
}

/*==============================================================================
* SETUP()
*============================================================================*/

void setup()
{
wdt_enable(WDTO_2S);
#ifdef NETWORK_FIRMATA
#ifdef local_ip
  Ethernet.begin((uint8_t*)mac,local_ip);  //start ethernet
#else
  Ethernet.begin((uint8_t*)mac); //start ethernet using dhcp
#endif
  delay(1000);
#endif
  Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);

#if defined AnalogOutputFirmata_h || defined ServoFirmata_h
  /* analogWriteCallback is declared in AnalogWrite.h */
  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
#endif

  #ifdef FirmataExt_h
#ifdef DigitalInputFirmata_h
  firmataExt.addFeature(digitalInput);
#endif
#ifdef DigitalOutputFirmata_h
  firmataExt.addFeature(digitalOutput);
#endif
#ifdef AnalogInputFirmata_h
  firmataExt.addFeature(analogInput);
#endif
#ifdef AnalogOutputFirmata_h
  firmataExt.addFeature(analogOutput);
#endif
#ifdef ServoFirmata_h
  firmataExt.addFeature(servo);
#endif
#ifdef I2CFirmata_h
  firmataExt.addFeature(i2c);
#endif
#ifdef OneWireFirmata_h
  firmataExt.addFeature(oneWire);
#endif
#ifdef StepperFirmata_h
  firmataExt.addFeature(stepper);
#endif
#ifdef FirmataReporting_h
  firmataExt.addFeature(reporting);
#endif
#ifdef FirmataScheduler_h
  firmataExt.addFeature(scheduler);
#endif
#ifdef EncoderFirmata_h
  firmataExt.addFeature(encoder);
#endif
#endif
  /* systemResetCallback is declared here (in ConfigurableFirmata.ino) */
  Firmata.attach(SYSTEM_RESET, systemResetCallback);

  // Network Firmata communicates with Ethernet-shields over SPI. Therefor all
  // SPI-pins must be set to IGNORE. Otherwise Firmata would break SPI-communication.
  // add Pin 10 and configure pin 53 as output if using a MEGA with Ethernetshield.
  // No need to ignore pin 10 on MEGA with ENC28J60, as here pin 53 should be connected to SS:
#ifdef NETWORK_FIRMATA
  // ignore SPI and pin 4 that is SS for SD-Card on Ethernet-shield
  for (byte i=0; i < TOTAL_PINS; i++) {
    if (IS_PIN_SPI(i)
        || 4==i
        // || 10==i //explicitly ignore pin 10 on MEGA as 53 is hardware-SS but Ethernet-shield uses pin 10 for SS
        ) {
      Firmata.setPinMode(i, IGNORE);
    }
  }
//  pinMode(PIN_TO_DIGITAL(53), OUTPUT); configure hardware-SS as output on MEGA
  pinMode(PIN_TO_DIGITAL(4), OUTPUT); // switch off SD-card bypassing Firmata
  digitalWrite(PIN_TO_DIGITAL(4), HIGH); // SS is active low;

  // start up Network Firmata:
  Firmata.begin(stream);
#else
  // start up the default Firmata using Serial interface:
  Firmata.begin(57600);
#endif
  systemResetCallback();  // reset to default config
}

/*==============================================================================
* LOOP()
*============================================================================*/
void loop()
{
wdt_reset();  a
#ifdef DigitalInputFirmata_h
  /* DIGITALREAD - as fast as possible, check for changes and output them to the
   * stream buffer using Firmata.write()  */
  digitalInput.report();
#endif

  /* STREAMREAD - processing incoming messagse as soon as possible, while still
   * checking digital inputs.  */
  while(Firmata.available()) {
    //wdt_reset();
    Firmata.processInput();
#ifdef FirmataScheduler_h
    if (!Firmata.isParsingMessage()) {
      goto runtasks;
    }
  }
  if (!Firmata.isParsingMessage()) {
runtasks: scheduler.runTasks();
#endif
  }

  /* SEND STREAM WRITE BUFFER - TO DO: make sure that the stream buffer doesn't go over
   * 60 bytes. use a timer to sending an event character every 4 ms to
   * trigger the buffer to dump. */

#ifdef FirmataReporting_h
  if (reporting.elapsed()) {
#ifdef AnalogInputFirmata_h
    /* ANALOGREAD - do all analogReads() at the configured sampling interval */
    analogInput.report();
#endif
#ifdef I2CFirmata_h
    // report i2c data for all device with read continuous mode enabled
    i2c.report();
#endif
#ifdef EncoderFirmata_h
    // report encoders positions if reporting enabled.
    encoder.report();
#endif
  }
#endif
#ifdef StepperFirmata_h
  stepper.update();
#endif
#if defined NETWORK_FIRMATA && !defined local_ip
  if (Ethernet.maintain())
    {
      stream.maintain(Ethernet.localIP());
    }
#endif
}


Hat jemand eine Idee für mich ? Vielen Dank. Ist Wdt so richtig in den Sketch eingebaut ?

Tobias

@T.Ihmann
Mit dem "Verschwinden" hatte ich auch erst zu kämpfen, lag an einer nicht optimalen Stromversorgung. Der Arduino war am Strom angeschlossen und der Ethernetadapter am Arduino. Jetzt hängt der Ethernetadapter direkt an der Stromversorgung und er löppt seit Tagen ohne Probleme durch :)

@Wzut:
Zitat9 stimmt ein deinem Fall , siehe -> http://arduino.cc/en/Hacking/PinMapping168
die Zeile oben in deinem log zeigt doch auch das an dem Pin etwas in Richtung 1-W gefunden wird.
Teste doch zuerst mal OneWire alleine mit einem simplen Arduino Sketch ganz ohne Firmata. 
Der Arduino Mini Pro hat einen ATMEGA328P drauf, ich glaube aber das dieser mit dem ATMEGA168 pinkompatibel ist..?
Wo in meinem Log siehtst du das etwas gefunden wird? Die krytischen Log5 Meldung des FRM -Moduls kann ich auch nicht deuten :(
Z.B. pünktlich alle 5Minuten kommt dieses "FRM:>f073010df7"

Was für einen "simplen" 1w Sketch meinst du? Hänge ich einen "normalen" 1w-Busmaster dran, werden die Devices auch gefunden. Ich überprüfe es aber sicherheitshalber heute abend noch einmal...

Leider ist Norbert gerade abwesend, die Sketch-Minimalkonfiguration für 1wire wäre noch wichtig. Mit oder Ohne Scheduler? Was muss aktiviert werden damit in den Internals die onewire-pins stehen? Auch schmiert FHEM immer ab wenn der Arduino vom Netz getrennt wird :(
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Wzut

Zitat von: Tobias am 19 Mai 2014, 08:06:26
Was für einen "simplen" 1w Sketch meinst du?
z.B sowas : http://playground.arduino.cc/Learning/OneWire-DE , ist zwar für DS1820 gedacht, aber wenn du die Adressen deiner Geräte da siehst kannst  den Punkt doch schon mal den grünen Haken geben.

Um die anderen Dinge zu testen würde ich mal Analog und Digital I/O reinnehmen und Ethernet raus und den Arduino dann seriell an FHEM ankoppeln
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

ntruchsess

Zitat von: Tobias am 19 Mai 2014, 08:06:26
Leider ist Norbert gerade abwesend, die Sketch-Minimalkonfiguration für 1wire wäre noch wichtig. Mit oder Ohne Scheduler? Was muss aktiviert werden damit in den Internals die onewire-pins stehen?
Naja, ich hab halt noch eine andere Baustelle (diesmal eine Echte), die verzehrt im Moment an den Wochenenden einiges von meiner Energie. Hab grade für die Perimeterdämmung mehrere Qubikmeter Erde mit dem Russischen Bagger ausgehoben. Danach kann man abends nicht mehr wirklich gut denken :-(

Also: Scheduler brauchts nicht, der wird von FRM (bisher) noch gar nicht unterstützt. Ich habe vor damit iButtons über OWID mit einer schnellen, arduinoseitig getriggerten Bussuche zu versorgen, aber das ist aktuell noch Zukunftsmusik.

FirmataExt ist für SysEx-basierte Features (wie 1-Wire) unverzichtbar. Ohne FirmataExt geht nur Digital+Analog-I/O.

Zitat von: Tobias am 19 Mai 2014, 08:06:26Auch schmiert FHEM immer ab wenn der Arduino vom Netz getrennt wird :(
Ja, hab ich schon mitgekriegt, Fix ist in Arbeit ;-)

Gruß,

Norbert

while (!asleep()) {sheep++};

Tobias

Hallo Norbert,
ich kann dich gut verstehen... bin auch vor langer Zeit mal in den Genuss gekommen alleine 130m³ ausheben zu dürfen... allerdings einen ganzen Sommer lang...
Die Sache mit dem Scheduler hört sich zu an als ob Firmata z.Z. garnicht  selbstständig alleine den Bus durchsucht und Änderungen per push an fhem rausgibt? Die Frage, wo ich denn das pollingIntervall einstellen kann, wäre von mir gekommen sobald 1wire bei mir erkannt wird.
Ansich ist es genau DAS Kriterium um von meinen USB-Busmaster auf einen ArduinoBusmaster zu wechseln um das Polling von FEHM auf den Arduino zu verlagern..

Den neuen Sketch mit FirmataExt spiel ich heute abend mal ein und prüfe. Leider habe ich nirgens eine Modulbeschreibung außerhalb der Haupt-Funktionen gefunden, also zb. Wozu ist Stepper/Ext/Encoder da, was macht Servo - Beispiele?
Aber da könnten sich ja bereits vorhandene Anwender dieser Module im Wiki verewigen.
Sobald 1wire bei mir läuft passe auch ich wieder das Wiki an.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

ntruchsess

Zitat von: Tobias am 19 Mai 2014, 13:35:22
Die Sache mit dem Scheduler hört sich zu an als ob Firmata z.Z. garnicht  selbstständig alleine den Bus durchsucht und Änderungen per push an fhem rausgibt?
Die Bussuche mit FRM läuft schon selbstständig, aber der Startbefehl kommt aktuell vom OWX(_ASYNC). Das könnte man über den Firmatascheduler automatisieren. Würde aber nicht wirklich die Welt an Rechenzeit auf FHEM-seite einsparen, das Start-kommando zur Bussuche ist nur ein paar Bytes lang.

Beim DS2480 ist das anders, da steuert OWX(_ASYNC) jeden Schritt.

Gruß,

Norbert
while (!asleep()) {sheep++};

Tobias

Zitat von: ntruchsess am 19 Mai 2014, 14:03:12
Die Bussuche mit FRM läuft schon selbstständig, aber der Startbefehl kommt aktuell vom OWX(_ASYNC). Das könnte man über den Firmatascheduler automatisieren. Würde aber nicht wirklich die Welt an Rechenzeit auf FHEM-seite einsparen, das Start-kommando zur Bussuche ist nur ein paar Bytes lang.

Beim DS2480 ist das anders, da steuert OWX(_ASYNC) jeden Schritt.

Mit Startbefehl meinst du das zb. OWTHERM-Define andem ja auch das Intervall hängt? Übernimmt der Arduino dann das Pollen für dieses angegebene Intervall im DeviceDefine oder ein anderes? Das ursprüngliche OWX-Pollen läuft dann warscheinlich ins leere (weil ja Firmata pollt)?
Mit DS2480 meinst du den DS2482? Kommt bei mir im zweiten Schritt...
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

ntruchsess

#329
Tobias,

ich denke, Du hast das Prinzip der OneWire-Firmata noch nicht ganz verstanden. Der Arduino ist in der Lage bestimmte 1-Wire-kommandoabfolgen selbstständig auszuführen. Der Firmata-client (OWX(_ASYNC)) sagt der Firmata entweder: 'mache eine 1-Wire-Bussuche', dann läuft diese auf dem Arduino und schickt das Ergebniss (alle gefundenen Devices) an den Firmata-client zurück. Oder er sagt: 'mache einen Bus-reset, sprich ein bestimmtest Device mit der Addresse XXX an, schicke folgende Bytes dorthin und lese anschließend YY Bytes. Der Arduino tut das und wenn er fertig ist, schickt er die YY Bytes an den Firmata-client zurück. Mehr Intelligenz steckt im OneWire-firmata feature nicht drin. Der Arduino merkt sich dabei nichts. Nach dem Abarbeiten einer 1-Wire-kommandfolge und dem Verschicken des Ergebnisses vergisst er alles, was er getan hat. Mehr Eingenintelligenz wäre bei der Speicherknappheit auch nicht stabil unterzubringen, als Alternaive müsste man die Anzahl der Devices auf dem 1-Wire Bus (stark) einschränken. Das ist aber schon deutlich mehr Eigenintelligenz als die anderen Busmasterchips (DS2480 oder DS2482) mitbringen. Denen muss man jeden Einzelschritt vorgenannter Abfolgen einzeln sagen (und dabei noch auf das korrekte Timing achten). Beim Arduino bedeutet das Starten einer Bussuche, dass OWX gerade einmal 4 Bytes in einem Rutsch abschickt und dann auf das fertige Ergebnis wartet. OWX wartet dabei synchron und blockiert FHEM, OWX_ASYNC wartet in einem Protothread wärend FHEM weiterläuft und der Arduino parallel dazu den 1-Wire-bus durchsucht.

Der FirmataScheduler ist in der Lage Firmata-kommando-abfolgen zu speichern und zeitversetzt (auch zyklisch) abzuspielen, damit kann man sich das Senden der genannten 4 Bytes zum Starten der Bussuche sparen. Der Arduino schickt dann die Ergebnisse selbstständig im vorgegebenen Interval. Leider kann man (wg. des begrenzten Speichers) keine komplexeren Aufgaben im FirmataScheduler unterbringen, insbesonders kann man nicht einfach mal alle Device-abfragen da rein programmieren, da wäre schon nach einer Handvoll Devices der Speicher des Arduinos voll. (Eine DS18B20 Abfrage braucht z.B. ca. 30 Bytes pro Device. Das klingt nach wenig, ist aber eine ganze Menge, wenn nur wenige 100kb verfügbar sind). Ist der Speicher zu Ende stürzt der Arduino einfach ab bzw. resettet sich.

Nur mal soviel dazu, was man erwarten kann und was nicht.

Gruß,

Norbert

P.S. wenn man einen DS2482 am Arduino hat, dann ändert das nichts prinzipielles an oben gesagtem. Mit dem DS2482 hat der Arduino ggf. ein physikalisch besser an 1-Wire angepasstes Interface und muss weniger Timing selber in Software machen. Damit sollten mehr Devices bei längerem 1-Wire-bus funktionieren, als mit der reinen Softwarelösung. Alle anderen Einschränkungen und/oder Möglichkeiten sind aber praktisch identisch.
while (!asleep()) {sheep++};