Multiflexmeter Forums MFM-waterhoogte Minimaal energieverbruik

Weergave van 2 geneste reacties
  • Auteur
    Berichten
    • #593
      Jos Goossen

      De Multiflexmeter moet zo lang mogelijk autonoom kunnen werken. Daarom is een laag energieverbruik essentieel. Deze schakeling is gebaseerd op een losse Atmega328P-PU.
      De ultrasoonsensor krijgt na x seconden spanning via pin D9.
      Tussen de metingen door verbruikt de schakeling 4 mA (bij een voedingsspanning van 6,5V, aangesloten op een 5V MCP1702). Piekstroom tijdens meten en wegschrijven naar SD-card: 30 mA

      Wie heeft een idee hoe met name de ruststroom verder is te verlagen?

       

      Multiflexmeter 1x Atmega328P-PU

      Sketch:

      // DS3231_DS18B20_parkeersensor_SDcard_v07
      // DS3231 -> SDA = analog 4, SCL = analog 5
      // ultrasoonsensor wordt periodiek ingeschakeld door digitale pin 9

      #include <DS3231.h> // definieer library DS3231 clockmodule, http://www.rinkydinkelectronics.com
      DS3231 rtc(SDA, SCL); // initialiseer DS3231 clockmodule
      const int powerpin = 9; // digitale pin 9 om gebruikers in en uit te schakelen
      #include <JeeLib.h> // Low power functions library https://github.com/jcw/jeelib/archive/master.zip
      ISR(WDT_vect) { Sleepy::watchdogEvent(); } // Setup the watchdog

      /* SD module
      MOSI – D11
      MISO – D12
      SCK – D13
      CS – D10
      */

      #include <SPI.h>
      #include <SdFat.h>
      #include <RunningMedian.h> // https://github.com/mchughj/RunningMedian
      #include <NewPing.h> // https://github.com/PaulStoffregen/NewPing
      #include <config.h> //
      #include <DallasTemperature.h> // temperatuursensor
      #include <Wire.h> // temperatuursensor
      #include <OneWire.h> // temperatuursensor

      // thermometer DS18B20
      #define ONE_WIRE_BUS 2 // data (geel)aan pin 2 Arduino
      OneWire oneWire(ONE_WIRE_BUS); // setup communicatie met OneWire devices
      DallasTemperature sensors(&oneWire); // geef oneWire reference door aan Dallas Temperature

      // SD
      const uint8_t sdChipSelect = SS;
      SdFat sd;
      SdFile file;

      float afstand_gemeten;
      float afstand_tempcorrectie;
      float temp,Vsound;

      // ultrasoonsensor
      #define DISTANCE_ECHO 3
      #define DISTANCE_TRIGGER 6
      #define MAX_ULTRASONIC_DISTANCE 450
      NewPing sonar(DISTANCE_TRIGGER, DISTANCE_ECHO, MAX_ULTRASONIC_DISTANCE);
      int trigPin = 6;
      int echoPin = 3;

      void setup()
      {
      pinMode(powerpin, OUTPUT);
      Serial.begin(9600);
      digitalWrite (powerpin, HIGH); // D9 aan
      Sleepy::loseSomeTime(50); // Arduino 0,05 s in slaapstand zetten
      rtc.begin(); // initialiseer rtc object
      // Verwijder eenmalig !! // voor volgende 3 regels om datum en tijd in te stellen
      // rtc.setDOW(TUESDAY); // dag van de week
      // rtc.setTime(22, 05, 0); // tijd (24u formaat)
      // rtc.setDate(29, 11, 2016); // datum 30 januari 2016

      if (!sd.begin(sdChipSelect)
      || !file.open(“DATA.CSV”, O_CREAT | O_WRITE | O_APPEND)) {
      Serial.println(F(“SD problem”));
      while(1);
      }

      digitalWrite (powerpin, LOW); // D9 uit
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
      }

      void loop()
      {
      // temperatuur
      sensors.requestTemperatures(); // lees temperatuur
      temp=sensors.getTempCByIndex(0); // ‘byIndex’ voor het geval meer temp sensoren op dezelfde bus

      // zet D9 aan
      digitalWrite (powerpin, HIGH);
      afstand_tempcorrectie = getDistanceFromUltrasonicSensor();
      afstand_gemeten = afstand_tempcorrectie;

      // ultrasoon pinnen op output zetten om lekstroom te voorkomen
      pinMode(trigPin, OUTPUT);
      digitalWrite(trigPin, LOW);
      pinMode(echoPin, OUTPUT);
      digitalWrite(echoPin, LOW);

      // temperatuurcorrectie geluidsnelheid: library rekent standaard met 350,877193 m/s
      Vsound=331.23 * sqrt((temp+273.15)/273.15); //2
      afstand_tempcorrectie=afstand_tempcorrectie*(Vsound/350.877193);

      // schrijf naar SD-card
      LogToSD();
      digitalWrite (powerpin, LOW); // LED uit
      // pauzeer 15 minuten (900 s)
      // for (byte i = 0; i < 900; ++i)
      // Sleepy::loseSomeTime(1000);
      // 5 s pauze voor testdoeleinden
      Sleepy::loseSomeTime(5000);

      // ultrasoon pinnen terugzetten op correcte status
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
      }

      // neem de mediaan van 13 ultrasoon metingen
      float getDistanceFromUltrasonicSensor(){
      RunningMedian samples = RunningMedian(13);
      for(int i= 0; i<13; i++){
      Sleepy::loseSomeTime(50);
      float pingVal = sonar.ping();

      float afstand = pingVal / US_ROUNDTRIP_CM;
      if(afstand == 0){
      afstand = 0;
      }
      samples.add(afstand);
      }
      return samples.getMedian();
      }

      // schrijf tijd, afstand en temperatuur naar SD-card
      void LogToSD(){
      file.print((rtc.getUnixTime(rtc.getTime()))); // schrijf tijd
      file.print(“,”);
      file.print(afstand_gemeten); // schrijf gemeten afstand zonder correctie
      file.print(“,”);
      file.print(afstand_tempcorrectie); // schrijf afstand gecorrigeerd voor temperatuur
      file.print(“,”);
      file.print(sensors.getTempCByIndex(0)); // schrijf temp 0 (buiten)
      file.println();
      file.sync(); // sluit file
      }

    • #627
      Cor Berrevoets

      Hi Jos,

      Alhoewel ik zelf geen Arduino’s meer gebruik maar MSP430G2553 chips van Texas Instruments (goedkoop en zeer zuinig, programeerbaar in de arduino stijl) zou je naar de rocketscream library kunnen kijken https://github.com/rocketscream/Low-Power

      groet

      Cor Berrevoets

    • #640
      Jos Goossen

      Dag Cor,

      De gebruikte jeelib library is vergelijkbaar met de door jou gebruikte lowpower library. Ik ben er inmiddels achter dat de SD-module verantwoordelijk is voor de hoge ruststroom. Ook als is de voeding van de SD tussentijds uitzet blijft hij stroom gebruiken via de datapinnen. Overstappen op een EEPROM zou een oplossing kunnen zijn.
      Volgens de datasheet van de MSP430G2553 is het stroomgebruik inderdaad erg laag. Voor welke toepassingen gebruik je deze?

      Groet,
      Jos

Weergave van 2 geneste reacties
  • Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.