MySensors weather station
-
You could power the pro mini directly to vcc using just one lithium cell and remove the voltage regulator and led to save power.
@gohan Right now the only Pro Minis that I have left in my parts bin are 5 volt ones. Besides, I already have the newbie board fitted with the 3.3v regulator and power caps. Another compelling reason for using a 5v mini is that it is 16MHz instead of 8MHz for the 3.3v ones. I think that I am going to want the extra speed for the number of sensors I have connected to a single pro mini and the data that I need to collect. I need to use interrupts for the pulse counting of the anemometer, so the faster I can do those things, the better off I'll be.
-
@gohan Right now the only Pro Minis that I have left in my parts bin are 5 volt ones. Besides, I already have the newbie board fitted with the 3.3v regulator and power caps. Another compelling reason for using a 5v mini is that it is 16MHz instead of 8MHz for the 3.3v ones. I think that I am going to want the extra speed for the number of sensors I have connected to a single pro mini and the data that I need to collect. I need to use interrupts for the pulse counting of the anemometer, so the faster I can do those things, the better off I'll be.
@dbemowsk - are your goal to sleep this sensor or whats your thoughts running it with battery? It might be a hard nut to crack 5v 16mhz and batteries?
Love your thread btw! Keep up the good work :)
-
@dbemowsk - are your goal to sleep this sensor or whats your thoughts running it with battery? It might be a hard nut to crack 5v 16mhz and batteries?
Love your thread btw! Keep up the good work :)
@sundberg84 I don't plan to sleep the sensor at all. Putting the sensor to sleep would cause problems with the anemometer and the interrupt I need to use for that. The main reason for needing it to run on battery is that I plan to mount this up in the air on the top edge of my house. This is why I want to also put a solar panel on it. During the day the solar panel can run the sensor and charge the battery, and at night the battery can take over.
-
Are you sure you don't want to sleep sensor? If it is a matter of interrupts for anemometer, you could use a dinamic sleep time, like if you don't have any wind motion within 2 seconds put the node to sleep and wake it up on pin change
-
Not really, maybe just put the sleep in an IF statement and check if the time from last impulse from the anemometer is over than 2 sec then sleep, otherwise it just continues loop
@gohan So am I correct in assuming that an interrupt will wake a sleep timer? As long as I can catch the pulses from the anemometer, I don't see a reason I couldn't use a sleep timer. Just thinking about it, I may also want to use an interrupt for the rain gauge sensor for similar reasons. Not sure about the wind direction sensor.
-
@gohan So am I correct in assuming that an interrupt will wake a sleep timer? As long as I can catch the pulses from the anemometer, I don't see a reason I couldn't use a sleep timer. Just thinking about it, I may also want to use an interrupt for the rain gauge sensor for similar reasons. Not sure about the wind direction sensor.
-
So now that I have the wind direction sensor working, I need to try to migrate the code into my weather_station sketch. One option that I am working on implementing is a calibration button for North. So after I get things set up and mounted, I will use a compass to point the wind vane towards North. I will then press the calibration button which will save the current direction position to EEPROM if it is different than the one stored. The following code will then be used to get the true direction that the wind vane is pointing.
value = 360 * myAS5047.sensor_read() / 16383; //Read the value from the direction sensor as a value from 0 to 360 north_offset = EEPROM.read(address); //Read the offset value from EEPROM dir = ((value - north_offset) < 0) ? 360 - abs (value - north_offset) : value - north_offset; //Get the true direction /* insert code to read the button and if pressed, check the current value stored in EEPROM against the value read from the sensor and write the new value if it is different. If the sensor value matches the current stored value, then ignore the write to save on EEPROM writes. */So with this idea, I will need to know a few things. First, I am assuming that MySensors does EEPROM writes and reads. Is there a particular addreess pointer variable that I should use when writing my value to EEPROM? I will also need to know how I can get the address pointer to that data the same each time the arduino is reset, especially if MySensors does writes and reads.
As always, any input is appreciated.
-
So now that I have the wind direction sensor working, I need to try to migrate the code into my weather_station sketch. One option that I am working on implementing is a calibration button for North. So after I get things set up and mounted, I will use a compass to point the wind vane towards North. I will then press the calibration button which will save the current direction position to EEPROM if it is different than the one stored. The following code will then be used to get the true direction that the wind vane is pointing.
value = 360 * myAS5047.sensor_read() / 16383; //Read the value from the direction sensor as a value from 0 to 360 north_offset = EEPROM.read(address); //Read the offset value from EEPROM dir = ((value - north_offset) < 0) ? 360 - abs (value - north_offset) : value - north_offset; //Get the true direction /* insert code to read the button and if pressed, check the current value stored in EEPROM against the value read from the sensor and write the new value if it is different. If the sensor value matches the current stored value, then ignore the write to save on EEPROM writes. */So with this idea, I will need to know a few things. First, I am assuming that MySensors does EEPROM writes and reads. Is there a particular addreess pointer variable that I should use when writing my value to EEPROM? I will also need to know how I can get the address pointer to that data the same each time the arduino is reset, especially if MySensors does writes and reads.
As always, any input is appreciated.
Hello, @dbemowsk
You should use the built in method from the MySensors library to do that :
https://www.mysensors.org/download/sensor_api_20#saving-state -
Hello, @dbemowsk
You should use the built in method from the MySensors library to do that :
https://www.mysensors.org/download/sensor_api_20#saving-state -
Hello, @dbemowsk
You should use the built in method from the MySensors library to do that :
https://www.mysensors.org/download/sensor_api_20#saving-state@Nca78 So my values are from 0 to 360, looking at the link you posted, the value that you save to an address is uint8_t which is equivalent to a byte (0 to 255). Is there a way to store a word value (uint16_t), or do I need to break the value into two bytes and store those into two positions?
-
@Nca78 So my values are from 0 to 360, looking at the link you posted, the value that you save to an address is uint8_t which is equivalent to a byte (0 to 255). Is there a way to store a word value (uint16_t), or do I need to break the value into two bytes and store those into two positions?
@dbemowsk said in MySensors weather station:
@Nca78 So my values are from 0 to 360, looking at the link you posted, the value that you save to an address is uint8_t which is equivalent to a byte (0 to 255). Is there a way to store a word value (uint16_t), or do I need to break the value into two bytes and store those into two positions?
Yes it can only store bytes, but it's not a big deal to make a method to read/write values on 2 bytes.
Else you can just keep a precision of 2° and divide by 2 to get a 0=>180 value ;) -
Precision of 2° I believe it's enough as many weather stations provide just the 8 general directions


