here some pics
Best posts made by michlb1982
-
RE: Magnetic field detection
Hello
thanks for the input...
well i did it...
i was able to build an Wind-direction-MYSENSOR... well i'm sure, its a little bit
awkward and much to complicated but it works quite OK...
the next step is to build a windspeed - sensor.. with the AS5040..here the Arduino nano Code...:
#include <SPI.h> #include <MySensor.h> const int ledPin = 13; //LED connected to digital pin 13 const int clockPin = 5; //output to clock const int CSnPin = 4; //output to chip select const int inputPin = 6; //read AS5040 int inputstream = 0; //one bit read from pin long packeddata = 0; //two bytes concatenated from inputstream long angle = 0; //holds processed angle value long anglemask = 65472; //0x1111111111000000: mask to obtain first 10 digits with position info long statusmask = 63; //0x000000000111111; mask to obtain last 6 digits containing status info long statusbits; //holds status/error information int DECn; //bit holding decreasing magnet field error data int INCn; //bit holding increasing magnet field error data int OCF; //bit holding startup-valid bit int COF; //bit holding cordic DSP processing error data int LIN; //bit holding magnet field displacement error data int debug = 0; //SET THIS TO 0 TO DISABLE PRINTING OF ERROR CODES int shortdelay = 1000; // this is the microseconds of delay in the data clock int longdelay =1000; // this is the milliseconds between readings #define CHILD_ID_DIR 0 //#define INTERRUPT inputPin MySensor gw; MyMessage msgDIR(CHILD_ID_DIR, V_DIRECTION); void setup() { gw.begin(NULL, AUTO, true, AUTO); Serial.begin(250000); pinMode(ledPin, OUTPUT); // visual signal of I/O to chip pinMode(clockPin, OUTPUT); // SCK pinMode(CSnPin, OUTPUT); // CSn -- has to toggle high and low to signal chip to start data transfer pinMode(inputPin, INPUT); // SDA // Send the Sketch Version Information to the Gateway gw.sendSketchInfo("Winddirection", "1.0"); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID_DIR, S_WIND); } void loop() { // CSn needs to cycle from high to low to initiate transfer. Then clock cycles. As it goes high // again, data will appear on sda digitalWrite(CSnPin, HIGH); // CSn high digitalWrite(clockPin, HIGH); // CLK high delay(longdelay);// time between readings digitalWrite(ledPin, HIGH); // signal start of transfer with LED digitalWrite(CSnPin, LOW); // CSn low: start of transfer delayMicroseconds(shortdelay); // delay for chip initialization digitalWrite(clockPin, LOW); // CLK goes low: start clocking delayMicroseconds(shortdelay); // hold low for (int x=0; x <16; x++) // clock signal, 16 transitions, output to clock pin { digitalWrite(clockPin, HIGH); //clock goes high delayMicroseconds(shortdelay); // inputstream =digitalRead(inputPin); // read one bit of data from pin //Serial.print(inputstream, DEC); packeddata = ((packeddata << 1) + inputstream);// left-shift summing variable, add pin value digitalWrite(clockPin, LOW); delayMicroseconds(shortdelay); // end of one clock cycle } // end of entire clock cycle //Serial.println(" "); digitalWrite(ledPin, LOW); // signal end of transmission // lots of diagnostics for verifying bitwise operations //Serial.print("packed:"); //Serial.println(packeddata,DEC); //Serial.print("pack bin: "); //Serial.println(packeddata,BIN); angle = packeddata & anglemask; // mask rightmost 6 digits of packeddata to zero, into angle. //Serial.print("mask: "); //Serial.println(anglemask, BIN); //Serial.print("bin angle:"); //Serial.println(angle, BIN); //Serial.print("angle: "); //Serial.println(angle, DEC); angle = (angle >> 6); // shift 16-digit angle right 6 digits to form 10-digit value //Serial.print("angleshft:"); //Serial.println(angle, BIN); //Serial.print("angledec: "); //Serial.println(angle, DEC); angle = angle * 0.3515; // angle * (360/1024) == actual degrees Serial.print("angle: "); // and, finally, print it. Serial.println(angle, DEC); //Serial.println("--------------------"); //Serial.print("raw: "); // this was the prefix for the bit-by-bit diag output inside the loop. if (debug) { statusbits = packeddata & statusmask; DECn = statusbits & 2; // goes high if magnet moved away from IC INCn = statusbits & 4; // goes high if magnet moved towards IC LIN = statusbits & 8; // goes high for linearity alarm COF = statusbits & 16; // goes high for cordic overflow: data invalid OCF = statusbits & 32; // this is 1 when the chip startup is finished. if (DECn && INCn) { Serial.println("magnet moved out of range"); } else { if (DECn) { Serial.println("magnet moved away from chip"); } if (INCn) { Serial.println("magnet moved towards chip"); } } if (LIN) { Serial.println("linearity alarm: magnet misaligned? Data questionable."); } if (COF) { Serial.println("cordic overflow: magnet misaligned? Data invalid."); } } float V_DIRECTION = angle; gw.send(msgDIR.set(V_DIRECTION, DEC)); packeddata = 0; // reset both variables to zero so they don't just accumulate angle = 0; gw.process(); //gw.sleep(INTERRUPT,CHANGE); gw.sleep(longdelay); }
the code for FHEM:
define MYSENSOR_111 MYSENSORS_DEVICE 111 attr MYSENSOR_111 IODev SerialGate attr MYSENSOR_111 alias Windrichtung attr MYSENSOR_111 group Sensoren attr MYSENSOR_111 mapReading_direction 0 direction attr MYSENSOR_111 mapReading_gust 0 gust attr MYSENSOR_111 mapReading_wind 0 wind attr MYSENSOR_111 mode repeater attr MYSENSOR_111 room 03_Umwelt attr MYSENSOR_111 stateFormat {sprintf("%.0f",ReadingsVal("MYSENSOR_111","direction",0))."°"}
a curcuit will follow in the next days...
greets..
Mike -
RE: DHT12 + 2Relay + 2Button - Combining Problem
@rejoe2
thanks for the link.. i will try... and report if it worked.. -
RE: Mysensort mit DHT12 (i2C)
Well i did it... i've got a working MYSENSOR with DHT12...
here the Code ... its not nice but it works...// Enable debug prints #define MY_DEBUG // Define Node ID #define MY_NODE_ID 128 //#define MY_REPEATER_FEATURE // Enable and select radio type attached #define MY_RADIO_NRF24 #include <SPI.h> #include <MySensors.h> #include <DHT12.h> #include <Wire.h> DHT12 dht12; #define SENSOR_TEMP_OFFSET 0 // Sleep time between sensor updates (in milliseconds) // Must be >1000ms for DHT22 and >2000ms for DHT11 static const uint64_t UPDATE_INTERVAL = 30000; static const uint8_t FORCE_UPDATE_N_READS = 10; #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 float lastTemp; float lastHum; uint8_t nNoUpdatesTemp; uint8_t nNoUpdatesHum; bool metric = true; MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); void presentation() { // Send the sketch version information to the gateway sendSketchInfo("DHT12", "1.1"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID_HUM, S_HUM); present(CHILD_ID_TEMP, S_TEMP); //metric = getControllerConfig().isMetric; } void setup() { Wire.begin(); } void loop() { // Force reading sensor, so it works also after sleep() //dht12.readSensor(true); // Get temperature from DHT library float temperature = dht12.readTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT!"); } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) { // Only send temperature if it changed since the last measurement or if we didn't send an update for n times lastTemp = temperature; // apply the offset before converting to something different than Celsius degrees temperature += SENSOR_TEMP_OFFSET; if (!metric) { temperature = dht12.readTemperature(); } // Reset no updates counter nNoUpdatesTemp = 0; send(msgTemp.set(temperature, 1)); #ifdef MY_DEBUG Serial.print("T: "); Serial.println(temperature); #endif } else { // Increase no update counter if the temperature stayed the same nNoUpdatesTemp++; } // Get humidity from DHT library float humidity = dht12.readHumidity(); if (isnan(humidity)) { Serial.println("Failed reading humidity from DHT"); } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) { // Only send humidity if it changed since the last measurement or if we didn't send an update for n times lastHum = humidity; // Reset no updates counter nNoUpdatesHum = 0; send(msgHum.set(humidity, 1)); #ifdef MY_DEBUG Serial.print("H: "); Serial.println(humidity); #endif } else { // Increase no update counter if the humidity stayed the same nNoUpdatesHum++; } // Sleep for a while to save energy sleep(UPDATE_INTERVAL); //wait(UPDATE_INTERVAL); //for repeaters }
i Used this library: https://github.com/Bobadas/DHT12_library_Arduino/blob/master/README.md
here the datasheet of the dht12: http://www.robototehnika.ru/file/DHT12.pdf
-
RE: Magnetic field detection
well, the promised curcuit...Windrichtung-AS5040-Mysensor.pdf Windrichtung.fzz
-
RE: DHT12 + 2Relay + 2Button - Combining Problem
@mfalkvidd you are so right!!! the "wait" is the problem... i changed the script.. i use a if to check if the update-interval is over and then i go through the dht loop....
now the bounce are also working..!here my code...
#define MY_DEBUG #define MY_RADIO_NRF24 //#define MY_REPEATER_FEATURE // Define Node ID #define MY_NODE_ID 101 #define RELAY_ON 1 #define RELAY_OFF 0 #define SSR_A_ID 1 // Id of the sensor child #define SSR_B_ID 2 // Id of the sensor child #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 0//1 #define SENSOR_TEMP_OFFSET 0 #include <SPI.h> #include <MySensors.h> #include <Bounce2.h> #include <DHT12.h> #include <Wire.h> const int buttonPinA = 7; const int buttonPinB = 8; const int relayPinA = 6; const int relayPinB = 5; int oldValueA = 0; int oldValueB = 0; unsigned long startMillis; unsigned long currentMillis; bool stateA = false; bool stateB = false; float lastTemp; float lastHum; uint8_t nNoUpdatesTemp; uint8_t nNoUpdatesHum; bool metric = true; static const uint8_t FORCE_UPDATE_N_READS = 10;//10 static const uint64_t UPDATE_INTERVAL = 30000;//30000 Bounce debouncerA = Bounce(); Bounce debouncerB = Bounce(); MyMessage msgA(SSR_A_ID, V_STATUS); MyMessage msgB(SSR_B_ID, V_STATUS); MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); DHT12 dht12; void setup() { //Serial.begin(115200); Wire.begin(); pinMode(buttonPinA, INPUT_PULLUP); // Setup the button Activate internal pull-up pinMode(buttonPinB, INPUT_PULLUP); // Setup the button Activate internal pull-up // After setting up the buttons, setup debouncer debouncerA.attach(buttonPinA); debouncerA.interval(5); //5 debouncerB.attach(buttonPinB); debouncerB.interval(5);//5 // Make sure relays are off when starting up digitalWrite(relayPinA, RELAY_ON); digitalWrite(relayPinB, RELAY_ON); // Then set relay pins in output mode pinMode(relayPinA, OUTPUT); pinMode(relayPinB, OUTPUT); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("2xRelais,2xButton,DHT12", "1.2a"); // Register all sensors to gw (they will be created as child devices) present(SSR_A_ID, S_LIGHT); present(SSR_B_ID, S_LIGHT); present(CHILD_ID_HUM, S_HUM); present(CHILD_ID_TEMP, S_TEMP); metric = getControllerConfig().isMetric; } /* Example on how to asynchronously check for new messages from gw */ void loop() { currentMillis = millis(); debouncerA.update(); // Get the update value int valueA = debouncerA.read(); if (valueA != oldValueA) { send(msgA.set(stateA ? false : true), true); // Send new state and request ack back oldValueA = valueA; } debouncerB.update(); // Get the update value int valueB = debouncerB.read(); if (valueB != oldValueB) { send(msgB.set(stateB ? false : true), true); // Send new state and request ack back oldValueB = valueB; } // Force reading sensor, so it works also after sleep() // dht12.readSensor(true); if (currentMillis - startMillis >= UPDATE_INTERVAL) { // Get temperature from DHT library float temperature = dht12.readTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT!"); } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) { // Only send temperature if it changed since the last measurement or if we didn't send an update for n times lastTemp = temperature; // apply the offset before converting to something different than Celsius degrees temperature += SENSOR_TEMP_OFFSET; if (!metric) { temperature = dht12.readTemperature(); } // Reset no updates counter nNoUpdatesTemp = 0; send(msgTemp.set(temperature, 1)); #ifdef MY_DEBUG Serial.print("T: "); Serial.println(temperature); #endif } else { // Increase no update counter if the temperature stayed the same nNoUpdatesTemp++; } // Get humidity from DHT library float humidity = dht12.readHumidity(); if (isnan(humidity)) { Serial.println("Failed reading humidity from DHT"); } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) { // Only send humidity if it changed since the last measurement or if we didn't send an update for n times lastHum = humidity; // Reset no updates counter nNoUpdatesHum = 0; send(msgHum.set(humidity, 1)); #ifdef MY_DEBUG Serial.print("H: "); Serial.println(humidity); #endif } else { // Increase no update counter if the humidity stayed the same nNoUpdatesHum++; } startMillis = currentMillis; Serial.print("Startzeit: "); Serial.println(startMillis); } // Sleep for a while to save energy //wait(UPDATE_INTERVAL); } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type == V_STATUS) { switch (message.sensor) { case 1: stateA = message.getBool(); digitalWrite(message.sensor + 4, stateA ? RELAY_ON : RELAY_OFF); break; case 2: stateB = message.getBool(); digitalWrite(message.sensor + 4, stateB ? RELAY_ON : RELAY_OFF); break; } // Write some debug info Serial.print("Incoming change for sensor:"); Serial.println(message.sensor); //Serial.print("from node:"); //Serial.println(message.sender); //Serial.print(", New status: "); Serial.println(message.getBool()); } }