• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino+W5100+MQTT+HA DS18B20 osobne piny
#1
Witam.
Panowie/Panie.
Potrzebuję pomocy, jak w prosty sposób zmienić kod aby do kolejnych pinów 23, 24, 25.. dołączyć po dwa następne czujniki DS18B20, itd. i ich dane wysłać do HA poprzez MQTT (Ethernet W5100).
Jak na razie mam podstawowy kod, który czyta obecnie dwa czujniki z jednego pinu i wysyła dane po MQTT.
Nie mogę poradzić sobie jak dodać następne reguły.

Próbowałem podwoić wpisy i ponazywać je inaczej, lecz finał był taki, że zamiast dwóch wyników było ich aż 16. 

Kod na którym bazuje poniżej który działa nawet na kilka czujników w jednym pinie. 

Co gdzie zmienić, poproszę o poradę. 

Kod:
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const byte ONEWIRE_PIN = 22;
const byte NUM_SENSORS = 2;
unsigned long teraz,ostatnio;
byte mac[]    = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 8, 180 };
byte ip[]     = { 192, 168, 8, 112 };

const byte sensorsAddress[NUM_SENSORS][8] = {
  0x28, 0x60, 0xE6, 0x96, 0xF0, 0x1, 0x3C, 0x27,
  0x28, 0x23, 0x43, 0x96, 0xF0, 0x1, 0x3C, 0xEA,
  };

void callback(char* topic, byte* payload, unsigned int length) {
 
}

OneWire oneWire (ONEWIRE_PIN);
DallasTemperature sensors(&oneWire);

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void setup() {
 
  Ethernet.begin(mac, ip);
sensors.requestTemperatures();
  delay(5000);
sensors.setWaitForConversion(0);
  if (client.connect("arduinoClient")) {
    client.publish("out", "OK");
  }
}

void loop() {
teraz = millis();
 
if((uint32_t) (teraz-ostatnio)>5000)
{
  ostatnio=teraz;
  for (int i = 0; i < NUM_SENSORS; i++)

  {

    char buffer[50] = { 0 };
    char num_buffer[50] = { 0 };
    char payload[50] = { 0 };

    float temperature = sensors.getTempC(sensorsAddress[i]);

    dtostrf(temperature, 5, 2, buffer);
    sprintf(num_buffer, "%d", i);

    strcat(payload, "{ id");
    strcat(payload, num_buffer);
    strcat(payload, " : ");
    strcat(payload, buffer);
    strcat(payload, " }");
    client.publish("out", payload);
}
sensors.requestTemperatures();
  }

  client.loop();

}
 
Odpowiedź
#2
Jest taki przykład w Twojej bibliotece:
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire ds18x20[] = { 3, 7 };
const int oneWireCount = sizeof(ds18x20)/sizeof(OneWire);
DallasTemperature sensor[oneWireCount];

void setup(void) {
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature Multiple Bus Control Library Simple Demo");
  Serial.print("============Ready with ");
  Serial.print(oneWireCount);
  Serial.println(" Sensors================");
 
  // Start up the library on all defined bus-wires
  DeviceAddress deviceAddress;
  for (int i = 0; i < oneWireCount; i++) {;
    sensor[i].setOneWire(&ds18x20[i]);
    sensor[i].begin();
    if (sensor[i].getAddress(deviceAddress, 0)) sensor[i].setResolution(deviceAddress, 12);
  }
}

void loop(void) {
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  for (int i = 0; i < oneWireCount; i++) {
    sensor[i].requestTemperatures();
  }
  Serial.println("DONE");
 
  delay(1000);
  for (int i = 0; i < oneWireCount; i++) {
    float temperature = sensor[i].getTempCByIndex(0);
    Serial.print("Temperature for the sensor ");
    Serial.print(i);
    Serial.print(" is ");
    Serial.println(temperature);
  }
  Serial.println();
}
Sposób czytanie jest pokazany inny, ale przez analogie wszystko do pierwszego pinu czytasz zaczynając sensor[0]. a do kolejnego sensor[1]. odpowiednio zlecając pomiar, odczyt przez numer seryjny czy kolejność wg indeksu. 
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości