Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
I. INTRODUCTION
Pedal power is the transfer of energy from a human source Figure 2.1: Arduino UNO.
using a foot pedal and crank system. This technology is most
used for transportation and has been used to propel bicycles 2.2 Hall Effect Sensor
for over a hundred years. Less commonly, pedal power is used
to power agricultural and hand tools and even to generate Hall Effect Sensors are devices which are activated by an
electricity. Some applications include pedal powered laptops, external magnetic field. We know that a magnetic field has two
pedal powered grinders and pedal powered water wells. Some important characteristics flux density, (B) and polarity (North
third world development projects currently transform used and South Poles). The output signal from a Hall effect sensor
bicycles into pedal powered tools for sustainable development. is the function of magnetic field density around the device.
The articles on this page are about the many wonderful When the magnetic flux density around the sensor exceeds a
applications for pedal power technology. certain pre-set threshold, the sensor detects it and generates an
output voltage called the Hall Voltage
The main objective of this study is to provide a relationship
between alternative energy and physical activity to sustain or Hall Effect Sensors consist basically of a thin piece of
improve health and fitness rectangular p-type semiconductor material such as gallium
arsenide (GaAs), indium antimonide (InSb) or indium arsenide
II. REVIEW OF RELATED LITERATURE
(InAs) passing a continuous current through itself. When the
device is placed within a magnetic field, the magnetic flux
2.1 Arduino Uno lines exert a force on the semiconductor material which
A microcontroller board based on the ATmega328 deflects the
(datasheet). It has 14 digital input/output pins (of which 6 can
be used as PWM outputs), 6 analog inputs, a 16 MHz ceramic
resonator, a USB connection, a power jack, an ICSP header,
and a reset button. It contains everything needed to support the
microcontroller; simply connect it to a computer with a USB
cable or power it with an AC-to-DC adapter or battery to get
started. The Uno differs from all preceding boards in that it
does not use the FTDI USB-to-serial driver chip. Instead, it
features the Atmega16U2 (Atmega8U2 up to version R2)
programmed as a USB-to-serial converter.
III. METHODOLOGY
A DC motor is any of a class of rotary electrical machines 3.1 Conceptual Framework of the System
that converts direct current electrical energy into mechanical
energy. The most common types rely on the forces produced
by magnetic fields. Nearly all types of DC motors have some
internal mechanism, either electromechanical or electronic, to
periodically change the direction of current in part of the
motor.
Figure 3.1 Conceptual Framework of the System
(𝑟𝑒𝑣𝐶𝑜𝑢𝑛𝑡 ∗ 𝐶)
𝑐𝑢𝑟𝑟𝑒𝑛𝑡𝐷𝑖𝑠𝑡𝑎𝑛𝑐𝑒 =
1000
d. Speed Computation
Figure 3.2 Process Flow Chart To compute for the speed, we first need to know the
time that it takes to complete a revolution. This is also
done by the hall sensor and the Arduino code which
3.3 Working Principle records the current time as well as the last time the sensor
has been triggered. After having this, the system will now
a. Circuit Diagram compute the current speed using the formula:
Our circuit diagram consists of LCD as well as
voltage sensor and push buttons. The push buttons are 360000 𝐶
𝑆𝑝𝑒𝑒𝑑 = ( )∗( )
labeled as PAUSE/RESUME and toggle DISPLAY 𝑟𝑒𝑣𝑇𝑖𝑚𝑒 1000
MODE. Pressing these buttons will lead to an action
which will change what is currently being displayed in revTime = time it takes for 1 revolution
the LCD. C = circumference of the wheel
(𝑐𝑢𝑟𝑟𝑒𝑛𝑡𝐷𝑖𝑠𝑡𝑎𝑛𝑐𝑒)
𝐴𝑣𝑒. 𝑆𝑝𝑒𝑒𝑑 = (3600000)
𝑐𝑢𝑟𝑟𝑒𝑛𝑡𝑇𝑖𝑚𝑒
Voltmeter Sensor 1 60 Figure 3.4 Sample Charging thru the smartphone app
With the series of tests and calibrations that we performed to boolean wheelTurningShown = LOW;
record the data; we recorded a trend of data which gives us the unsigned long wheelTurningStartTime = 0;
information to With the series of tests and calibrations that we
performed to record the data; we can safely assume that the boolean cycleSafelyShown = LOW;
use of pedal-powered generator to charge your smartphone can unsigned long cycleSafelyStartTime = 0;
be easily executed with the right materials and the right codes.
Although the only materials that you will need for the charging unsigned long lastRevolutionStartTime = 0;
side are just the bike, dc motor, and converter, we think that unsigned long revolutionTime = 0;
the information provided is not enough so we tried to innovate
this basic system more by adding speedometers, odometers, int currentDisplayMode = 0;
voltage sensors, as well as calculating your calories burned for int showsession = 0;
the duration since cycling is one way of exercising. This means int sessionCurrentlyShown = 100;
that the project can be beneficial for those who are always int currentsession = 0;
working out and wants to charge their phone as they work out
since sometimes, the smartphone is used for listening to music float currentDistance;
while working out. unsigned long currentDuration;
int currentMaximumKPH;
We recommend using an actual gym stationary bike exercise int currentAverageKPH;
to feel the resistance when pedaling since in our system, we int currentKPH;
didn’t add resistance to the wheels. Also, we recommend using float currentCalories;
a more accurate or high-frequency hall effect sensor since in
our system, we had to compensate for the slowness of our hall
sensor which is A3144 Hall Sensor by adding more magnets float arrayDistance[100];
on the wheels. Also, having a bigger motor with more unsigned long arrayDuration[100];
windings will help in achieving more current easily without int arrayMaximumKPH[100];
having to put in too much effort pedaling. int arrayAverageKPH[100];
float arrayCalories[50];
float km = 0.00;
float kph = 0.00;
int intHours;
int intMinutes; // Compute millis it took for this latest revolution
int intSeconds; if (lastRevolutionStartTime > 0) {
resetsessionVariables(); // We will need to show data for session which was just
currentDisplayMode = 1; finished
} showsession = currentsession;
currentDisplayMode = 3;
// Otherwise pause is not currently active so we need to
save session/period data and activate pause // Set out-of-bounds value to sessionCurrentlyShown to
else { force session data to be shown
sessionCurrentlyShown = 100;
paused = HIGH; }
}
// Calculate duration }
currentDuration = currentTime - sessionStartTime; lastPauseButton = currentPauseButton;
// If session duration is less than 2 seconds (which means // Read DISPLAY MODE push button
user pressed the pause button while "CYCLE SAFELY!" currentDisplayModeButton =
message debounce(lastDisplayModeButton, displayModeButton);
// was shown) then do not store the session/ignore it if (lastDisplayModeButton == LOW &&
if (currentDuration < 2000) { currentDisplayModeButton == HIGH) {
currentsession--;
} // If "PRESS BUTTON TO START" message has been
// Otherwise store the session showing then we now need to start 1st session/period
else { if (startShown) {
// Update display only if we need to show data for different if (intMinutes < 10) {
session to that currently shown lcd.print("0");
// this way display is not constantly cleared and refreshed }
with same data which would lcd.print(intMinutes);
// cause display to flicker and is not needed anyway as data
is not changing lcd.print(":");
if (sessionCurrentlyShown != showsession) {
if (intSeconds < 10) {
sessionCurrentlyShown = showsession; lcd.print("0");
}
lcd.clear(); lcd.print(intSeconds);
lcd.setCursor(10, 0); }
lcd.print("SUMMARY"); }
}
lcd.setCursor(0, 0); }
if (showsession == 0) {
lcd.print("TOTAL"); // Compute hours, minutes and seconds for given duration
} expressed in milliseconds
else { void computeHMS(unsigned long duration) {
lcd.print("SESSION ");
lcd.print(showsession); float floatHours;
} float floatMinutes;
lcd.setCursor(0, 1); float floatSeconds;
lcd.print("SPEED");
lcd.setCursor(0, 2); intHours = 0;
lcd.print("Avg"); intMinutes = 0;
lcd.setCursor(4, 2); intSeconds = 0;
lcd.print(arrayAverageKPH[showsession]);
if (arrayAverageKPH[showsession] < 10) { if (duration >= 1000) {
lcd.print(" "); floatSeconds = duration / milliSecondsInSecond % 60;
} intSeconds = floatSeconds;