I've actually already tried that, worked with no problem. Maybe i've missed something or something similair, lets see what happens after a good nights sleep. Thank you for you help so far.
Øyvind Lauritzen
@Øyvind Lauritzen
Best posts made by Øyvind Lauritzen
-
RE: Combining BinarySwitch with PressureSensor
Latest posts made by Øyvind Lauritzen
-
RE: Combining BinarySwitch with PressureSensor
I've actually already tried that, worked with no problem. Maybe i've missed something or something similair, lets see what happens after a good nights sleep. Thank you for you help so far.
-
RE: Combining BinarySwitch with PressureSensor
Yes it is clear that it is working partly because it will eventually update the state of the switch, but it will not do this as often as temp/pressure. Temp/pressure is updated every time switch is triggered, but still the state of the switch is not reported every time , only when 60+ seconds have passed.
This is the startup.
send: 2-2-0-0 s=255,c=3,t=15,pt=2,l=2,sg=0,st=ok:0
send: 2-2-0-0 s=255,c=0,t=17,pt=0,l=5,sg=0,st=ok:1.5.4
send: 2-2-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
read: 0-0-2 s=255,c=3,t=6,pt=0,l=1,sg=0:M
sensor started, id=2, parent=0, distance=1
send: 2-2-0-0 s=3,c=0,t=0,pt=0,l=0,sg=0,st=ok:
send: 2-2-0-0 s=255,c=3,t=11,pt=0,l=15,sg=0,st=ok:Pressure Sensor
send: 2-2-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.1
send: 2-2-0-0 s=0,c=0,t=8,pt=0,l=0,sg=0,st=ok:
send: 2-2-0-0 s=1,c=0,t=6,pt=0,l=0,sg=0,st=ok:
send: 2-2-0-0 s=3,c=1,t=16,pt=2,l=2,sg=0,st=ok:0
Temperature = 25.30 *C
Pressure = 1019.42 hPa
Forecast = unknown
send: 2-2-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,st=ok:25.3
send: 2-2-0-0 s=0,c=1,t=4,pt=7,l=5,sg=0,st=ok:1019
send: 2-2-0-0 s=0,c=1,t=5,pt=0,l=7,sg=0,st=ok:unknown -
RE: Combining BinarySwitch with PressureSensor
From what the serial monitor is telling me is that it is updating at least temp and pressure, I don't know where I see the actual switch? Domoticz only update temp and pressure every time the switch is triggered, it is not telling me the new state of the switch until at least 60sec from what it seems.
send: 2-2-0-0 s=0,c=1,t=4,pt=7,l=5,sg=0,st=ok:1019
Temperature = 25.40 *C
Pressure = 1019.35 hPa
Forecast = stable
send: 2-2-0-0 s=0,c=1,t=4,pt=7,l=5,sg=0,st=ok:1019
Temperature = 25.40 *C
Pressure = 1019.32 hPa
Forecast = stable
send: 2-2-0-0 s=0,c=1,t=4,pt=7,l=5,sg=0,st=ok:1019
Temperature = 25.40 *C
Pressure = 1019.37 hPa
Forecast = stable
send: 2-2-0-0 s=0,c=1,t=4,pt=7,l=5,sg=0,st=ok:1019
Temperature = 25.40 *C
Pressure = 1019.38 hPa
Forecast = stable
send: 2-2-0-0 s=0,c=1,t=4,pt=7,l=5,sg=0,st=ok:1019 -
RE: Combining BinarySwitch with PressureSensor
@mfalkvidd Yes as far as I understand that should be it, unless the forecast algorithm is not for some reason depending on it updating exactly every 60 seconds?
I am actually gonna be using the switch info to know the state of my garage door, making sure it's not by mistake left open when it shouldn't.
-
RE: Combining BinarySwitch with PressureSensor
I've change the line
gw.sleep(SLEEP_TIME);
to
gw.sleep(digitalPinToInterrupt(BUTTON_PIN), CHANGE, SLEEP_TIME);
This was what you meant? It doesn't seem to do more than wake up as you said every 60 seconds to transfer the status of all sensors - pressure, switch and temp.
Did I misunderstand what you meant maybe?
TIA
-
RE: Combining BinarySwitch with PressureSensor
Does this mean the temp and pressure data will only be sent every time the switch is changed? If this is the case and since this is not gonna be run from battery, is there a easy way to let pressure and temp be updated every 60 seconds, and let it check for the state of the switch reasonable often?
According to Henrik Ekblad the forecast algorithm needs this info at that rate.
TIA
-
Combining BinarySwitch with PressureSensor
I am having troubles combining these two sketches, for some reason whatever how I do it, pressure and temperature is always working, binary switch is not(actually window magnet)
This is what I end up with... Anyone who can show me where it goes sour?
TIA
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * * Simple binary switch example * Connect button or door/window reed switch between * digitial I/O pin 3 (BUTTON_PIN below) and GND. * http://www.mysensors.org/build/binary */ #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #include <Wire.h> #include <Adafruit_BMP085.h> #define CHILD_ID 3 #define BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch #define BARO_CHILD 0 #define TEMP_CHILD 1 const float ALTITUDE = 93; // <-- adapt this value to your own location's altitude. // Sleep time between reads (in seconds). Do not change this value as the forecast algorithm needs a sample every minute. const unsigned long SLEEP_TIME = 60000; const char *weather[] = { "stable", "sunny", "cloudy", "unstable", "thunderstorm", "unknown" }; enum FORECAST { STABLE = 0, // "Stable Weather Pattern" SUNNY = 1, // "Slowly rising Good Weather", "Clear/Sunny " CLOUDY = 2, // "Slowly falling L-Pressure ", "Cloudy/Rain " UNSTABLE = 3, // "Quickly rising H-Press", "Not Stable" THUNDERSTORM = 4, // "Quickly falling L-Press", "Thunderstorm" UNKNOWN = 5 // "Unknown (More Time needed) }; Adafruit_BMP085 bmp = Adafruit_BMP085(); // Digital Pressure Sensor MySensor gw; Bounce debouncer = Bounce(); int oldValue=-1; // Change to V_LIGHT if you use S_LIGHT in presentation below MyMessage msg(CHILD_ID,V_TRIPPED); float lastPressure = -1; float lastTemp = -1; int lastForecast = -1; const int LAST_SAMPLES_COUNT = 5; float lastPressureSamples[LAST_SAMPLES_COUNT]; // this CONVERSION_FACTOR is used to convert from Pa to kPa in forecast algorithm // get kPa/h be dividing hPa by 10 #define CONVERSION_FACTOR (1.0/10.0) int minuteCount = 0; bool firstRound = true; // average value is used in forecast algorithm. float pressureAvg; // average after 2 hours is used as reference value for the next iteration. float pressureAvg2; float dP_dt; boolean metric; MyMessage tempMsg(TEMP_CHILD, V_TEMP); MyMessage pressureMsg(BARO_CHILD, V_PRESSURE); MyMessage forecastMsg(BARO_CHILD, V_FORECAST); void setup() { gw.begin(); // 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); // Register binary input sensor to gw (they will be created as child devices) // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. // If S_LIGHT is used, remember to update variable type you send in. See "msg" above. gw.present(CHILD_ID, S_DOOR); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Pressure Sensor", "1.1"); if (!bmp.begin()) { Serial.println("Could not find a valid BMP085 sensor, check wiring!"); while (1) {} } // Register sensors to gw (they will be created as child devices) gw.present(BARO_CHILD, S_BARO); gw.present(TEMP_CHILD, S_TEMP); metric = gw.getConfig().isMetric; } // Check if digital input has changed and send in new value void loop() { debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue) { // Send in the new value gw.send(msg.set(value==HIGH ? 1 : 0)); oldValue = value; } float pressure = bmp.readSealevelPressure(ALTITUDE) / 100.0; float temperature = bmp.readTemperature(); if (!metric) { // Convert to fahrenheit temperature = temperature * 9.0 / 5.0 + 32.0; } int forecast = sample(pressure); Serial.print("Temperature = "); Serial.print(temperature); Serial.println(metric ? " *C" : " *F"); Serial.print("Pressure = "); Serial.print(pressure); Serial.println(" hPa"); Serial.print("Forecast = "); Serial.println(weather[forecast]); if (temperature != lastTemp) { gw.send(tempMsg.set(temperature, 1)); lastTemp = temperature; } if (pressure != lastPressure) { gw.send(pressureMsg.set(pressure, 0)); lastPressure = pressure; } if (forecast != lastForecast) { gw.send(forecastMsg.set(weather[forecast])); lastForecast = forecast; } gw.sleep(SLEEP_TIME); } float getLastPressureSamplesAverage() { float lastPressureSamplesAverage = 0; for (int i = 0; i < LAST_SAMPLES_COUNT; i++) { lastPressureSamplesAverage += lastPressureSamples[i]; } lastPressureSamplesAverage /= LAST_SAMPLES_COUNT; return lastPressureSamplesAverage; } // Algorithm found here // http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf // Pressure in hPa --> forecast done by calculating kPa/h int sample(float pressure) { // Calculate the average of the last n minutes. int index = minuteCount % LAST_SAMPLES_COUNT; lastPressureSamples[index] = pressure; minuteCount++; if (minuteCount > 185) { minuteCount = 6; } if (minuteCount == 5) { pressureAvg = getLastPressureSamplesAverage(); } else if (minuteCount == 35) { float lastPressureAvg = getLastPressureSamplesAverage(); float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR; if (firstRound) // first time initial 3 hour { dP_dt = change * 2; // note this is for t = 0.5hour } else { dP_dt = change / 1.5; // divide by 1.5 as this is the difference in time from 0 value. } } else if (minuteCount == 65) { float lastPressureAvg = getLastPressureSamplesAverage(); float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR; if (firstRound) //first time initial 3 hour { dP_dt = change; //note this is for t = 1 hour } else { dP_dt = change / 2; //divide by 2 as this is the difference in time from 0 value } } else if (minuteCount == 95) { float lastPressureAvg = getLastPressureSamplesAverage(); float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR; if (firstRound) // first time initial 3 hour { dP_dt = change / 1.5; // note this is for t = 1.5 hour } else { dP_dt = change / 2.5; // divide by 2.5 as this is the difference in time from 0 value } } else if (minuteCount == 125) { float lastPressureAvg = getLastPressureSamplesAverage(); pressureAvg2 = lastPressureAvg; // store for later use. float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR; if (firstRound) // first time initial 3 hour { dP_dt = change / 2; // note this is for t = 2 hour } else { dP_dt = change / 3; // divide by 3 as this is the difference in time from 0 value } } else if (minuteCount == 155) { float lastPressureAvg = getLastPressureSamplesAverage(); float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR; if (firstRound) // first time initial 3 hour { dP_dt = change / 2.5; // note this is for t = 2.5 hour } else { dP_dt = change / 3.5; // divide by 3.5 as this is the difference in time from 0 value } } else if (minuteCount == 185) { float lastPressureAvg = getLastPressureSamplesAverage(); float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR; if (firstRound) // first time initial 3 hour { dP_dt = change / 3; // note this is for t = 3 hour } else { dP_dt = change / 4; // divide by 4 as this is the difference in time from 0 value } pressureAvg = pressureAvg2; // Equating the pressure at 0 to the pressure at 2 hour after 3 hours have past. firstRound = false; // flag to let you know that this is on the past 3 hour mark. Initialized to 0 outside main loop. } int forecast = UNKNOWN; if (minuteCount < 35 && firstRound) //if time is less than 35 min on the first 3 hour interval. { forecast = UNKNOWN; } else if (dP_dt < (-0.25)) { forecast = THUNDERSTORM; } else if (dP_dt > 0.25) { forecast = UNSTABLE; } else if ((dP_dt > (-0.25)) && (dP_dt < (-0.05))) { forecast = CLOUDY; } else if ((dP_dt > 0.05) && (dP_dt < 0.25)) { forecast = SUNNY; } else if ((dP_dt >(-0.05)) && (dP_dt < 0.05)) { forecast = STABLE; } else { forecast = UNKNOWN; } // uncomment when debugging //Serial.print(F("Forecast at minute ")); //Serial.print(minuteCount); //Serial.print(F(" dP/dt = ")); //Serial.print(dP_dt); //Serial.print(F("kPa/h --> ")); //Serial.println(weather[forecast]); return forecast; }
-
RE: two arduino, two avrdude error ..
@Dominic-Bonneau Sounds like you have the same problem like I had/have.
My Arduino's are very sensitive to get them in programming mode, someone else somewhere mentioned that they had to do a few thing and this actually works for me, so maybe worth for you to give it a shot?
Anyway here is the procedure:
Set com port to a speed of 115000bps(in windows device manager, under com ports or something similair), then when Arduino IDE is compiling and closing in on starting to flash you need to hold reset button on Arduino down and let go just when it starts to program.
This seems to be working for me. Of course you must make sure you have chosen the correct board with voltage and com port in Arduino IDE.
Hope this helps.
-
DS18B20 temp sensor overheat
So I've been trying to get the standard dallas temp sensor to work like it is mentioned here https://www.mysensors.org/build/temp but for some reasen and 2 times in a row I've probably overheated and killed the Dallas sensor, hopefully the Arduino Pro Mini board survived.
I connect pull-up resistor between right leg and middle leg, VCC 5V from one of the VCC points on my Arduino to the right leg of DS18B20 and then GND from Arduino to left leg on DS18B20, and middle leg to "D3" on Arduino.I am using a 5V Arduino clone, I've connected the 5v supply (just the +5v and GND from my FTDI based USB to TTL level serial programmer which is also set to 5v with jumper)
I can't understand why the dallas sensor overheats, it gets so warm it melted the plastic parts of the connectors on the dupont cables I used to connect the sensor to.
Do anyone have a clue to what is going on?
[Edit] I've noticed that a few people mention that if you connect it wrong like VCC on GND pin and GND to VCC pin then it will get VERY hot, I will try to do this, even though I always connected it with flat side facing me then left, middle and right pin, like it is described in the guide. Who knows maybe the chip is a fake one and they messed up the pins.