Anbindung Arduino 2020

Hallo Zusammen,

Das die Weihnachtszeit auch immer Bastelzeit ist, speile ich gerade ein wenig mit einem Arduino.
Ziel ist es, mit diesem ein paar Anloge Werte (Stomsensor) auszulesen und Servos Anzusteuern. Das ganze kommt dann später an meine Absauganlage.
Auf dem Testbrett geht das schonmal ganz gut, nur wie bekomme ich das am besten ins IPS?
Der Wemos mit Tasmota hat leider nicht genug Analoge eingänge. das waren die ersten Tests.

Für den Arduino fällt mir bisher folgendes ein:

  • Serial über nen ESP8266 mit z.b. esp-link oder Tasmota
  • MySensors Projekt
  • MQTT mittels PubSubClient
  • KNX mit tpuart

KNX find ich bisher sogar am einfachsten umzusetzten da Lib einem Relativ viel Abnimmt.
MQTT wäre Universeller, da ich in einem anderen Projekt kein KNX habe.

Mir würde es sogar reichen, nur eine Binär werte in Beide richtungen zu schicken, die Auswertung vom Strom und Die Postition der Servos kann ich ja im Arduino selbst erledigen.

Oder habt ihr noch bessere einfachere Ideen?

Grüße & einen schönen Sonntag
Daniel

Servus
Ich habe hier mehrere Arduinos und auch ESP für diverse Anwendungen mit IPS verheiratet.
Die Daten gehen einfach als Klartext über eine TCP ClientSocket/Server Verbindung. Funktioniert tadellos. Auch schön zu debuggen, denn für Debug schicke ich die Daten über die USB Schnittstelle, wenns dann läuft kommt dann ein Ethernetmodul dran, eine Zeile im Code geändert und läuft.

Gibt auch noch andere Varianten wo ein JSON Objekt verschickt wird, oder auch über MQTT. Naja, is wohl moderner aber für meinen Geschmack unnötiger Overhead um nur ein paar simple Messwerte auszutauschen.

Beispielcode kann ich dir bei Bedarf gerne posten.

schöne Grüße
Bernhard

Hi Bernhard,

Das Angebot für den Beispielcode nehme ich gerne an, das klingt so einfach wie ich es mir Vorgestellt habe.
KNX werde ich bei gelegenheit für andere Ideen Testen.

Hättest du noch einen Tipp fürs Ethernetmodul?
Dachte an einen günstigen W5500

Danke & Grüße
Daniel

Ich nutze gerne mqtt. Weil hier die Bibliothek einem u.a. das Reconnect zuverlässig abnimmt. Außerdem kann es z.B. bei Retain Werten sinnvoll sein. Es zwingt dich ja keiner, in den mqtt Daten auch noch per json zu „overheaden“.
Ethernet mache ich immer mit dem Ethernet Shield W5100

Servus

Hab mir vor einiger Zeit eine Handvoll Ethernet Sheelds vom Chinesen kommen lassen. Die genaue Type weiß ich ehrlich gesagt nicht. Haben den gleichen Formfaktor wie die Sheelds fürn ArduinoUno.

Hier mal ein wenig Beispielcode
Dieser Sketch verwaltet Arduino seitig 5 Analoge Eingänge, er bildet aus den ADC Werten den runningAverage und schickt ihn dann in regelmäßigen Abständen an IPS. Die Skalierung und Umrechnung in die jeweiligen Einheiten erfolgt in IPS.


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

// Pin für LED
int LED = 13;
EthernetClient client;

int samples = 0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0XEF, 0XFE, 0xEC};
byte ip[] = {10, 0, 0, 50}; //eigene IP
byte subnet[] = {255, 255, 255, 0};
byte server[] = { 10, 0, 0, 101 };

RunningAverage myA0(10);
RunningAverage myA1(10);
RunningAverage myA2(10);
RunningAverage myA3(10);


void setup() {
  pinMode(LED, OUTPUT);


  Ethernet.begin(mac, ip, subnet);
  Serial.begin(9600);
  Serial.println("Start Ethernet");

  delay(5000);

  if (client.connect(server, 1101)) {
    Serial.println("connected");
  } else {
    Serial.println("connection failed");
  }

  myA0.clear();
  myA1.clear();
  myA2.clear();
  myA3.clear();
}

void loop() {

  String TxtToSend;

  myA0.addValue(analogRead(A0));
  myA1.addValue(analogRead(A1));
  myA2.addValue(analogRead(A2));
  myA3.addValue(analogRead(A3));
  samples++;
  digitalWrite(LED, LOW);
  if (samples == 5000)
  {
    digitalWrite(LED, HIGH);
    delay(1000);
    TxtToSend = "B" + String(myA0.getAverage()) + "," + String(myA1.getAverage()) + "," + String(myA2.getAverage()) + "," + String(myA3.getAverage()) + "E";
    Serial.println(TxtToSend);
    client.println(TxtToSend);

    samples = 0;
    myA0.clear();
    myA1.clear();
    myA2.clear();
    myA3.clear();

    if (!client.connected()) {
      client.stop();
      delay (1000);
      if (client.connect(server, 1101)) {
        Serial.println("connected");
      } else {
        Serial.println("connection failed");
      }
    }
  }

}

In IPS ist ein ServerSocket auf Port 1101 und eine entsprechende Registervariable angelegt.
Die Registervariable empfängt die Daten und leitet sie an dieses Script weiter:


<?
# called from regVar
$data = trim($_IPS['VALUE']);


#Dataformat: B DataA0,DataA1,DataA2,DataA3 E
if ((substr($data,0,1) == "B") && (substr($data,strlen($data)-1,1)) == "E"){

#echo $data;

$data = substr($data,1,strlen($data));  // "B" wegschneiden
$data = substr($data,0,strlen($data)-1); // "E" wegschneiden

$mydataArray = explode(",",$data);
SetValueInteger(19306,intval($mydataArray[0]));
SetValueInteger(30166,intval($mydataArray[1]));
SetValueInteger(58123,intval($mydataArray[2]));
SetValueInteger(44189,intval($mydataArray[3]));
}
?>

Soweit mal als rudimentäres Beispiel. Die Richtung Arduino -> IPS
Natürlich kann man auch Daten in die andere Richtung schicken und so was auch immer am Arduino machen. bspw. Porst setzen, oder gezielt einzelne Werte abfragen oder was auch immer.

Auch dafür hätte ich Beispiele, is aber etwas schwieriger zu erklären. Daher oben mal die einfachste Variante zum warmwerden.

viele Erfolg
Bernhard

Hallo Daniel,

ich bastel schon lange mit Tasmota, Und mit dem ESP32 (Nodemcu) geht da in der Beta schon mal viel mehr.
Anbindung an IPS lasse ich KaiS machen:D, ich kümmer mich um die Hardware. und den Code in Tasmota den ich brauche.

Aber bei den Stromsensoren würde ich mal eher bei ShellyEM schauen, und da nicht selber mehr basteln.

Ja, viele Wegen führen zum Ziel.
Ich persönlich folge wenn immer möglich dem KISS prinzip. Keep-Iit-Simple & Stupid. Den alles was nicht da ist kann auch nicht falschgehen.
Quasi die russische interpretation von Technik.

so long
bb

Hallo Zusammen,
Ich werde mit mal ein paar Ethernetshields bestellen und die Varianten durchtesten, kann ja nur lehrreich für mich sein.

@Bernhard, Ich glaube du hast 2 mal den Code vom Arduino gepostet.
Aber auf jedenfall schonmal danke =)

@Thomas
Den ESP32 habe ich auch bereits mit dem Tasmota Modul vom Kai im Einsetz, ist eine super sache.
Leider habe ich es bisher nicht geschafft, damit ein Servo Sauber anzusteuern und es Mangelt ihm auch an Analog Inputs.
Den Shelly EM kenn ich, nur ist der ein wenig Overkill um zu erkennen, ob z.b. die Kreissäge läuft.
Es braucht ja keine genaue Messung, sondern eher nen Trigger für Staubsauger und Klappe.

Grüße
Daniel

Sorry, hab den Post entsprechend korrigiert
bb

Alles gut Daniel,
ESP32 (Test) und Shelly EM habe ich für eine Solarzelle am laufen, Da kann man gut erkennen…
Für Kreissäge,würde als Trigger auch ein Inline Plug reichen (Schau mal bei KaiS Sammelbestellung) Oder auch ein Shelly Plug.
Da würde ich nicht mehr basteln, da die Dinge per Tasmota oder Shelly günstiger und fertig sind.

Und Servo habe ich am ESP32 noch nicht probiert, nur an der alten Nodemcu.

Meine Favoriten nach einigem Ausprobieren sind auch mqtt mit Arduino Bibliothek, oder beim ESP mit ESPEasy. Läuft sehr Stabil und ist mit wenigen Zeilen eingerichtet.

Hi Thomas,

Momentan Steckt das Sogar wirklich ein Shelly Pug dazwischen, ist auch ganz Praktisch für die Handgeräte die ja immer in der nächsten Freien Steckdose Stecken.

Muss aber zugeben, ich bin da gestern auch ein wenig mit den NodeMCU Varianten durcheinander gekommen.
Hab mit jetzt mal die neuste Variante bestellt, hat ja auch mehr AnalogPins die man leucht per SPannungsteiler anpassen kann.

Macht auf jedenfall mal wieder Spaß mit euch zu Diskutieren und zu Basteln.
Durch die Prozessleittechnik bin ich da ganze andere Komponennten gewohnt.

MQTT & Bernhards Variante kommen zum Test mal auf den Arduino.

Grüße
Daniel

Hallo ihr alle,

Ich spiele gerade ein wenig mit dem TasmotaClient rum.
Man kann damit ziemlich einfach MQTT Nachrichten vom Arduino schicken und den ESP wie von Tasmota gewohnt nutzen.
Das beste ist, den Sketch kann man einfach in den Arduino über die Tasmota OTA funktion laden und muss diesen nicht per USB Anstecken.

Grüße
Daniel

Hallo,
ich habe einen ESP32, der Daten an IPS schickt. In IPS habe ich einen ServerSocket auf Port 1011 und eine entsprechende Registervariable angelegt. Die Daten des ESP32 werden auch im Debug der RegVar angezeigt.
Nun stehe ich auf dem Schlauch:confused:: Was muss ich machen, damit ich diese Daten in IPS verarbeiten kann. D.h. wie lese ich die Daten der RegVar aus?

Du musst in der Registervariable ein Zielscript anlegen. Dort dann mal diesen Code einbauen und ins Message Log gucken.

IPS_LogMessage("RegScript", print_r($_IPS,true));

Ich glaube das ist meine Kernfrage: WIE „lege ich in der Registervariable ein Zielscript an“?

Script irgendwo im Baum anlegen und in der Instanz Registervariable als Ziel-Script eintragen.
Michael

OK, hab’s raus. Danke für die vielen Tipps in diesem Thread!!!