← Zurück zur Übersicht

Temparatur auf eine MCC-Adresse

Veröffentlicht am 2016-07-12 00:00:00.0


Temparatur auf eine MCC-Adresse

Die Messergebnisse aus dem Arduino über ISOagriNET-Multicast-Kommunikation verteilen

Multicast - basierte Kommunikation mit dem ARDUINO (Session 1)

*C.Paulsen 2026-07-06

Im Rahmen meiner ISOagriNET-basierten Entwicklungsarbeiten eines Smart-Home-Netzwerks mit Hilfe von embeddeed Devices wie den Arduino, den Raspberry PI, SNAP, ODROID, Beagebox Black und Pandaboard ist es wichtig sich mit UDP basierter Multicast-Kommunikation zu beschäftigen.

Leider beginnt dies gleich mit einigen Hürden. Alte Multicast-Bibliotheken funktionen nicht mehr mit der aktuellen Entwicklungsumgebung und die ETHERNET-Bibliothek inkludiert kein MultiCast. Nach einigen Rechergen habe ich dann aber einige Patches gefunden, die helfen, die ETHERNET-Library zu erweitern.

Änderungen an der ETHERNET-Library in der ARDUINO-IDE unter LINUX

Diese Änderungen stammen von einem Patch:

[Patchlink](https://github.com/arduino/Arduino/pull/1531/commits/3811729f82ef05f3ae43341022e7b65a92d333a2 "EthernetLib gepatcht für MCC")

Um die Ethernet-Library unter Linux zu finden, suchst Du, zunächst mal, das Verzeichnis, in dem die Arduino-IDE abgelegt ist:

sudo find /usr -name "arduino*" -print

Auf meinem Rechner findet sich die entsprechende ETHERNET-Bibliothek dann unter

/usr/share/arduino/libraries/Ethernet/

Sichere das Verzeichnis vorab mit einem sudo tar cvfz ethernet.tgz Ethernet, um im Fehlerfall das Verzeichnis wieder herstellen zu können. In die beiden Daten EthernetUdp.cpp und EthernetUdp.h trägst Du dann einfach die fehlenden Zeilen ein. Anschließend die Arduino-IDE frisch starten.

Die Schaltung

Hier die einfache Schaltung

Schaltung

Das Arduino-Programm

Das Arduino-Programm liest die Sensordaten aus und sendet sie sowohl über die serielle Schnittstelle (USB) wie über MCC (Multicast) an die angegebene Multicvast-Adresse. Dort können dann andere Programme daraus horchen. In einem weiteren Schritt werde ich eine kleine Arduino-ISOagriNET-Bibliotek entwickeln, so daß die Daten ISOagriNET kompatibel angeboten werden.

#include // needed for Arduino versions later than 0018

#include

#include // UDP library from: [email protected] 12/30/2008

byte mac[] = {

0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED

};

IPAddress ip(192, 168, 1, 177);

IPAddress mip(239, 100, 100, 100);

unsigned int localPort = 9999; // local port to listen on

char packetBuffer[50]; //buffer to hold incoming packet,

char hiBuffer[] = "0:Client ready"; // a string to send back

String inputString = ""; // a string to hold incoming data

boolean stringComplete = false;

int c = 0;

EthernetUDP Udp;

int DHpin = 5;

byte dat [5];

void setup() {

// start the Ethernet and UDP:

Ethernet.begin(mac, ip);

Udp.beginMulti(mip, localPort);

Serial.begin(9600);

pinMode (DHpin, OUTPUT);

}

void loop() {

// if there's data available, read a packet

start_test ();

Serial.print ("Current humdity =");

Serial.print (dat [0], DEC); // display the humidity-bit integer;

Serial.print ('.');

Serial.print (dat [1], DEC); // display the humidity decimal places;

Serial.println ('%');

Serial.print ("Current temperature =");

Serial.print (dat [2], DEC); // display the temperature of integer bits;

Serial.print ('.');

Serial.print (dat [3], DEC); // display the temperature of decimal places;

Serial.println ('C');

delay (1000);

String tmpstr ="Aktuelle Luftfeuchtigkeit =" + String(dat[0], DEC)+"."+ String(dat[1], DEC)+"%";

sendUDP(tmpstr+"\n");

tmpstr ="Aktuelle Temperatur =" + String(dat[2], DEC)+"."+ String(dat[3], DEC)+" C";

sendUDP(tmpstr+"\n");

tmpstr="";

}

byte read_data () {

byte data;

for (int i = 0; i <8; i ++) {

if (digitalRead (DHpin) == LOW) {

  while (digitalRead (DHpin) == LOW); // wait for 50us

  delayMicroseconds (30); // determine the duration of the high level to determine the data is '0 'or '1'

  if (digitalRead (DHpin) == HIGH)

    data |= (1 <<(7-i)); // high front and low in the post

  while (digitalRead (DHpin) == HIGH); // data '1 ', wait for the next one receiver

 }

}

return data;

}

void start_test () {

digitalWrite (DHpin, LOW); // bus down, send start signal>

delay (30); // delay greater than 18ms, so DHT11 start signal can be detected

digitalWrite (DHpin, HIGH);

delayMicroseconds (40); // Wait for DHT11 response

pinMode (DHpin, INPUT);

while (digitalRead (DHpin) == HIGH);

delayMicroseconds (80); // DHT11 response, pulled the bus 80us

if (digitalRead (DHpin) == LOW);

delayMicroseconds (80); // DHT11 80us after the bus pulled to start sending data

for (int i = 0; i <4; i ++) // receive temperature and humidity data, the parity bit is not considered

dat[i] = read_data ();

pinMode (DHpin, OUTPUT);

digitalWrite (DHpin, HIGH); // send data once after releasing the bus, wait for the host to open the next Start > signal

}

void sendUDP(String text)

{

Udp.beginPacket(mip, Udp.remotePort());

Udp.print(text);

Udp.endPacket();

delay(30);

}

Mit Udp.beginMulti(mip, localPort); wird die lokale IP mit der MultiCast-IP (mip) verbunden. Über die Methode start_test werden die Daten des Sensors ausgelesen und über sendUdp werden die Daten zur Multicast-IP geschickt. Dort horcht dann ein Groovyprogramm.

Der Listener - ein Groovy-Programm

Der Listener horcht auf die Multicast-Adress und liest die Daten des Arduino aus. Dazu habe ich einjen Listener, den ich einm,al für meine TINI und SNAP-embedded Devices ADIS/ADED konform entwickelt habe, entsprechend verschlankt.

package de.struxt.ian.mcc.listen

class MCCSmallListener {

   byte[] buffer = new byte[1024];

   DatagramPacket datagram = new DatagramPacket(buffer,buffer.length);



   MulticastSocket socket;

   int port = 9999;



   // Constructor

   public MCCSmallListener() {

           try {

                   // Socket auf Port 6789 starten

                   socket = new MulticastSocket(port);

                   System.out.println("*** MulticastMCCListener: Socket created");



                   // Anmelden bei einer Multicast-Gruppe

                   InetAddress group = InetAddress.getByName("239.100.100.100");

                   socket.joinGroup(group);

           }catch (IOException ex) { }

   }

   public String listen(){

           try{

                   socket.receive(datagram);

                   //  prototyping noch mangelhaft

                   String msg = new String(datagram.getData());



                   return msg;

           }       catch (IOException ex) {ex.printStackTrace(); }

           return "ERROR";

   }



   static void main(args) {



           MCCSmallListener ls = new MCCSmallListener();

           while (true){

                   def msg = ls.listen();

                   println(msg);



                  }



   } 

}

Der Sensor

Der verwendete Sensor stammt aus dem 40 in 1 Sensorkit 4duino(Temp and humidity). Die Schaltung ist sehr einfach, da hier weder Widerstände noch sonst was benötigt werden. Die Anschlüsse sind nach dem SVG-Prinzip herausgeführt, so daß die Steuerung mit dem digitalen Eingang 5, die Spannung aus dem V-Volt-Pin und Ground mit Ground verbunden wird.

Info

Diese Seite wurde dynamisch aus Groovy-DSLs generiert.


User: