Digital Taxi mätare (4 / 5 steg)

Steg 4: Programmera i C languagemy lo



detta är ett exempel program men du kan få idén om programmering.

#include
#include
#include "24LC256.h"
#include
/*----------------------------------------------------
port och lite uppdrag för LCD ***
----------------------------------------------------*/
#define TH0RELOAD_VALUE 0X3c
#define TL0RELOAD_VALUE 0Xb0
#define wheel_diameter 5
#define sant 1
#define LED_DSP P2 / / LED-Display (7-segment LED)

TypeDef unsigned char bit_8;

bit_8 g_byCountOf50ms;
kod unsigned char num_led [16] =
{0x3F, 0x06, 0x5B, 0x4F, 0x66, //0,1,2,3,4
0x6D, 0x7D, 0x07, 0x7F, 0x6F, //5,6,7,8,9
0x77, 0x7C, 0x39, 0x5E, 0x79, //A,b,C,d,E
0x71}.

unsigned char sensor_variable, hastighet, switch_inc_variable;
unsigned char waiting_time_chargevariable, charge_pulse;
unsigned char EData;
float distance_temp;
unsigned int avstånd = 0, distance_temp2 = 0, distance_temp1;
unsigned int waiting_time_temp, waiting_time, chargevariable, charge_variable = 8;
lite distance_inc_flag, switch_mode_flag, change_status_flag, device1_flag, device2_flag, device3_flag, device4_flag, device5_flag, device6_flag, device7_flag, device8_flag;
lite run_bit;

kod bit_8 * val [] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}; siffriga array
kod unsigned char * route1 [] = {"MP nagar", "MP nagar", "MP nagar", "MP nagar", "MP nagar"};
kod unsigned char * route2 [] = {"5-No Stop", "Arera Colony", "T T Nagar", "Ayodhya", "Piplani"};
kod unsigned char * ladda [] = {"Max Charge = 50Rs","Max Charge = 60Rs","Max Charge = 200Rs","Max Charge = 200Rs","Max Charge = 60Rs"};
kod unsigned char * distance1 [] = {"MaxDistance = 15 km","MaxDistance = 25 km","MaxDistance = 30 km","MaxDistance = 35 km","MaxDistance = 13 km"};
sbit rs = P0 ^ 0; Registrera dig väljer du port 3,5
sbit rw = P0 ^ 1; läsa/skriva är port 3.4
sbit sv = P0 ^ 2; Aktivera är port 3.3
sbit d7 = P1 ^ 7; upptagen flaggan är port 1,7
sbit DSP1 = P0 ^ 3; DSP1 aktiverar (aktiv låg nivå)
sbit DSP2 = P0 ^ 4; DSP2 aktiverar (aktiv låg nivå)
sbit DSP3 = P0 ^ 5. DSP3 aktiverar (aktiv låg nivå)
sbit Dot_Point = P2 ^ 7;
sbit route_selection = P0 ^ 7;
sbit kör = P0 ^ 6.
sbit förutbetalda = P0 ^ 5.

void command(bit_8);
void data_in(bit_8*);
void initlcd(void);
void display_numeric (bit_8);
void display_int(unsigned int);
void fördröjning (unsigned int);
void display_led (int num, int dly);

void external0 () avbrott 0
{
sensor_variable ++;
charge_pulse ++;
waiting_time_temp = 0;
EX0 = 0;

}

void timer1 () avbrott 3
{

}

void timer0 () avbrott 1
{
TH0 = TH0RELOAD_VALUE;
TL0 = TL0RELOAD_VALUE;
g_byCountOf50ms ++;

IF(charge_pulse==10)
{
charge_variable = charge_variable + 2.
charge_pulse = 0;

}
om (g_byCountOf50ms > = 20)
{
Det innebär 1 sekund (50 ms X 20) är över
g_byCountOf50ms = 0;
beräkna temp avståndet för 1 secound
distance_temp = distance_temp1 = sensor_variable * wheel_diameter;
beräkning av hastigheten i 1 secound
hastighet = distance_temp/0.0166;

distance_temp2 = distance_temp2 + distance_temp1;

beräkning av den totala distace från distance_temp1
avståndet = distance_temp1 + avstånd;
waiting_time_temp ++;
sensor_variable = 0;
IF(distance_fare)

IF(waiting_time_temp>20)
{
waiting_time ++;
waiting_time_chargevariable ++;
}
IF(waiting_time_chargevariable>10)
{
chargevariable ++;
waiting_time_chargevariable = 0;
}

}

}

void main)
{

unsigned char route_selection_variable;
route_selection = 1;
köra = 1;
Prepaid = 1;

initlcd();

Command(0x80);
data_in ("AutomatedDigital");
Command(0xC0);
data_in ("*** Taxi Meter ***");
Command(0x90);
data_in ("Pres * att lista");
Command(0xd0);
data_in ("Pres # att köra");

TMOD = 0X01;
TCON = 0X11;
IE = 0X83;

While(1)
{
IF(route_selection==0)
{
kommando (0x80);
data_in (route1[route_selection_variable]);
kommando (0xc0);
data_in (route2[route_selection_variable]);
kommando (0x90);
data_in (charge[route_selection_variable]);
kommando (0xd0);
data_in (distance1[route_selection_variable]);
route_selection_variable ++;
fördröjning (100);
IF(route_selection_variable==4)
{
route_selection_variable = 0;
}

}
IF(Run==0)
{
run_bit = 1;
initlcd();
IE = 0X83;

}
IF(Prepaid==0)
{
initlcd();
kommando (0x80);
data_in ("förbetalda läge");
kommando (0xc0);
data_in ("Kundnr =");
DelayMs(50);
EData = ReadBYTE(0x00); Läs tillbaka
kommando (0xcb);
display_int(EData);
kommando (0x90);
data_in ("hemliga ID =");
EData = ReadBYTE(0x01); Läs tillbaka
kommando (0x9b);
display_int(EData);

}

IF(run_bit==1)
{
EX0 = 1;
kommando (0x80);
data_in ("Trav Dist =");
kommando (0x8a);
display_int (distans);
kommando (0xc0);
data_in ("Speed =");
kommando (0xc6);
display_int (hastighet);
kommando (0xcb);
data_in ("km/h");
kommando (0x90);
data_in ("vänta tid =");
kommando (0x9a);
display_int (waiting_time);
kommando (0xd0);
data_in ("vänta crgs =");
kommando (0xda);
display_int(chargevariable);
display_led(charge_variable,150);
display_led(waiting_time,150);

}

fördröjning (1000);

}
}

/*--------------------------
initiera LCD ***
--------------------------*/

void initlcd()
{
Command(56);
Command(0x01);
Command(0x02);
Command(12);
}

/*----------------------------
kontroll av flaggan upptagen ***
----------------------------*/

void busy()
{
D7 = 1;
RS = 0;
RW = 1;
While(D7!=0)
{
sv = 0;
sv = 1;
}
}

/*-------------------------
Skicka kommando till LCD ***
-------------------------*/

void command(bit_8 val)
{
Busy();
P1 = val;
RS = 0;
RW = 0;
sv = 1;
sv = 0;
}

/*--------------------------
ange data till LCD ***
--------------------------*/

void data_in(bit_8 *string)
{
bit_8 i.
Busy();
for(i=0;string[i]!='\0';i++)
{
P1 = sträng [i];
RS = 1;
RW = 0;
sv = 1;
sv = 0;
}
}

void display_int(unsigned int i)
{
unsigned char ten_thousands, tusentals, hundratals, tens, kära;
ten_thousands = jag / 10000;
data_in(val[ten_thousands]);
jag = jag % 10000;
tusentals = jag / 1000;
data_in(val[thousands]);
jag = jag % 1000;
hundra = jag / 100;
data_in(val[hundreds]);
jag = jag % 100.
tens = jag / 10;
data_in(val[TENS]);
de = jag % 10.
data_in(val[Ones]);

}

void fördröjning (unsigned int k)
{
unsigned int i, j.
för (jag = 0; jag < = k, i ++)
för (j = 0; j < = 100; j ++);
}

void display_led (int num, int dly) {
int i, n1, n2, n3;

N1 = (int)(num/100); Divisionsoperatorn (53/10 = 5)
NUM = (int) (num % 100).
N2 =(int) num/10.
N2 = (int)(num%10); Modules operatör (53% 10 = 3)

för (jag = 0; jag DSP1 = 0; / / DSP1 aktivera active
DSP2 = 1;
DSP3 = 0;
LED_DSP = num_led [n3];
Delay(1);
DSP2 = 0; DSP2 aktivera active
DSP1 = 1;
DSP3 = 0;
LED_DSP = num_led [n2];
Delay(1);
DSP2 = 0; DSP2 aktivera active
DSP1 = 0;
DSP3 = 1;
LED_DSP = num_led [1].
Delay(1);
}
}
/*
void display_led (int num, int dly) {
int i, n1, n2, n3;

N1 = (int)(num/100); Divisionsoperatorn (321/100 = 3)
NUM = (int)(num%100); Modules operatör (321% 100 = 21)
N2 = (int)(num/10); Divisionsoperatorn (21/10 = 2)
N3 = (int)(num%10);

för (jag = 0; jag DSP1 = 1; / / DSP1 aktivera active
DSP2 = 0;
DSP3 = 0;
LED_DSP = num_led [n3];
Delay(1);
DSP2 = 1; DSP2 aktivera active
DSP1 = 0;
DSP3 = 0;
LED_DSP = num_led [n2];
Delay(1);
DSP3 = 1; DSP2 aktivera active
DSP1 = 0;
DSP2 = 0;
LED_DSP = num_led [n1];
Delay(1);
}
} */
#include
#include
#include "24LC256.h"
#include
/*----------------------------------------------------
port och lite uppdrag för LCD ***
----------------------------------------------------*/
#define TH0RELOAD_VALUE 0X3c
#define TL0RELOAD_VALUE 0Xb0
#define wheel_diameter 5
#define sant 1
#define LED_DSP P2 / / LED-Display (7-segment LED)

TypeDef unsigned char bit_8;

bit_8 g_byCountOf50ms;
kod unsigned char num_led [16] =
{0x3F, 0x06, 0x5B, 0x4F, 0x66, //0,1,2,3,4
0x6D, 0x7D, 0x07, 0x7F, 0x6F, //5,6,7,8,9
0x77, 0x7C, 0x39, 0x5E, 0x79, //A,b,C,d,E
0x71}.

unsigned char sensor_variable, hastighet, switch_inc_variable;
unsigned char waiting_time_chargevariable, charge_pulse;
unsigned char EData;
float distance_temp;
unsigned int avstånd = 0, distance_temp2 = 0, distance_temp1;
unsigned int waiting_time_temp, waiting_time, chargevariable, charge_variable = 8;
lite distance_inc_flag, switch_mode_flag, change_status_flag, device1_flag, device2_flag, device3_flag, device4_flag, device5_flag, device6_flag, device7_flag, device8_flag;
lite run_bit;

kod bit_8 * val [] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}; siffriga array
kod unsigned char * route1 [] = {"MP nagar", "MP nagar", "MP nagar", "MP nagar", "MP nagar"};
kod unsigned char * route2 [] = {"5-No Stop", "Arera Colony", "T T Nagar", "Ayodhya", "Piplani"};
kod unsigned char * ladda [] = {"Max Charge = 50Rs","Max Charge = 60Rs","Max Charge = 200Rs","Max Charge = 200Rs","Max Charge = 60Rs"};
kod unsigned char * distance1 [] = {"MaxDistance = 15 km","MaxDistance = 25 km","MaxDistance = 30 km","MaxDistance = 35 km","MaxDistance = 13 km"};
sbit rs = P0 ^ 0; Registrera dig väljer du port 3,5
sbit rw = P0 ^ 1; läsa/skriva är port 3.4
sbit sv = P0 ^ 2; Aktivera är port 3.3
sbit d7 = P1 ^ 7; upptagen flaggan är port 1,7
sbit DSP1 = P0 ^ 3; DSP1 aktiverar (aktiv låg nivå)
sbit DSP2 = P0 ^ 4; DSP2 aktiverar (aktiv låg nivå)
sbit DSP3 = P0 ^ 5. DSP3 aktiverar (aktiv låg nivå)
sbit Dot_Point = P2 ^ 7;
sbit route_selection = P0 ^ 7;
sbit kör = P0 ^ 6.
sbit förutbetalda = P0 ^ 5.

void command(bit_8);
void data_in(bit_8*);
void initlcd(void);
void display_numeric (bit_8);
void display_int(unsigned int);
void fördröjning (unsigned int);
void display_led (int num, int dly);

void external0 () avbrott 0
{
sensor_variable ++;
charge_pulse ++;
waiting_time_temp = 0;
EX0 = 0;

}

void timer1 () avbrott 3
{

}

void timer0 () avbrott 1
{
TH0 = TH0RELOAD_VALUE;
TL0 = TL0RELOAD_VALUE;
g_byCountOf50ms ++;

IF(charge_pulse==10)
{
charge_variable = charge_variable + 2.
charge_pulse = 0;

}
om (g_byCountOf50ms > = 20)
{
Det innebär 1 sekund (50 ms X 20) är över
g_byCountOf50ms = 0;
beräkna temp avståndet för 1 secound
distance_temp = distance_temp1 = sensor_variable * wheel_diameter;
beräkning av hastigheten i 1 secound
hastighet = distance_temp/0.0166;

distance_temp2 = distance_temp2 + distance_temp1;

beräkning av den totala distace från distance_temp1
avståndet = distance_temp1 + avstånd;
waiting_time_temp ++;
sensor_variable = 0;
IF(distance_fare)

IF(waiting_time_temp>20)
{
waiting_time ++;
waiting_time_chargevariable ++;
}
IF(waiting_time_chargevariable>10)
{
chargevariable ++;
waiting_time_chargevariable = 0;
}

}

}

void main)
{

unsigned char route_selection_variable;
route_selection = 1;
köra = 1;
Prepaid = 1;

initlcd();

Command(0x80);
data_in ("AutomatedDigital");
Command(0xC0);
data_in ("*** Taxi Meter ***");
Command(0x90);
data_in ("Pres * att lista");
Command(0xd0);
data_in ("Pres # att köra");

TMOD = 0X01;
TCON = 0X11;
IE = 0X83;

While(1)
{
IF(route_selection==0)
{
kommando (0x80);
data_in (route1[route_selection_variable]);
kommando (0xc0);
data_in (route2[route_selection_variable]);
kommando (0x90);
data_in (charge[route_selection_variable]);
kommando (0xd0);
data_in (distance1[route_selection_variable]);
route_selection_variable ++;
fördröjning (100);
IF(route_selection_variable==4)
{
route_selection_variable = 0;
}

}
IF(Run==0)
{
run_bit = 1;
initlcd();
IE = 0X83;

}
IF(Prepaid==0)
{
initlcd();
kommando (0x80);
data_in ("förbetalda läge");
kommando (0xc0);
data_in ("Kundnr =");
DelayMs(50);
EData = ReadBYTE(0x00); Läs tillbaka
kommando (0xcb);
display_int(EData);
kommando (0x90);
data_in ("hemliga ID =");
EData = ReadBYTE(0x01); Läs tillbaka
kommando (0x9b);
display_int(EData);

}

IF(run_bit==1)
{
EX0 = 1;
kommando (0x80);
data_in ("Trav Dist =");
kommando (0x8a);
display_int (distans);
kommando (0xc0);
data_in ("Speed =");
kommando (0xc6);
display_int (hastighet);
kommando (0xcb);
data_in ("km/h");
kommando (0x90);
data_in ("vänta tid =");
kommando (0x9a);
display_int (waiting_time);
kommando (0xd0);
data_in ("vänta crgs =");
kommando (0xda);
display_int(chargevariable);
display_led(charge_variable,150);
display_led(waiting_time,150);

}

fördröjning (1000);

}
}

/*--------------------------
initiera LCD ***
--------------------------*/

void initlcd()
{
Command(56);
Command(0x01);
Command(0x02);
Command(12);
}

/*----------------------------
kontroll av flaggan upptagen ***
----------------------------*/

void busy()
{
D7 = 1;
RS = 0;
RW = 1;
While(D7!=0)
{
sv = 0;
sv = 1;
}
}

/*-------------------------
Skicka kommando till LCD ***
-------------------------*/

void command(bit_8 val)
{
Busy();
P1 = val;
RS = 0;
RW = 0;
sv = 1;
sv = 0;
}

/*--------------------------
ange data till LCD ***
--------------------------*/

void data_in(bit_8 *string)
{
bit_8 i.
Busy();
for(i=0;string[i]!='\0';i++)
{
P1 = sträng [i];
RS = 1;
RW = 0;
sv = 1;
sv = 0;
}
}

void display_int(unsigned int i)
{
unsigned char ten_thousands, tusentals, hundratals, tens, kära;
ten_thousands = jag / 10000;
data_in(val[ten_thousands]);
jag = jag % 10000;
tusentals = jag / 1000;
data_in(val[thousands]);
jag = jag % 1000;
hundra = jag / 100;
data_in(val[hundreds]);
jag = jag % 100.
tens = jag / 10;
data_in(val[TENS]);
de = jag % 10.
data_in(val[Ones]);

}

void fördröjning (unsigned int k)
{
unsigned int i, j.
för (jag = 0; jag < = k, i ++)
för (j = 0; j < = 100; j ++);
}

void display_led (int num, int dly) {
int i, n1, n2, n3;

N1 = (int)(num/100); Divisionsoperatorn (53/10 = 5)
NUM = (int) (num % 100).
N2 =(int) num/10.
N2 = (int)(num%10); Modules operatör (53% 10 = 3)

för (jag = 0; jag DSP1 = 0; / / DSP1 aktivera active
DSP2 = 1;
DSP3 = 0;
LED_DSP = num_led [n3];
Delay(1);
DSP2 = 0; DSP2 aktivera active
DSP1 = 1;
DSP3 = 0;
LED_DSP = num_led [n2];
Delay(1);
DSP2 = 0; DSP2 aktivera active
DSP1 = 0;
DSP3 = 1;
LED_DSP = num_led [1].
Delay(1);
}
}
/*
void display_led (int num, int dly) {
int i, n1, n2, n3;

N1 = (int)(num/100); Divisionsoperatorn (321/100 = 3)
NUM = (int)(num%100); Modules operatör (321% 100 = 21)
N2 = (int)(num/10); Divisionsoperatorn (21/10 = 2)
N3 = (int)(num%10);

för (jag = 0; jag DSP1 = 1; / / DSP1 aktivera active
DSP2 = 0;
DSP3 = 0;
LED_DSP = num_led [n3];
Delay(1);
DSP2 = 1; DSP2 aktivera active
DSP1 = 0;
DSP3 = 0;
LED_DSP = num_led [n2];
Delay(1);
DSP3 = 1; DSP2 aktivera active
DSP1 = 0;
DSP2 = 0;
LED_DSP = num_led [n1];
Delay(1);
}
} */

Se Steg
Relaterade Ämnen

DIY Digital vakuum mätare

Här är instruktionerna på hur till bygga din egen digitala vakuum mätare. Varför vill du en vakuum mätare? Om gör din egen underhåll på din motorcykel som synkroniserar förgasare eller justera de spjäll organ detta verktyg gör jobbet lättare.De plane...

Arduino powered digital puls mätare

I detta instructable, jag ska visa hur man replikera mitt PIC16F628A baserade puls mätare projekt genom att använda Arduino. Detta projekt använder en Arduino Uno styrelse, en lätt puls Plugin sensoroch en 4-siffrig SPI sju segment LED display modul....

Digital kapacitans mätare

Detta projekt kan du mäta kondensatorer i en ensam rad åtgärd från 0.000pF till 1000uF. Det vill säga kommer en 16 x 2 LCD-Display visar en enda skala från 0.000pF till 1000uF vars huvudsakliga komponenter blir en Arduino Uno och en 16 X 2 LCD-Displa...

Arduino Ohm mätare med LCD-

Detta Instructable visar dig hur man gör en Digital Ohm mätare med Arduino.This Ohm mätare är mycket exakt... och helt DIY.Steg 1: Samla allt material.1) Arduino UNO (eller någon annan Arduino)2) bakbord3) 16 x 2 LCD uppvisning4) hoppare ledningar5)...

Raspberry Pi - TMD26721 infraröd Digital närhet detektor Python Tutorial

TMD26721 är en infraröd digital närhet detektor som ger en komplett närhet upptäckande och digitala gränssnitt logik i en enda 8-pin surface mount-modul. Avståndskontrollen inkluderar bättre signal-brus och noggrannhet. Ett närhet offset register kan...

DIY kapacitans mätare

En kapacitans mätare är en elektronisk testutrustning används för att mäta kapacitans, främst av diskreta kondensatorer. Alla elektronik hobby & ingenjör måste ha kapacitans mätare. En kapacitans mätare är inte mycket billig. I detta instructables ja...

Introduktion till en digital remspänningen gauge.

Eftersom jag har mer eller mindre gjort full bil underhåll på min egen, jag alltid velat ha en digital remspänningen mäta för att se min accessoarer bälten installerades korrekt. Kommer den landtek btt2880 jag såg på Amazon för mindre än 300usd. Den...

Raspberry Pi - TMD26721 infraröd Digital närhet detektor Java Tutorial

TMD26721 är en infraröd digital närhet detektor som ger en komplett närhet upptäckande och digitala gränssnitt logik i en enda 8-pin surface mount-modul. Avståndskontrollen inkluderar bättre signal-brus och noggrannhet. Ett närhet offset register kan...

Lätta elbil: En passagerare @ 15mph, 210# Curb vikt

Jag designade och byggde denna roliga och framgångsrika ljus elbil för flera år sedan. Jag just nu lägga ut den på "Instructables" och kommer att lägga till fler steg, beskriver konstruktionen, i de närmaste veckorna.Använd länken till mitt webb...

En fristående Data logga vindmätaren

jag älskar samla in och analysera uppgifter. Jag älskar också bygga elektroniska prylar. Ett år sedan när jag upptäckte de Arduino produkterna, jag omedelbart tänkte, "Jag vill samla in miljödata." Det var en blåsig dag i Portland, OR, så jag be...

12 volt DC Solar strömförsörjning

här kommer jag visa dig hur jag använde återvunnet gräsmatta/trädgård sol ljus för att göra en 12 volt ström försörjning/laddare.Jag tror jag har ca $8.00 i det hittills!Steg 1: Vad slutresultatet ser ut Okej låter komma igång.Jag när på en Återanvän...

ARK Rocker

ARK vippan är konceptet att utforska gränslandet mellan modern tillverkningsteknik med tidlösa hantverk tekniker.Varje del av denna gungstol gjordes gjordes med digital tillverkning och modellering av programvara genom Autodesk och Pier 9 verkstaden....

AC drivs vita LED cirkulär Skärmförstoraren arbete lampa

,Använd ljusa lysdioder ersätta fluorescerande cirkulär ljus förstoringsglas fungerar lampan. Varde ljus!En medellång svårigheter Instructable att fixa en cirkulär Skärmförstoraren arbete lampa genom att konvertera till en mycket låg energiförbruknin...

Anpassa en telefonlur till en mobiltelefon

av Bill Reeve (billreeveAnpassad för instructables av musen (mouse.reeveVarning: Det förfarande som beskrivs här kanske inte fungerar för dig - det är en risk som du måste ta. Om det inte fungerar, eller om du bryter mot något, det är inte mitt fel -...

Fifth Element Stones

Dags att rädda världen... Väl i detta fall med lite ljus!Inte som är frågor men är lite roligt att se dessa färger härmade i windows och android starta upp sekvenser. Du inte kan bara slå bra skrivet och kvalitet Science Fiction!För det första var va...

Bärbar 20w sol laddare

Jag har tagit ut 18650 uppladdningsbara batterier från en liten 12v batteri sol laddare för ett par månader nu. Inte imponerad av den avgift som, spendera en hel solig dag bara att kanske ha en enda 18650 batteri laddas. Jag bestämde mig att kliva up...

Segmenterad trä Cryptex

Sedan lanseringen av Dan Brown's The DaVinci-koden blivit Cryptex en ikonisk pussel. Medan den här inte kommer att förstöra sig själv, kommer det säkert hålla sin del av hemligheter. Detta projekt syftar främst till att bli en övning i segmenterad wo...

Kapacitiv markfuktighet mäta (med I2C)

Mycket har skrivits om hur man mäter markfuktighet och framför allt på vilken sensor du använder.Med den enkla motstånd mäta är den största frågan korrosion av sensorn, inte bara eftersom det är i kontakt med jorden men också eftersom det är en DC nu...

Hög spänning nätaggregat (0 - 1 500 V)

Jag behövde en 1-2 KV strömförsörjning för kapillärelektrofores experiment. Serendipitously, såg jag ett par av hög spänning kraftmoduler utbudet i en hög med elektronik skräp på De Anza loppmarknad i Cupertino.Jag tog en helg att bygga ett lab kvali...