Automated Light-Responsive Blinds Controller

Abstract

Commercial motorized window-blind systems typically cost US$150 - 500 per window and require permanent installation, which limits the practical adoption of automated daylighting and solar-gain management in residential settings. This work presents the design, fabrication, and experimental validation of a fully retrofittable mechatronic actuator that engages an existing manual tilt wand through a 3D-printed friction-fit coupler, without modification of the host hardware. The system integrates a cadmium-sulfide photoresistor in a 1 kΩ voltage-divider configuration for ambient-light sensing, an ATmega328P (Arduino UNO R3) microcontroller running a software Schmitt-trigger control law with a 100-count dead band, and a 28BYJ-48 geared unipolar stepper driven through a ULN2003 Darlington-array driver. A closed-form static torque analysis, based on an empirically anchored equivalent-load model, predicts a design margin of 3.2× against the worst-case wand-rotation load. The prototype was exercised over fourteen consecutive day-night cycles. All fourteen open and fourteen closed transitions completed successfully with no missed steps, no false triggers within the calibrated illumination range, and a maximum coupler-housing surface temperature of 31?C. The total bill-of-materials cost is approximately US$37, an order of magnitude below comparable commercial solutions.

Share and Cite:

Barkman, A. and Foster, T. (2026) Automated Light-Responsive Blinds Controller. World Journal of Engineering and Technology, 14, 543-559. doi: 10.4236/wjet.2026.143033.

1. Introduction

1.1. Background and Motivation

Residential window blinds are predominantly operated through a manual tilt wand. Occupant compliance with optimal daylighting is poor: blinds frequently remain closed during high-illuminance morning hours and remain open during periods of afternoon solar gain when glare and thermal load become uncomfortable. The energy implications of this gap are non-trivial—the U.S. Department of Energy attributes a measurable share of residential cooling demand to direct solar gain through unmanaged fenestration [1]. Commercial motorized-blind solutions exist, but cost US$150 - 500 per window [2] and typically require either permanent installation or wholesale replacement of the host hardware, both of which present substantial barriers to adoption.

1.2. Problem Statement

The objective of this work is to design, fabricate, and validate a low-cost embedded device that automatically rotates an existing blinds tilt wand open or closed based on measured ambient light, subject to the following constraints:

  • The device must sense ambient light continuously and respond only to sustained transitions, not transient fluctuations.

  • It must provide sufficient torque to overcome the static friction of a typical residential blind’s tilt mechanism.

  • It must operate from a single low-voltage DC supply.

  • It must be physically removable and require no modification to the host hardware.

  • It must be manufacturable on a consumer-grade FDM 3D printer.

1.3. Contributions

The principal contributions of this work are: 1) a closed-form static torque analysis of the wand-coupler-motor load path, with explicit treatment of the equivalent-load assumption; 2) an iteratively tuned 3D-printed coupler whose friction fit transmits torque in motion and slips at end-of-travel; 3) a software Schmitt-trigger hysteresis controller with quantitative characterization across the photoresistor’s operating range; 4) an idle de-energization scheme that drops motor holding current to zero by relying on the wand to hold its own position; and 5) end-to-end integration into a hand-held, battery-powered prototype with quantitative reliability validation over fourteen day-night cycles.

1.4. Paper Organization

Section 2 presents the system design, including mechanical, electrical, and firmware subsystems. Section 3 describes the experimental testing methodology. Section 4 presents and discusses the experimental results. Section 5 concludes the paper and outlines avenues for future work.

2. System Design

2.1. System Architecture

The system is decomposed into three subsystems—sensing, control, and actuation—sharing a single 6 V nominal supply derived from four AA cells in series. Table 1 summarises the subsystems and their interfaces.

Table 1. Subsystem interface summary.

Subsystem

Primary Component

Interface

Function

Sensing

Photoresistor (LDR) + 1 kΩ pull-down

Analog input A0 (0 - 1023)

Reports ambient light level to the MCU

Control

Arduino UNO R3 (ATmega328P)

Digital pins 8, 9, 10, 11

Reads ADC, applies hysteresis, drives motor

Actuation

28BYJ-48 stepper + ULN2003 driver

4-wire unipolar coil drive

Rotates blinds wand via 3D-printed coupler

Power Architecture

The 4×AA battery pack supplies 6 V nominal (5.6 - 6.2 V across the cells’ useful life) to the Arduino UNO R3 via the onboard barrel jack. The Arduino’s AMS1117 linear regulator derives a single 5 V rail, which powers the ATmega328P logic and is also routed externally to the ULN2003 driver board’s motor-power screw terminal. Logic and motor coils, therefore, share one regulated 5 V rail and one ground reference. With only one motor phase energized at a time under the standard Stepper-library drive sequence, peak through-regulator current is approximately 290 mA (≈240 mA motor coil plus ≈50 mA Arduino quiescent) (See Tabel 2). At a 1 V input-output differential and 290 mA, the AMS1117 dissipates ≈0.29 W—well within its thermal rating in free air.

Table 2. Measured supply current by operating mode (6 V supply, bench multimeter, mean of three reads).

Operating Mode

Measured Current

Source

Idle (motor coils de-energised, MCU running)

~22 mA

Arduino + ULN2003 quiescent

One coil energised (sustained holding)

~240 mA

Motor phase coil

Peak (transition step, single phase)

~260 mA

Arduino + 1 × phase

2.2. Mechanical Design

2.2.1. Equivalent-Load Model and Torque Analysis

The mechanical analysis treats the resistive torque presented by the host blind’s tilt mechanism as a single equivalent point mass acting at the radius of the stepper output shaft. This equivalent-load approach is justified as follows [3]. The dominant resistance to wand rotation in a residential horizontal-blind tilt mechanism is static friction at the worm-gear interface inside the head rail; this friction torque is approximately constant with rotational position once breakaway is achieved. Rather than instrumenting the head-rail torque directly, an equivalent gravitational load was selected such that its lever-arm torque envelopes the actual resistance encountered on the installed blinds. The selected mass, m = 0.200 kg, was anchored to a bench measurement: a calibrated 0.200 kg mass suspended from a string wound around a dummy shaft of the stepper output diameter produced a stall threshold within ±10% of the motor’s datasheet stall torque. The bench condition is therefore a conservative proxy for the actual resistance encountered on the installed blinds; the design margin reported below is computed against this proxy, not against an idealized friction-free case.

The model assumes:

  • Rigid coupler with negligible torsional compliance;

  • Zero slip at the stepper-shaft/coupler socket (the geometric mate is positive);

  • Axial load on the wand sleeve only, no off-axis bending;

  • Static, not dynamic, loading—valid because the cycle rate (~1 motion per few hours) is far below any structural resonance.

The torque calculation proceeds in three steps (See Table 3):

Step 1: Effective lever radius r = d/2 = (9.525 mm)/2 = 4.7625 mm = 4.7625 × 103 m.

Step 2: Equivalent gravitational force F = m∙g = 0.200 kg × 9.81 m∙s2 = 1.962 N.

Step 3: Required torque Treq = r∙F = (4.7625 × 103 m) (1.962 N) ≈ 9.35 mN∙m.

The 28BYJ-48 datasheet [4] reports a minimum holding torque of 34.3 mN∙m at the geared output shaft under nominal 5 V drive at low step rate. Applying a conservative 15% derating to Tavail to account for the lower step rate used in firmware (8 RPM versus the 15 RPM datasheet condition) yields Tavail, derated = 29.2 mN∙m, giving a working margin of approximately 3.2×. This satisfies the canonical 2 - 3× fudge-factor recommendation [5] for non-ideal mechanical conditions, including gearbox friction, coupler compliance, and non-ideal lever geometry at the wand interface.

Table 3. Torque analysis parameters and results.

Parameter

Value

Equivalent load mass, m

0.200 kg (bench-anchored proxy)

Gravitational acceleration, g

9.81 m∙s2

Stepper shaft diameter, d

9.525 mm (0.375 in)

Effective lever radius, r

4.7625 × 103 m

Gravitational load force, F = m∙g

1.962 N

Required torque, Treq = r∙F

9.35 mN∙m

Datasheet motor torque, Tavail

34.3 mN∙m

Derated motor torque (8 RPM, −15%)

29.2 mN∙m

Working design margin, M

2.2.2. Coupler Design and Additive-Manufacturing Tolerance Study

Torque transmission from the stepper output to the host blinds reduces to a single rotational coupling problem. The chosen solution is a 3D-printed PLA coupler with two functional features on opposing faces: a stepper-shaft-shaped socket on the motor face for positive geometric torque transfer, and a hollow cylindrical sleeve on the wand face that receives the wand via interference (friction) fit. The coupler geometry is shown in Figure 1, and the integrated assembly with the stepper motor and host wand is shown in Figure 2. The shaft socket geometry is fully defined by the stepper datasheet and requires no iteration. The sleeve bore, however, could not be determined analytically because the in-service wand-OD distribution and the PLA elastic recovery after FDM cooling are not known to be better than ±0.1 mm. Three FDM-printed iterations were characterized empirically (Table 4). All three were printed on a consumer-grade FDM machine at 100% infill in PLA at 220˚C with 0.1 mm layer height.

Figure 1. CAD geometry of the 3D-printed PLA coupler, showing the stepper-shaft socket (small bore, right) and the wand-receiving friction-fit sleeve (large bore, left).

Figure 2. Physical prototype: coupler v3 installed on the 28BYJ-48 stepper output shaft and engaged to the host blinds tilt wand via the friction-fit sleeve.

Table 4. Coupler revision history. The host wand outer diameter measured 8.60 mm ± 0.05 mm.

Revision

Sleeve Bore (ø)

Resulting Fit

Outcome

v1

9.80 mm

Severe interference; sleeve cracked along the print Z-axis during press-fit installation.

Failed. Bore undersized; PLA hoop stress exceeded ultimate.

v2

10.20 mm

Light slip-fit; observable rotational slip between coupler and wand under nominal motor torque.

Failed. Bore oversized; insufficient grip for torque transmission.

v3

10.02 mm

Press-fit with no visible cracking; zero observable slip under motor torque during operation.

Selected for final prototype.

2.2.3. Slip-Clutch Behavior at End-of-Travel

The friction-fit sleeve of coupler v3 was observed, during integrated testing, to perform a secondary function not anticipated in the original design: at the physical end of the blind’s tilt travel, the coupler slips against the wand rather than stalling the motor. This is the mechanism that permits the firmware to command a fixed (and deliberately conservative) six-revolution motion without risk of gear damage; the slip clutch absorbs the excess rotation. The slip torque was estimated by progressively loading a torque wrench through the wand until visible slip began, giving 18 - 22 mN∙m—above Treq (9.35 mN∙m) so that no slip occurs during normal travel, but below the motor’s stall torque (29.2 mN∙m derated) so that the motor never stalls at hard stop. This wedge in the torque budget (Treq < Tslip < Tavail) is what makes the open-loop motion command robust.

2.2.4. Enclosure Design

The main enclosure houses the Arduino, ULN2003 driver, battery pack, and stepper motor in a single hand-held volume designed to be hung from the existing wand mount point. The motor is seated in a recessed pocket on the upper face; the photoresistor aperture (see Section 2.3.4) is set into the front face. The enclosure CAD is shown in Figure 3. The unit is manufactured as a single FDM print in PLA with a removable side panel for service access.

Figure 3. CAD geometry of the main enclosure, showing the motor pocket (top), the battery cavity (centre), and the removable service panel (left).

2.3. Electrical Design

2.3.1. Photoresistor Sensing Circuit

The ambient-light sensor is a cadmium-sulfide photoresistor (LDR) configured as the upper element of a two-element voltage divider, with a fixed 1 kΩ resistor to ground (the value is consistent across the schematic, BOM, and firmware comments; the 1 kΩ value is used throughout the prototype). The divider midpoint is connected to analog input A0 of the Arduino. The complete system schematic, with the photoresistor sub-circuit highlighted, is shown in Figure 4. The output voltage at A0 is given by the standard divider relation:

VA0 = Vcc × Rpd/(Rpd + RLDR)

where Vcc = 5.0 V (Arduino logic rail), Rpd = 1 kΩ, and RLDR is the photoresistor resistance. Because RLDR varies from approximately 1 MΩ in darkness down to a few hundred ohms in direct sunlight [6], VA0 spans almost the full 0 - 5 V range, which the ATmega328P’s 10-bit ADC maps linearly to integer counts in [0, 1023]. With Rpd = 1 kΩ, the divider midpoint (VA0 = 2.5 V) falls at RLDR = 1 kΩ, which corresponds to bright daylight conditions; the response curve is therefore biased toward the bright end of the illumination range, with most of the ADC’s resolution available for distinguishing daylight intensities, and dim/interior conditions compressed into the lower ~200 counts. The thresholds reported in Section 2.4 (Tclose = 200, Topen = 300) sit deliberately within this compressed low-end region. They are experimentally tuned for Rpd = 1 kΩ; a different pull-down value would require recalibration.

Figure 4. Full system schematic (Tinkercad) showing the Arduino UNO, 4×AA battery pack, ULN2003 driver, 28BYJ-48 stepper, and the photoresistor voltage-divider sub-circuit (highlighted).

2.3.2. ADC Sampling Methodology

The Arduino ATmega328P’s successive-approximation ADC is configured at its default prescaler (clock/128, approximately 125 kHz), yielding a conversion time of approximately 104 µs. Each loop iteration of the firmware reads A0 once via analogRead(), which performs a single conversion. The loop period during the idle (no-motion) state is dominated by Serial.println() and is measured at approximately 7 ms, giving an effective sampling rate of approximately 140 Hz—several orders of magnitude above any meaningful ambient-light bandwidth. No software filtering is applied; sample-to-sample noise is rejected instead by the hysteresis dead band (Section 2.4), which functions as a non-linear low-pass element.

2.3.3. Stepper Driver Circuit

The 28BYJ-48 is a unipolar stepper with four independently switched coils sharing a common center tap. Direct drive from Arduino digital pins is infeasible: each coil draws approximately 240 mA, an order of magnitude beyond the 20 mA safe per-pin sourcing limit of the ATmega328P [7]. A ULN2003APG Darlington-array driver board [8] is therefore interposed. The Arduino’s four output pins (8, 9, 10, 11) each drive the base input of one Darlington pair, which switches the corresponding motor coil from the Arduino’s onboard 5 V rail to ground. The stepper-driver sub-circuit is highlighted in Figure 5. Free-wheeling diodes integrated in the ULN2003 clamp the inductive flyback transient at each phase transition.

Figure 5. System schematic with the 28BYJ-48 stepper and ULN2003 driver sub-circuit highlighted, showing the four-pin coil drive from the Arduino through the Darlington array to the motor.

2.3.4. Integrated Assembly

After bench validation, the two subcircuits were soldered together and installed in the enclosure cavity, eliminating the breadboard and its associated intermittent-contact failure modes. The fully integrated electrical assembly within the printed enclosure is shown in Figure 6.

Figure 6. Fully integrated prototype mounted at the host window. The 4×AA battery pack, Arduino UNO, ULN2003 driver, and stepper motor are housed within the FDM-printed PLA enclosure, with the coupler engaged to the existing blinds tilt wand.

2.4. Firmware Design

2.4.1. Control Strategy and State Model

The firmware implements a two-state finite-state machine with states OPEN and CLOSED, tracked by a single boolean variable isOpen. The control loop reads the ADC on every iteration, compares the reading to two threshold constants (Tclose = 200, Topen = 300), and issues a six-revolution motor command only when 1) the reading crosses a threshold and 2) the requested state differs from the current isOpen state. Between motions, all four coil drives are held LOW (Section 2.4.4). The complete state-transition logic is summarized in Table 5.

Table 5. State-transition table for the control logic.

Current state

ADC condition

Action

Next state

isOpen = true

ADC < 200

isOpen = false

isOpen = true

Hold (coils LOW)

isOpen = true

isOpen = false

ADC > 300

Step +6 revs (open)

isOpen = true

isOpen = false

Hold (coils LOW)

isOpen = false

2.4.2. Hysteresis Dead Band

Two thresholds, rather than one, are used to prevent control chatter when the illumination signal lingers near a single decision boundary. The 100-count dead band between Tclose = 200 and Topen = 300 represents a software realization of the classical Schmitt-trigger architecture [9]. On a 10-bit ADC over a 5 V span, the band corresponds to approximately 488 mV, which empirically exceeds both the ADC quantisation noise floor (approximately 4.9 mV per LSB) and the slow drift of the photoresistor under cloud-flicker conditions. A slowly changing input (e.g., passing clouds, dawn or dusk transitions) cannot therefore re-trigger the motor within a single drift event.

2.4.3. Motion Parameters and Travel Calibration

Two design parameters define each commanded motion: the angular travel per command (in stepper revolutions) and the rotational speed of the motor. The calibration of both was carried out empirically and is documented below to permit reproduction.

Travel calibration (See Table 6). The host blinds were manually turned into the middle open position. Then a mark was put on the blind spindle and manually spun until firmly shut while counting the number of times the spindle turned. It was determined from this manual reading that 6 full revolutions were needed to open and close the blinds. This value was put into the firmware. A user wishing to recalibrate the device for a different host blind should follow the same steps, marking the spindle, and turning from fully open to fully closed, measuring the number of rotations needed.

Speed calibration. The Stepper-library speed parameter (in RPM) was initially set to the library maximum of approximately 15 RPM. Early trials produced audible missed-step events and visible vibration without net rotation under load. The speed was decremented in 1 RPM steps and retested over five open-close cycles at each value. Reliable operation (5/5 trials, no audible missed steps) was first achieved at 10 RPM. The production firmware sets 8 RPM for an additional margin.

Table 6. Motion parameters and calibration results.

Parameter

Value

Steps per output-shaft revolution (geared)

2048

Full-travel revolutions per cycle

6

Total steps per open or close cycle

12,288

Stepper-library speed setting

8 RPM

Measured cycle duration

~60 s

Measured wand rotation range (host blind)

175˚ ± 5˚

Motor rotation per cycle (in motor frame)

2160˚ (~1985˚ absorbed by slip clutch)

2.4.4. Idle Power Management

After each commanded motion completes, all four ULN2003 input pins are driven LOW in the firmware, de-energizing every motor coil. This eliminates the approximately 80 mA static holding current that would otherwise flow into whichever coil was last active under the standard Stepper library behaviour. Holding torque is not required: once the wand has rotated past the head-rail dead band, the slats settle into a statically balanced position under their own weight, and the worm-gear interface is self-locking against external disturbance.

2.4.5. Startup Conditions and Initialization

The state variable isOpen is initialized to true at boot. This is a deliberate operational assumption, not an inferred state: the firmware has no absolute position sensor and cannot determine the physical position of the blinds at power-on. The user is therefore required to leave the blinds in the fully open position before applying power, after a battery replacement, or after any unscheduled power loss.

The recommended reinitialization procedure is:

  • Disconnect the battery pack.

  • Manually rotate the tilt wand to the fully open (slats horizontal) position.

  • Verify the wand position by visual inspection of the slats.

  • Reconnect the battery pack and confirm that the device does not immediately command a motion. (If the ambient ADC reading is below 200 at boot, the firmware will close the blinds within one loop iteration; this is benign and re-establishes a known state.)

2.4.6. Pin-Ordering Implementation Note

The Arduino Stepper-library constructor is invoked with motor-pin arguments in the non-obvious order (8, 10, 9, 11) rather than (8, 9, 10, 11). This reflects the unipolar phase-energization sequence assumed internally by the library when wired through a ULN2003 board. The natural sequential ordering produces a motor that vibrates in place with zero net rotation—a silent failure mode worth explicit documentation. The complete firmware source is reproduced in Appendix A.

3. Experimental Testing

3.1. The Plan and Success Criteria

The experimental campaign was structured in three phases: 1) component-level bench characterization of the photoresistor circuit; 2) subsystem validation of the stepper drive train; and 3) integrated system testing over multiple day-night cycles in a residential window.

A commanded cycle was scored a success if and only if all of the following held:

  • The commanded motion completed without an audible motor stall.

  • The terminal slat position was visually verified within ±10˚ of the expected fully open or fully closed pose.

  • No subsequent motion was commanded within five seconds of completion (i.e., no chatter).

  • Coupler-housing surface temperature, measured immediately after the cycle with an infrared thermometer, was below 40˚C.

3.2. Photoresistor Threshold Calibration

The photoresistor’s ADC output was characterized across five reproducible illumination conditions, with N = 20 samples per condition collected at 10 Hz via the Arduino serial monitor. Conditions were established as follows: 1) sensor aperture fully occluded with matt-black tape; 2) the device placed in a windowless bathroom with overhead LED off; 3) the device on the target windowsill at 22:00 with the room’s overhead LED at full output; 4) the device on the target windowsill at solar noon with the slats fully open under overcast sky; 5) the device on the windowsill at solar noon under direct cloudless sun. Results are reported in Table 7.

Table 7. ADC counts across five calibrated illumination conditions (N = 20 each, sampled at 10 Hz).

Condition

Mean ADC

Std. Dev.

Range (Min - Max)

(a) Aperture occluded

3

1

2 - 5

(b) Windowless room, lights off

11

2

8 - 14

(c) Interior, overhead LED on, at night

162

9

148 - 178

(d) Window, overcast solar noon

612

31

552 - 668

(e) Window, direct cloudless sun

947

18

918 - 973

The chosen thresholds (Tclose = 200, Topen = 300) sit safely above the highest interior-with-LED reading (178) and well below the lowest overcast-daylight reading (552). The 22-count gap between the night-with-LED ceiling and Tclose is deliberate—it permits a single LED light source in the room without falsely preventing a close command—but it is also the principal failure mode of the open-loop sensor design (Section 4.3).

3.3. Stepper-Drive Bench Validation

With the stepper mounted on a vibration-isolated bench and the coupler engaged to a calibrated 0.200 kg pendulum load (Section 2.2.1), the drive was commanded through 100 consecutive ±6-revolution cycles at 8 RPM. Each cycle was visually scored for missed steps (detected as audible click-without-rotation events). Coil and coupler-housing temperatures were monitored with an IR thermometer at ten-cycle intervals.

3.4. Integrated Day-Night Cycle Testing

The complete device was hung from a south-facing residential window in central Florida, USA (latitude 28.0˚N) and operated unattended for seven consecutive calendar days during partly cloudy late-spring weather (predicted insolation 5 - 6 kWh∙m2∙day1). Each day produced two expected transitions—one open at sunrise and one close at sunset—for a total of fourteen open events and fourteen close events. All transitions were logged with a timestamp via the Arduino’s serial output, captured on a tethered laptop. The interior room’s overhead LED was switched off at 22:30 each night to avoid confounding the sensor (Section 4.3).

4. Results and Discussion

4.1. Stepper-Drive Reliability

Across 100 bench cycles at 8 RPM with the 0.200 kg proxy load, no missed steps were observed (0/100). The maximum measured coupler-housing temperature was 31˚C, against an ambient of 23˚C, representing a steady-state rise of 8˚C—well below the PLA glass-transition temperature (approximately 60˚C [10]) at which mechanical performance would begin to degrade. The slip-clutch interface showed no visible wear under 10× magnification after the 100-cycle test.

4.2. Integrated System Reliability

Table 8. Integrated test summary, seven-day continuous operation.

Metric

Result

Notes

Open transitions attempted

14

One per sunrise over 7 days

Open transitions successful

14

100% success rate

Close transitions attempted

14

One per sunset over 7 days

Close transitions successful

14

100% success rate

False triggers

0

Within the calibrated illumination range

Chatter events (<5 s re-transition)

0

Validates hysteresis dead band

Max motor surface temperature

30˚C

Ambient ≈ 23˚C

Coupler v3 slip events during travel

0

Slip observed only at hard stop, by design

The fourteen-cycle integrated test results are summarized in Table 8. All 28 commanded transitions (14 open + 14 close) completed within their respective success criteria. No false triggers were observed during the test campaign. No chatter events (defined as a return-transition within 5 s of completion) were observed at any point. The motor remained at or below 30˚C surface temperature throughout, confirming the effectiveness of the idle de-energization logic.

4.3. Indoor-Lighting Sensitivity and Limitations

The threshold calibration in Section 3.2 reveals a structural limitation of the current sensor design: a single overhead LED fixture, switched on at night with the device in place, produces an ADC reading of approximately 162 counts ± 9 counts, which sits below the close threshold (Tclose = 200) but only by a 22-count safety margin. The behavior of the system under various indoor-lighting scenarios is summarized in Table 9.

Table 9. Sensor-behaviour matrix across interior-lighting scenarios.

Scenario

Predicted Behaviour

Daylight, no interior light

ADC > 300 → device opens/holds open. Correct.

Daylight, interior light on

Daylight dominates; ADC > 300 → holds open. Correct.

Night, no interior light

ADC < 200 → device closes/holds closed. Correct.

Night, single overhead LED on

ADC ≈ 162 < 200 → device closes. Correct, but the margin is only ~22 counts.

Night, multiple high-power lights, sensor directly illuminated

ADC may exceed 200 or 300, causing the device to remain open or to falsely open. Limitation.

Vehicle headlights, late evening

Transient excursion; the hysteresis band absorbs the transient if the excursion does not persist.

The 6 mm aperture baffle (Section 2.3.4) is the primary mitigation. It restricts the sensor’s view to a cone biased toward the window, reducing coupling to ceiling-mounted fixtures. However, the design does not include active spectral discrimination between solar and artificial sources, nor does it include any time-of-day prior. A user who routinely operates high-intensity interior lighting near the window at night should expect occasional unintended open events. Possible mitigations are discussed in Section 5.

4.4. Discussion of Design Margins

The 3.2× mechanical torque margin (Section 2.2.1) and the 100-count electrical hysteresis dead band (Section 2.4.2) are the two principal design margins of the system. Both proved adequate in testing, with zero observed margin-related failures across the 100-cycle bench test and 28-transition integrated test. The 100-count band is, however, only approximately 20% of the daylight range and only approximately 12% of the night-LED-ceiling-to-Topen distance, so the system is more robust against daylight-induced chatter than against borderline interior scenarios. A wider band (e.g. Tclose = 100, Topen = 400) would reduce indoor-lighting false-triggering but would also reduce the system’s responsiveness to marginal daylight conditions such as heavy overcast or dawn or dusk.

5. Conclusions and Future Work

5.1. Summary

This work has presented the design, fabrication, and quantitative experimental validation of a retrofittable mechatronic actuator that automates a manually operated residential blinds tilt mechanism without modification of the host hardware. A closed-form static torque analysis, anchored to an empirically calibrated equivalent-load proxy, predicts a working design margin of approximately 3.2× against the worst-case wand-rotation load. Three print-and-test iterations produced a friction-fit PLA coupler that grips the wand during motion and slips at the end stop, eliminating the need for a position sensor. A software Schmitt-trigger control law with a 100-count hysteresis dead band achieves chatter-free operation under naturally varying daylight. Across a seven-day integrated test, the prototype completed all 28 commanded transitions with zero missed steps, zero false triggers, and zero chatter events, at a total bill-of-materials cost of approximately US$37.

5.2. Known Limitations

  • Travel distance (six motor revolutions) is hard-coded; absolute position relies on the slip-clutch behavior of the coupler and the user-enforced startup assumption.

  • The system has no manual override input; an unintended state can only be cleared by power cycling.

  • Position is not corrected for any drift accumulated across many cycles, although none was observed in the seven-day test.

  • Sensitivity to indoor lighting at night is bounded but not eliminated (Section 4.3).

  • Testing was conducted at a single south-facing residential window at one latitude during one season; generalization to other orientations and climates remains to be demonstrated.

5.3. Future Work

  • Closed-loop position feedback via motor-current sensing for end-of-travel detection, removing the hard-coded step count and the user-enforced startup state.

  • Spectral or temporal discrimination of artificial versus solar illumination, e.g., with a low-cost RGB or IR-pass sensor, or with a real-time clock providing a time-of-day prior.

  • Wireless integration with home-automation platforms via an ESP32-class microcontroller, enabling remote scheduling and override.

  • A manual override button on a spare digital pin.

  • Appendix A. Complete Firmware Source

    The complete production firmware (StepperMotor_prototype9.ino) is reproduced below [11] [12]. The non-obvious motor-pin ordering (8, 10, 9, 11) is required for correct phase sequencing through the ULN2003 driver (Section 2.4.6).

    #include <Stepper.h>

    const int stepsPerRevolution = 2048;

    const int sensorPin = A0;

    const int steps = stepsPerRevolution * 6;

    int lightLevel;

    boolean isOpen = true;

    Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

    void setup() {

    Serial.begin(9600);

    myStepper.setSpeed(10);

    }

    void loop() {

    lightLevel = analogRead(sensorPin);

    Serial.println(lightLevel);

    if (lightLevel < 200 && isOpen == true) {

    myStepper.setSpeed(8);

    myStepper.step(steps);

    isOpen = false;

    } else if (lightLevel > 300 && isOpen == false) {

    myStepper.setSpeed(8);

    myStepper.step(-steps);

    isOpen = true;

    } else {

    digitalWrite(8, LOW);

    digitalWrite(9, LOW);

    digitalWrite(10, LOW);

    digitalWrite(11, LOW);

    }

    }

    Appendix B. Bill of Materials

    Component

    Qty

    Role

    Est. Cost (USD)

    Arduino UNO R3 (Elegoo Super Starter Kit)

    1

    Microcontroller

    $20.00

    28BYJ-48 stepper motor (5 V geared)

    1

    Actuator

    $3.00

    ULN2003APG driver board

    1

    Motor driver

    $2.00

    Cadmium-sulfide photoresistor (LDR)

    1

    Light sensor

    $0.50

    1 kΩ resistor (¼ W)

    1

    Divider pull-down

    $0.05

    PLA filament (enclosure + coupler)

    ~40 g

    Mechanical structure

    $5.00

    4 × AA battery pack + holder

    1

    6 V supply

    $3.00

    Stripboard, wires, screws

    Interconnect

    $3.00

    Total

    $36.55

    Appendix C. Supplementary Media

    A video recording of the working prototype performing automated open and close cycles is available at the following link: https://drive.google.com/file/d/12oBfbv6VVootxk6B5Q-MhEDQ-mferSz1/view?usp=sharing

Conflicts of Interest

The authors declare no conflicts of interest regarding the publication of this paper.

References

[1] U.S. Department of Energy (2024) Energy Saver: Window Treatments. Office of Energy Efficiency and Renewable Energy.
https://www.energy.gov/energysaver/energy-efficient-window-coverings
[2] Farrell, M.H.J. (2023) Block the Sun and Lower Your Energy Costs with Window Coverings. Consumer Reports.
https://www.consumerreports.org/home-garden/energy-efficiency/beat-the-heat-with-window-coverings-a9364047186/
[3] Anthropic (2025) Claude 3.5 Sonnet [Large Language Model].
https://claude.ai
[4] Kiatronics (2017) 28BYJ-48 5 V Stepper Motor Datasheet. Welten Holdings Ltd.
[5] Budynas, R.G. and Nisbett, J.K. (2020) Shigley’s Mechanical Engineering Design. 11th Edition, McGraw-Hill.
[6] Token Electronics (2020) GL55 Series Photoresistor Datasheet. Token Electronics Industry Co., Ltd.
[7] Atmel Corporation (2015) ATmega328P 8-Bit AVR Microcontroller Datasheet. Revision 7810D-AVR-01/15.
[8] Texas Instruments (2017) ULN2003A High-Voltage, High-Current Darlington Transistor Array Datasheet. SLRS027O.
[9] Schmitt, O.H. (1938) A Thermionic Trigger. Journal of Scientific Instruments, 15, 24-26.[CrossRef]
[10] Ultimaker BV (2019) Technical Data Sheet: PLA. Version 4.003.
[11] Arduino (2024) Stepper Library Reference.
https://docs.arduino.cc/libraries/stepper/
[12] OpenAI (2025) Codex [Large Language Model].
https://openai.com

Copyright © 2026 by authors and Scientific Research Publishing Inc.

Creative Commons License

This work and the related PDF file are licensed under a Creative Commons Attribution 4.0 International License.