Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Smart Battery Charger Multiplexer met Smart Display

Componenten en benodigdheden

Arduino UNO
× 1
Arduino Proto Shield
× 1
Ultrasone sensor - HC-SR04 (algemeen)
× 1
Adafruit MCP-3008 8-kanaals 10-bit Adc
× 1
5V-relais - 2-kanaals optocoupler
× 3
LM2596 Voedingsmodule DC / DC BUCK 3A instelbaar
× 1
Weerstand 1k ohm
× 12
Aansluitstrip met 6 posities
Controleer de afbeelding - vrijwel elk type verbindingssysteem kan worden gebruikt.
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Over dit project

Als je in het noordoosten woont, als je een oudere auto of een boot hebt, of een grasmaaier of een ander voertuig dat begint met een batterij die je niet rijdt of gebruikt bij slecht weer (sommigen noemen het winter), moet je beslissen wat je gaat doen met de batterijen elk seizoen. Als je er een of twee hebt, is het vrij eenvoudig - je kunt een druppellader krijgen. De goedkope eenvoudige zijn minder dan $ 15 - maar ze zijn eenvoudig - geen batterijfeedback of monitoring, ze zetten gewoon iets meer dan 13 volt op de batterij. Een betere keuze zou een van de slimme opladers zijn - ze hebben meestal een normale hogere / snellere lading en een sneeuw- of druppellading die de output aanpast op basis van de batterijspanning en -conditie. Ze werken heel goed - Harbor Freight heeft er een voor $ 39 - natuurlijk $ 29 in de uitverkoop, wat bijna altijd is.

Waar ik werd opgehangen, was ik mijn 1975 MGB (met een 3,5 liter Oldsmobile V8), een Toyota pick-up uit 1981, een boot en een generator - allemaal met 12 volt-batterijen. En als we dan in de winter weggaan, laten we een van de auto's hier staan, zodat er nog een batterij is. Nou, ik zou 5 batterijoppassers moeten hebben - $ 150 als ik voor de HF-die in de uitverkoop ga.

Terwijl ik hierover nadacht, dacht ik dat ik er een voor elke batterij zou krijgen, zet hem op, het brengt de batterijen op een niveau en dan controleert het en laadt het de rest van de tijd gewoon op. Dus het idee komt bij mij op - waarom zou ik het niet een paar uur per dag op elke batterij kunnen aansluiten - zou dat niet werken? Als ik het dan automatisch tussen hen kan laten schakelen?

Nou ik kan. Ik nam een ​​van mijn Arduino's en schreef een programma dat precies dat doet - en toen liet ik me meeslepen en voegde een paar extra functies toe. Dus hier presenteer ik de details over waar ik mee eindigde. Deze versie is geschikt voor maximaal 6 batterijen met automatische detectie.

Het werkt met 1 tot 6 batterijen. De eerste batterij moet worden aangesloten op de nummer 1-plek - die verbinding is verbonden met de spanningsregelaar die de Arduino en andere elektronica van stroom voorziet. De 2e en hoger kunnen dan in willekeurige volgorde worden aangesloten. Wanneer u een batterij aansluit, wordt de spanning gedetecteerd in de Read_Show_Volts-functie en wordt die batterij toegevoegd aan de oplaadcyclus.

Hoe het werkt - ik wilde plaats bieden aan 6 batterijen. Bij een Arduino UNO zijn A4 en A5 analoge ingangen nodig voor de 2-draads LCD-besturing en dan blijven er 4 analoge ingangen over. Dus ik heb een MCP-3008 8-kanaals analoge ingangen aangesloten. Ik gebruik 2 1k-weerstanden als spanningsdeler voor elke ingang naar de MCP-3008.

Er zijn in principe 4 functies die in het programma worden aangeroepen.

  • De functie read_show_volts controleert elke verbinding om te zien of er een batterij is aangesloten door te testen of er meer dan 8 volt beschikbaar is. Als er 8v of meer is, wordt die verbinding toegevoegd aan de laadlus.
  • Functie check_relays controleert de timerteller en wanneer deze het maximum bereikt, verplaatst hij de lader naar het volgende relais in de rij.
  • Functie update_display doet precies dat - werkt het scherm bij. Eerst toont het de spanning op aansluitingen 1, 2 op lijn 1 en de spanning van aansluitingen 3 en 4 op lijn 2. Wanneer de timer het vertelt, verandert het en geeft het de spanning weer van aansluitingen 5 en 6 op lijn 1 en omdat ik er twee had extra analoge ingangen Ik toon de systeemspanning (hopelijk 5 volt) en de iref-spanning - 3,3 volt. Die metingen zijn niet nodig, maar er was een lege regel en ik wist niet wat ik anders moest laten zien - ik sta open voor ideeën.
  • De laatste functie is read_distance_update . Deze is interessant en het leukst om mee te spelen. Ik heb een HC-SR04 ultrasone sonar afstandsmeter aangesloten. Ik wilde dat het lcd-scherm de spanningen zou bewaken, maar ik sta daar bijna nooit naar het lcd-scherm te kijken - meestal kon het worden uitgeschakeld. Ik had een schakelaar kunnen plaatsen - gemakkelijke uitweg - maar wat ik deed was de HC-SR04 erin zetten en na zoveel seconden het lcd-scherm uitschakelen. Als ik dan mijn hand dicht over de HC-SR04 ga, zet ik het lcd-scherm weer x seconden aan.

Er zijn variabelen voor bijna alles, zodat u het kunt aanpassen aan uw behoeften. Ik heb de oplaadtimer ingesteld op 1 uur per batterij. Dus als er twee batterijen zijn aangesloten, wordt deze elk 12 keer per dag gedurende 1 uur opgeladen. Met 4 batterijen zou het 6 keer per dag 1 uur zijn, enzovoort.

Zolang ik de HC-SR04 had, heb ik een routine toegevoegd die de timerlus verandert in een kortere tijd - een paar seconden op elke batterij. De reden dat ik dit deed, was zodat ik kon zien dat het goed wisselde tussen de batterijen en dat ik geen uur hoefde te wachten om het te zien veranderen. Als u uw hand een paar seconden boven de HC-SR04 houdt, knippert de lcd-achtergrondverlichting aan en uit, zodat u weet dat deze is ingeschakeld. Je hoort dan de relais om de paar seconden schakelen. Houd uw hand weer boven de HC-SR04 en hij schakelt terug.

Hier is een zip van de code:BatteryMultiplexer

Code

  • Arduino-code batterij-multiplexer
Accu-multiplexer Arduino-codeArduino
Ik gebruikte een Arduino Uno.
#include #include  // Gebruik versie 1.2.1#include #include auto timer =timer_create_default(); // maak een timer met standaardinstellingen// De LCD-constructor - weergegeven adres is 0x27 - kan al dan niet correct zijn voor de uwe// Ook gebaseerd op YWRobot LCM1602 IIC V1LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIEF);int zcnt =0;int acnt =0; // algemeen doel nu niet chargeTime =(10 * 1000); // hoeveel tijd te besteden aan elke batteryint charge_time_counter =59; // hoeveel oplaadtijden zijn verstreken?int charge_time_max =60; // hoeveel oplaadtijden zijn verstreken?int relay1 =3; // elk relais op zijn eigen pinint relay2 =4;int relay3 =5;int relay4 =6;int current_relay =0; // welk relais is het nu?int max_relays =3; // hoe kunnen relais - 0 gebaseerd. Begin alle drie te verwachten.float volt1; // wat is de spanning van elke batterijfloat volt2;float volts3;int min_volts =1; // wat is de minimale spanning die een batterijspanning moet hebben om te worden opgeladen.int volts_update_count =5; // hoe vaak de spanningsmeting in seconden moet worden bijgewerkt. volts_update_counter =0; // volg het aantal seconden verstreken doorint volts_update =(500); int read_distance_update =(500); // update de afstandslezer elke millisint time_on_counter =0; // teller voor de weergave aan/uit time_on_count =100; // seconden om in heart_beat =0 te zijn; // draai deze 0 naar 1 naar 0 om de hartslag weer te gevenUltraSonicDistanceSensor distanceSensor (11, 12); // Initialiseer de sensor die digitale pinnen 13 en 12.int gebruikt; int relays [] ={relay1, relay2, relay3};int is_live[] ={0, 0, 0}; // 1 indien live, 0 indien niet. Ik heb slechts 3int debug =5; // stel dit in op het niveau van debug-berichten om naar de seriële printervoid all_change_to (int which) te gaan { // verander alle relais naar HOOG of LAAG, vertel me welke:) digitalWrite (relay1, welke); digitalWrite(relay2, welke); digitalWrite(relay3, which);}void toggle_relays(int whichOne) { lcd.setCursor(0, 0); // laat zien welk relais het huidige is op lcd.print ("Relay on:"); lcd.print(current_relay + 1); // current_relay is op nul gebaseerd all_change_to (HIGH); // schakel eerst alles uit digitalWrite (relays [current_relay], LOW); // en stel degene in die op acnt++ zou moeten staan; // gewoon een teller om te laten zien dat het werkt lcd.print(" "); lcd.print(acnt);}void checkRelays() { // verplaats het huidige_relais naar het volgende relais // als we de max bereiken, begin dan bij 0 // terwijl je hier bent, bel toggle_relays om er zeker van te zijn dat we dat niet zijn laad een lege of lege charge_time_counter++ op; if (charge_time_counter>=charge_time_max) { current_relay++; if (current_relay>=max_relays) { current_relay =0; } toggle_relays(current_relay); charge_time_counter =0; }}void read_distance() { // lees de afstand van iets van de HC-S204 // als het iets binnen 80 cm is, zet dan het display aan en reset het display op de teller // als de teller is bereikt, is er niets binnen 80 cm dus zet het display uit distance =distanceSensor.measureDistanceCm(); // verwijder deze om de werkelijk gemeten afstand te zien // Serial.print ("Afstand in CM:"); // Serial.println (afstand); if (afstand <80) { // kan alles zijn onder de 200 voor mijn systeem, geef hierboven een commentaar en controleer de jouwe lcd.backlight(); // zet het display aan time_on_counter =0; } else { // misschien afgaan? time_on_counter++; if (time_on_counter> time_on_count) { time_on_counter =0; lcd.noBacklight(); } }} ongeldig read_show_volts() { // lees de volt bij elke batterij-ingang // dan als minder dan min_volts, er is niets dat het opladen waard is, sla die verbinding over // dit wordt keer op keer gebeld, dus als een draad wordt afgebroken of // wat het ook niet in de laadlus zal zijn volts1 =analogRead(0); volt1 =(volt1 * 0,016); lcd.setCursor(0, 1); lcd.print(" "); // wis de regel lcd.setCursor (11, 0); lcd.print(volt1); volt2 =analoog lezen(1); volt2 =(volt2 * 0,0164); lcd.setCursor(4, 1); lcd.print(volt2); volt3 =analoog lezen (2); volt3 =(volt3 * 0,0166); lcd.setCursor(11, 1); lcd.print(volt3); // test nu de spanningen. Indien minder dan 10, laten we dan aannemen dat de batterij leeg/slecht is // dus uit de rotatie halen // begin met het wissen van alle relais int temp_cnt =0; // zet alle arrays op 0 - dat is uit relays [0] =0; relais [1] =0; relais [2] =0; if (volts1> min_volts) {relais [temp_cnt] =relais1; // relais 1 is goed temp_cnt++; } if (volts2> min_volts) {relais [temp_cnt] =relais2; // relais 2 is goed temp_cnt++; } if (volts3> min_volts) {relais [temp_cnt] =relais3; // relais 3 is goed temp_cnt++; } max_relays =temp_cnt; // dit is een weddenschap op het lcd - laat me gewoon zien dat lcd.setCursor (0, 1) draait; if (heart_beat ==1) { lcd.print("<>"); hartslag =0; } else { lcd.print("><"); hartslag =1; } lcd.print(charge_time_counter); read_distance();}void setup(){ Serial.begin (19200); Serial.println("Begint"); lcd.begin (16, 2); // zestien tekens over - 2 regels lcd.backlight(); pinMode (relais1, UITGANG); pinMode (relais2, UITGANG); pinMode (relais3, UITGANG); all_change_to(HOOG); // timers instellen. 3 timers - de tijd om de oplader op elke batterij in te schakelen, // hoe vaak de spanningsupdate moet worden weergegeven // en hoe vaak moet worden gecontroleerd of de afstand is afgelezen om het display in te schakelen read_show_volts(); // doe de eerste keer zodat we niet op de timer hoeven te wachten. checkRelais(); timer.every(chargeTime, checkRelays); timer.every(volts_update, read_show_volts);}void loop(){ timer.tick(); // vink de timer aan}

Schema's

Schema voor multiplexer

Productieproces

  1. Slimme jaloezieën
  2. Bedien muntvangers met Arduino
  3. Arduino Temp. Monitor en realtimeklok met 3.2-weergave
  4. Arduino met Bluetooth om een ​​LED te bedienen!
  5. Arduino Power
  6. Spelen met Nextion Display
  7. DIY voltmeter met Arduino en een Nokia 5110-display
  8. Arduino-trainingsplatform
  9. Bouw de Fridgeye-app met een Nextion-display
  10. Zonnestraling meten met Arduino
  11. Smart Hand Glove