T3ch Flicks
Published © CC BY-NC-SA

Smart Buoy - Scheduling Power to the System

Controlling power to the system using alarms based on voltages!

IntermediateFull instructions provided2 hours3,523
Smart Buoy - Scheduling Power to the System

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Code

control_power_with_rtc_alarm.ino

Arduino
Error opening file.

monitor_power.ino

Arduino
Error opening file.

control_power_with_rtc_based_on_monitoring.ino

Arduino
Error opening file.

Code snippet #1

Plain text
#include <DS3232RTC.h>#include <Adafruit_INA219.h>
#include  <Wire.h>int led = LED_BUILTIN; // INA219 - Power Monitor
Adafruit_INA219 ina219;  
void setup() {
  Wire.begin();
  pinMode(led, OUTPUT);
  
  // initialise INA219 - Power Monitor
  ina219.begin();
  ina219.setCalibration_32V_1A();
}void loop() {
  digitalWrite(led, HIGH);
  delay(3000);
  reset_alarm();
}void reset_alarm(){
  RTC.alarmInterrupt(ALARM_1, true);
  RTC.squareWave(SQWAVE_NONE);
  setTime(0, 0, 0, 0, 0, 1970); 
  RTC.set(now());
  int wait_time = get_wait_time_from_voltage();
  // set new alarm
  RTC.setAlarm(ALM1_MATCH_MINUTES, 0, wait_time, 0, 0);
  // clear old alarm flag - turning off system
  RTC.alarm(ALARM_1);
}int get_wait_time_from_voltage(){
  float shuntvoltage = ina219.getShuntVoltage_mV();
  float busvoltage = ina219.getBusVoltage_V();
  float loadvoltage = busvoltage + (shuntvoltage / 1000);  // Samsung 18650 % capacity at a given voltage
  // batt_voltages            0.0, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.5
  // batt_percentages           0,   0,   9,  22,  52,  64,  75,  84,  93, 100, 100
  int wait_time;
  if (loadvoltage < 3.6) wait_time = 55;
  else if (loadvoltage < 3.8) wait_time = 25;
  else if (loadvoltage < 4.0) wait_time = 15;
  else if (loadvoltage < 4.1) wait_time = 10;
  else wait_time = 3;
  
  return wait_time;
}

Code snippet #2

Plain text
#include <Wire.h>#include <Adafruit_INA219.h>// INA219 - Power Monitor
Adafruit_INA219 ina219;
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;void setup() {
  Serial.begin(115200);
  while (!Serial) {
      delay(1);
  }  // initialise INA219 - Power Monitor
  ina219.begin();
  ina219.setCalibration_32V_1A();
  
}void loop() {
  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA);  Serial.println(" mA");
  Serial.print("Power:         "); Serial.print(power_mW);    Serial.println(" mW");
  Serial.println();
  delay(1000);
}

Code snippet #3

Plain text
#include <DS3232RTC.h>#include <Adafruit_INA219.h>
#include  <Wire.h>int led = LED_BUILTIN; // INA219 - Power Monitor
Adafruit_INA219 ina219;  
void setup() {
  Wire.begin();
  pinMode(led, OUTPUT);
  
  // initialise INA219 - Power Monitor
  ina219.begin();
  ina219.setCalibration_32V_1A();
}void loop() {
  digitalWrite(led, HIGH);
  delay(3000);
  reset_alarm();
}void reset_alarm(){
  RTC.alarmInterrupt(ALARM_1, true);
  RTC.squareWave(SQWAVE_NONE);
  setTime(0, 0, 0, 0, 0, 1970); 
  RTC.set(now());
  int wait_time = get_wait_time_from_voltage();
  // set new alarm
  RTC.setAlarm(ALM1_MATCH_MINUTES, 0, wait_time, 0, 0);
  // clear old alarm flag - turning off system
  RTC.alarm(ALARM_1);
}int get_wait_time_from_voltage(){
  float shuntvoltage = ina219.getShuntVoltage_mV();
  float busvoltage = ina219.getBusVoltage_V();
  float loadvoltage = busvoltage + (shuntvoltage / 1000);  // Samsung 18650 % capacity at a given voltage
  // batt_voltages            0.0, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.5
  // batt_percentages           0,   0,   9,  22,  52,  64,  75,  84,  93, 100, 100
  int wait_time;
  if (loadvoltage < 3.6) wait_time = 55;
  else if (loadvoltage < 3.8) wait_time = 25;
  else if (loadvoltage < 4.0) wait_time = 15;
  else if (loadvoltage < 4.1) wait_time = 10;
  else wait_time = 3;
  
  return wait_time;
}

Credits

T3ch Flicks
7 projects • 59 followers
Contact

Comments

Please log in or sign up to comment.