[contest] BcSensor



  • Hi,
    i attached my sensors boards
    the are 2 versions, one for battery power and one for Wall Adapter Power Supply
    The battery powered version:
    -is connected directly to the battery

    • 2x connectors for Dallas temperature sensor
    • 1 - photocell (light sensor)
      (this version is reporting the battery level)
      DSC_2839.jpg
      DSC_2838.jpg

    The other version (Wall Adapter Power Supply)

    • 2x connectors for Dallas temperature sensor
    • 1 - photocell connector (light sensor)
    • 1 DHT-22 connector (humidity and temperature)
    • 1 connector for pir sensor (HC-SR501 PIR Motion Sensor Module)
    • 1 connector for PWM IRF3205 (led light controller )
    • 1 conenctor for Magnetic Door Switch Sensor
    • 1 conenctor for power out (5v)
      (this version has a 1117 3.3v regulator and 7805 5.0v)
      DSC_2837.jpg

    DSC_2834.jpg
    DSC_2833.jpg
    DSC_2831.jpg

    **the 3rd version has a relay instead of IRF3205 **
    relayv.jpg

    all my sensors are connected to an MQTT gateway what is powered by my switching power regulator (5v , 2x 3v3)
    mqtt2-v1.jpg
    mqtt-v1.jpg
    pwr.jpg

    the mqtt gateway is connected to the controller rasbperry pi

    • (working with openhab and pidome [not at the same time])

    here is the for for one of my sensors

    define SN "BcSensor"
    define SV "1.1"

    include <MySensor.h>
    include <SPI.h>
    include <DallasTemperature.h>
    include <OneWire.h>
    include <DHT.h>

    define NUMBER_OF_LIGHTS 1
    //#define NUMBER_DS 1
    define NUMBER_DHT 1
    define NUMBER_PIR 1

    define LED_PIN 5 // Arduino pin attached to MOSFET Gate pin
    define FADE_DELAY 5 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)

    define ONE_WIRE_BUS 2
    define MAX_ATTACHED_DS18B20 16

    define LIGHT_SENSOR_ANALOG_PIN A2
    int lastLightLevel;
    static int currentLevel = 0; // Current dim level...
    unsigned long SLEEP_TIME = 30000;
    unsigned long lastRequest, now;
    MySensor gw;
    ifdef NUMBER_DS // dallas sensor
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors = 0;
    MyMessage msg(0, V_TEMP);
    endif

    ifdef NUMBER_DHT // DTH sensor
    define HUMIDITY_SENSOR_DIGITAL_PIN 4
    define CHILD_ID_HUM 1
    define CHILD_ID_TEMP 1
    DHT dht;
    float lastTemp;
    float lastHum;
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    endif

    ifdef NUMBER_PIR //PIR Sensor
    define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!)
    define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    define CHILD_ID 0 // Id of the sensor child
    boolean lastTrippedState;
    MyMessage msgMotion(CHILD_ID, V_TRIPPED);
    endif
    boolean metric = true;

    MyMessage dimmerMsg(0, V_DIMMER);
    MyMessage lightMsg(0, V_LIGHT);

    ifdef NUMBER_OF_LIGHTS // light sensor
    MyMessage msgL(0, V_LIGHT_LEVEL);
    endif
    void setup()
    {
    analogReference(INTERNAL);
    Serial.println( SN );
    gw.begin( incomingMessage );

    gw.present( 0, S_DIMMER );
    gw.sendSketchInfo(SN, SV);
    gw.request( 0, V_DIMMER );
    ifdef NUMBER_DS //dallas sensor
    sensors.begin();
    numSensors = sensors.getDeviceCount();
    for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) {
    gw.present(i, S_TEMP);
    }
    endif
    ifdef NUMBER_OF_LIGHTS // light sensor
    pinMode(LIGHT_SENSOR_ANALOG_PIN, INPUT);
    gw.present(0, S_LIGHT_LEVEL);
    endif
    ifdef NUMBER_DHT // DHT sensor
    dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
    gw.present(CHILD_ID_HUM, S_HUM);
    gw.present(CHILD_ID_TEMP, S_TEMP);
    endif
    ifdef NUMBER_PIR //PIR Sensor
    pinMode(DIGITAL_INPUT_SENSOR, INPUT);
    gw.present(CHILD_ID, S_MOTION);
    endif
    }

    void loop()
    {
    gw.process();
    now = millis();
    if (now - lastRequest >= SLEEP_TIME || lastRequest < 1) {
    Serial.println("loop");
    lastRequest = now;
    ifdef NUMBER_DS // DALLAS
    sensors.requestTemperatures();
    for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) {
    float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric ? sensors.getTempCByIndex(i) : sensors.getTempFByIndex(i)) * 10.)) / 10.;
    if (abs(lastTemperature[i] - temperature) >= 0.5 && temperature != -127.00) {
    gw.send(msg.setSensor(i).set(temperature, 1));
    lastTemperature[i] = temperature;
    }
    }
    endif //end DALLAS
    ifdef NUMBER_OF_LIGHTS // senzor lumina
    int lightLevel = (1023 - analogRead(LIGHT_SENSOR_ANALOG_PIN)) / 10.23;
    if (lightLevel != lastLightLevel) {
    gw.send(msgL.set(lightLevel));
    lastLightLevel = lightLevel;
    }
    endif // end senzor lumina

    ifdef NUMBER_DHT
      delay(dht.getMinimumSamplingPeriod());
      float temperature = dht.getTemperature();
      if (isnan(temperature)) {
        Serial.println("Failed reading temperature from DHT");
      } else if (temperature != lastTemp) {
        lastTemp = temperature;
      if (!metric) {
        temperature = dht.toFahrenheit(temperature);
      }
      gw.send(msgTemp.set(temperature, 1));
      Serial.print("T: ");
      Serial.println(temperature);
    }
    
    float humidity = dht.getHumidity();
    if (isnan(humidity)) {
      Serial.println("Failed reading humidity from DHT");
    } else if (humidity != lastHum) {
      lastHum = humidity;
      gw.send(msgHum.set(humidity, 1));
      Serial.print("H: ");
      Serial.println(humidity);
    }
    endif
    

    }
    ifdef NUMBER_PIR //PIR Sensor
    boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;
    if (tripped != lastTrippedState){
    Serial.println(tripped? "tripped" : "not tripped");
    gw.send(msgMotion.set(tripped?"1":"0")); // Send tripped value to gw//
    lastTrippedState = tripped;
    }
    endif
    }

    void incomingMessage(const MyMessage &message) {
    if (message.type == V_LIGHT || message.type == V_DIMMER) {

    int requestedLevel = atoi( message.data );
    
    requestedLevel *= ( message.type == V_LIGHT ? 100 : 1 );
    
    // Clip incoming level to valid range of 0 to 100
    requestedLevel = requestedLevel > 100 ? 100 : requestedLevel;
    requestedLevel = requestedLevel < 0   ? 0   : requestedLevel;
    
    Serial.print( "Changing level to " );
    Serial.print( requestedLevel );
    Serial.print( ", from " ); 
    Serial.println( currentLevel );
    
    fadeToLevel( requestedLevel );
    
    // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
    gw.send(lightMsg.set(currentLevel > 0 ? 1 : 0));
    
    // hek comment: Is this really nessesary?
    gw.send( dimmerMsg.set(currentLevel) );
    
    
    }
    

    }
    void fadeToLevel( int toLevel ) {

    int delta = ( toLevel - currentLevel ) < 0 ? -1 : 1;

    while ( currentLevel != toLevel ) {
    currentLevel += delta;
    analogWrite( LED_PIN, (int)(currentLevel / 100. * 255) );
    delay( FADE_DELAY );
    }
    }



  • how do you make these pcb so beautiful?

    my pcb are full of wires !!!



  • @gigi
    traditional method, with iron , ferric chloride ..etc
    and after etching i use Rothenberger Rosol 3 before drilling


  • Hero Member

    @AlinClaudiu What kind of batteries are you using and what are the average life and ways to use less power ?



  • @epierre Lipo battery 950mah, for now has 1 month and is not depleted, I just disconnected the power led and use mysensors sleep



  • the source code for** BcSensor Mosfet**
    BcSensor Mosfet


Log in to reply
 

Suggested Topics

48
Online

11.4k
Users

11.1k
Topics

112.6k
Posts