Asystent AI
MySensors + Mega 25...
 
Powiadomienia
Wyczyść wszystko

MySensors + Mega 2560 + DS18B20 + Relay

1 Wpisów
1 Użytkownicy
0 Reactions
1,939 Wyświetleń
(@pawelj5)
Wpisów: 19
Praktykant
Autor tematu
Translate
English
Spanish
French
German
Italian
Portuguese
Russian
Chinese
Japanese
Korean
Arabic
Hindi
Dutch
Polish
Turkish
Vietnamese
Thai
Swedish
Danish
Finnish
Norwegian
Czech
Hungarian
Romanian
Greek
Hebrew
Indonesian
Malay
Ukrainian
Bulgarian
Croatian
Slovak
Slovenian
Serbian
Lithuanian
Latvian
Estonian
 
[#2860]

Pracą kotłowni zarządza Arduino Mega 2560. Próbuję zintegrować to z Home Assistantem przy pomocy MySensors. Chciałbym mieć podgląd temperatur z czujników podłączonych do Arduino, oraz sterować przekaźnikami, które chciałbym dołożyć. Korzystając z instrukcji na stronie Ethernet Gateway połączyłem systemy przy pomocy karty sieciowej W5100. Zmodyfikowałem sketch Temperature Sensor i udało mi się odczytac parametry czujników w HA. Po zaadaptowaniu sketchu Example with button uzyskałem możliwość sterowania z poziomu HA przekaźnikiem podpiętym do Arduino. Oba sketche indywidualnie działają bez problemów. Gdy każdy z nich indywidualnie zintegruje ze sketchem sterującym kotłownią również wszystko działa. Nie mogę sobie jednak poradzić z połączeniem odczytu temperatur i sterowania przekaźnikiem w jednym programie. Próbowałem różnych modyfikacji, jednak ogarniam to na poziomie kopiuj-wklej i albo program się nie kompiluje, albo czujniki i przekaźniki nie są widoczne w HA. 

Sketch wygląda tak:

#define MY_DEBUG // Enable debug prints to serial monitor
#define MY_GATEWAY_W5100 // Enable gateway ethernet module type
#define MY_IP_ADDRESS 192,168,68,130 // Enable MY_IP_ADDRESS here if you want a static ip address (no DHCP)
#define MY_PORT 5003 // The port to keep open on node server mode / or port to contact in client mode
#define MY_MAC_ADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
#define MY_INCLUSION_MODE_FEATURE // Enable inclusion mode
#define MY_INCLUSION_MODE_DURATION 60 // Set inclusion mode duration (in seconds)
#define MY_DEFAULT_LED_BLINK_PERIOD 300 // Set blinking period
#define MY_REPEATER_FEATURE

#if defined(MY_USE_UDP)
#include <EthernetUdp.h>
#endif
#include <Ethernet.h>
#include <MySensors.h>
#include <Bounce2.h>
#include <DallasTemperature.h>
#include <OneWire.h>

#define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
#define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
#define CHILD_ID 1   // Id of the sensor child
#define RELAY_ON 0
#define RELAY_OFF 1
#define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
#define ONE_WIRE_BUS A5 // Pin where dallase sensor is connected 
#define MAX_ATTACHED_DS18B20 16
#define LED1pin 13 // LED1 do pinu 13

Bounce debouncer = Bounce(); 
int oldValue=0;
bool state;

MyMessage msg(CHILD_ID,V_LIGHT);
MyMessage msg(0,V_TEMP); // Initialize temperature message

unsigned long SLEEP_TIME = 3000; // Sleep time between reads (in milliseconds)

OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 

DeviceAddress Koc = { 0x28, 0x9E, 0xB1, 0xB5, 0xD, 0x0, 0x0, 0x3E };
DeviceAddress Kocp = { 0x28, 0xFF, 0x25, 0x96, 0x28, 0x20, 0x1B, 0x47 };
DeviceAddress Buf1 = { 0x28, 0xFF, 0xF7, 0x95, 0x28, 0x20, 0x1B, 0x12 };

float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
bool receivedConfig = false;
bool metric = true;


void before()

{
  sensors.begin(); // Startup up the OneWire library
}

void setup()  
{  
  // Setup the button
  pinMode(BUTTON_PIN,INPUT);
  // Activate internal pull-up
  digitalWrite(BUTTON_PIN,HIGH);
  
  // After setting up the button, setup debouncer
  debouncer.attach(BUTTON_PIN);
  debouncer.interval(5);

  // Make sure relays are off when starting up
  digitalWrite(RELAY_PIN, RELAY_OFF);
  // Then set relay pins in output mode
  pinMode(RELAY_PIN, OUTPUT);   
      
  // Set relay to last known state (using eeprom storage) 
  state = loadState(CHILD_ID);
  digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
}

void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Relay & Button", "1.0");
  numSensors = sensors.getDeviceCount(); // Fetch the number of attached temperature sensors 
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) // Present all sensors to controller
  {   
     present(i, S_TEMP);
  }

  // Register all sensors to gw (they will be created as child devices)
  present(CHILD_ID, S_LIGHT);
}

/*
*  Example on how to asynchronously check for new messages from gw
*/
void loop() 
{
  sensors.requestTemperatures(); // Fetch temperatures from Dallas sensors
  debouncer.update();
  // Get the update value
  int value = debouncer.read();
  if (value != oldValue && value==0) {
      send(msg.set(state?false:true), true); // Send new state and request ack back
  }
  oldValue = value;
    int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());  // query conversion time and sleep until conversion completed
  sleep(conversionTime); // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) // Read temperatures and send them to controller 
  {
    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Fetch and round temperature to one decimal
    // Only send data if temperature has changed and no error
    #if COMPARE_TEMP == 1
    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) 
    {
    #else
    if (temperature != -127.00 && temperature != 85.00) 
    {
    #endif
      send(msg.setSensor(i).set(temperature,1)); // Send in the new temperature
      lastTemperature[i]=temperature;  // Save new temperatures for next compare
    }
  }
  
  sleep(SLEEP_TIME);
  }

 
void receive(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.isAck()) {
     Serial.println("This is an ack from gateway");
  }

  if (message.type == V_LIGHT) {
     // Change relay state
     state = message.getBool();
     digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
     // Store state in eeprom
     saveState(CHILD_ID, state);
    
     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
   } 
}

 

Przy próbie kompilacji pojawiają się takie błędy:

 

 

Arduino:1.8.19 (Windows 10), Płytka:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"


MySensors_przekaznik_czujnik:36:14: error: redefinition of 'MyMessage msg'

C:\Users\Paweł\Desktop\MySensors\MySensors_przekaznik_czujnik\MySensors_przekaznik_czujnik.ino:35:11: note: 'MyMessage msg' previously declared here

exit status 1

redefinition of 'MyMessage msg'


 

Rozumiem, ze parametr "MyMessage msg" może być użyty tylko raz, jednak sketch dla czujników temperatury ma inne wartości i dla przekaźników inne. Jak to poprawnie połączyć?

 


 
Dodane : 05/04/2022 12:10 pm
Udostępnij: