Cesar J. Silva
Published

Power Pump/Turbine (IoT Capstone)

A device that that utilizes kinetic energy from a turbine to charge a battery.

IntermediateWork in progress14 days8
Power Pump/Turbine (IoT Capstone)

Things used in this project

Hardware components

Photon 2
Particle Photon 2
×1
Evaluation Board, MAX17260X Li-Ion Fuel Gauge IC
Evaluation Board, MAX17260X Li-Ion Fuel Gauge IC
×1
SparkFun Power Cell - LiPo Charger/Booster
SparkFun Power Cell - LiPo Charger/Booster
×1
Stepper Motor, Mini Step
Stepper Motor, Mini Step
×1
Battery, 3.7 V
Battery, 3.7 V
×1

Software apps and online services

Visual Studio Code Extension for Arduino
Microsoft Visual Studio Code Extension for Arduino

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Laser cutter (generic)
Laser cutter (generic)
Soldering iron (generic)
Soldering iron (generic)
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
Solder Wire, Lead Free
Solder Wire, Lead Free

Story

Read more

Schematics

capstone_incasing_silva(2)_tAtEaLcOeD.stl

Sketchfab still processing.

IoT_Capsstone_Fritzing_Silva

IoT_Capstone_Schematic_Silva

Code

IoT_Capstone_Program_Run_Silva.cpp

C/C++
This code publishes the voltage and battery percentage that the fuel gauge reads to the adafruit dashboard.
/* 
 * Project: IoT_Capstone_Program_Run_Silva
 * Author: Cesar J. Silva
 * Date: August 12, 2025
 * For comprehensive documentation and examples, please visit:
 * https://docs.particle.io/firmware/best-practices/firmware-template/
 */

// Include Particle Device OS APIs
#include "Particle.h"
#include <Adafruit_MQTT.h>
#include "Adafruit_MQTT/Adafruit_MQTT_SPARK.h"
#include "Adafruit_MQTT/Adafruit_MQTT.h"
#include "credentials.h"
#include "Adafruit_LC709203F.h"

//MQTT Setup
TCPClient TheClient;
Adafruit_MQTT_SPARK mqtt(&TheClient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe CapHome = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/Capstone_Dashboard");

Adafruit_MQTT_Publish Batt_Voltage = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/batteryvoltage");
Adafruit_MQTT_Publish Batt_Percent = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/batterypercentage");
Adafruit_MQTT_Publish Batt_Temp = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/batterytemperature");

// Let Device OS manage the connection to the Particle Cloud
SYSTEM_MODE(MANUAL);
Adafruit_LC709203F lc;

void MQTT_connect();
bool MQTT_ping();
int currentTime, lastSecond, lastTime;
float subValue, pubValue;
float BV, BP, BT;

// setup() runs once, when the device is first turned on
void setup() {
  Serial.begin(9600);
  waitFor(Serial.isConnected, 5000);

  //Connect to the Internet but not Particle Cloud
  WiFi.on();
  WiFi.connect();
  while(WiFi.connecting());
  Serial.printf(".");

  //Setup MQTT subscripntion
  mqtt.subscribe(&CapHome);
  
  if ((currentTime - lastSecond) > 10000) {
    lastSecond = millis();
    Serial.println("Adafruit LC709203F demo");
  }

  if (!lc.begin()){
    Serial.println(F("Couldn't find Adafruit LC709203F?\nMake sure a battery is plugged in!"));
    delay(5000);
  }
  Serial.println(F("Found LC709203F"));
  Serial.print("Version: 0x"); Serial.println(lc.getICversion(), HEX);

  //lc.setThermistorB(3950);
  //Serial.print("Thermistor B = "); Serial.println(lc.getThermistorB());

  lc.setPackSize(LC709203F_APA_2000MAH);

  //lc.setAlarmVoltage(3.8);
}

// loop() runs over and over again, as quickly as it can execute.
void loop() {

  MQTT_connect();
  MQTT_ping();

  Adafruit_MQTT_Subscribe *subscription;
  while((subscription = mqtt.readSubscription(1000))){
    if (subscription == &CapHome){
      subValue = atof((char *)CapHome.lastread);
    }
  }

  Serial.print("Batt_Voltage:");
  Serial.print(lc.cellVoltage(), 3);
  Serial.print("\t");
  Serial.print("Batt_Percent:");
  Serial.print(lc.cellPercent(), 1);
  Serial.print("\t");
  Serial.print("Batt_Temp:");
  Serial.println(lc.getCellTemperature(), 1);

  if((millis()-lastTime > 10000)){
    if(mqtt.Update()){
      Batt_Voltage.publish(lc.cellVoltage(), 3);
      Serial.printf("Publishing Batt_Voltage %f \n", lc.cellVoltage());
      Batt_Percent.publish(lc.cellPercent(), 1);
      Serial.printf("Publishing Batt_Percent %f \n", lc.cellPercent());
      Batt_Temp.publish(lc.getCellTemperature(), 1);
      Serial.printf("Publishing Batt_Temp %f \n", lc.getCellTemperature());
    }
    lastTime = millis();
  }
}
void MQTT_connect() {
  int8_t ret;

  if (mqtt.connected()) {
    return;
  }
  Serial.printf("Connecting to MQTT... ");

  while ((ret = mqtt.connect()) !=0) {
    Serial.printf("Error Code %s\n", mqtt.connectErrorString(ret));
    Serial.printf("Retrying MQTT connection in 5 seconds... \n");
    mqtt.disconnect();
    delay(5000);
  }
  Serial.printf("MQTT Connected!\n");
}

bool MQTT_ping() {
  static unsigned int last;
  bool pingStatus;
  if ((millis() - last) > 120000) {
    Serial.printf("Pinging MQTT \n");
    pingStatus = mqtt.ping();
    if(!pingStatus) {
      Serial.printf("Disconnecting \n");
      mqtt.disconnect();
    }
    last = millis();
  }
  return pingStatus;
}

Github

Credits

Cesar J. Silva
3 projects • 6 followers

Comments