-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 77264bf
Showing
10 changed files
with
100 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
MIT License | ||
|
||
Copyright (c) 2020 Jens | ||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to deal | ||
in the Software without restriction, including without limitation the rights | ||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
|
||
The above copyright notice and this permission notice shall be included in all | ||
copies or substantial portions of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
# Festool CTL SYS vacuum with bluetooth remote | ||
|
||
YouTube video: https://youtu.be/E9ytORyrOFA | ||
|
||
I really like my Festool CTL SYS but was missing the Bluetooth features of the bigger vacuums so I decided to retrofit the Bluetooth module CT-F I/M. | ||
|
||
## Description | ||
The Bluetooth module has 3 wires: 5V, GND, and a signal wire which will be GND most of the time and 5V for a short time when the button is pressed. | ||
|
||
I made a custom PCB with an ATtiny85 microcontroller to add denouncing and translate the momentary signal into a persistent on/off signal for the vacuum. | ||
|
||
The vacuum has ZH 5 pin connector. If you connect pin 1 to pin 2, the vacuum will start. I added a 5V power supply since I couldn't find a 5V power source on the Festool PCB which could handle 100mA of current required by the Bluetooth module + my custom module. I use the 230VAC from the socket since the current is not enough to trigger the vacuum in auto mode. | ||
|
||
You can achieve the same functionality without using a microcontroller but since I am a software developer and have more knowledge about microcontroller then analog circuits I choose this approach. | ||
|
||
## Costs: | ||
- 75€/85$ for Festool Bluetooth module + remote CT-F I/M-Set (202097) | ||
- 1€/1$ for ATtiny85 microcontroler | ||
- 5€/5$ for 5V power supply | ||
- 3€/3$ for ZH5 cable, relay, transistor, diode and resistors | ||
------------ | ||
84€/94$ total | ||
|
||
|
||
## Components: | ||
- Festool CT-F I/M | ||
- 5V relay e.g. HJR-4102-L 5V | ||
- 1N4007 diode | ||
- 10kOhm pull down resistor | ||
- NPM transistor to control relay e.g. BC547B | ||
- Gate resistor for transistor e.g 1kOhm | ||
- 5V power supply e.g HLK-PM01 5 | ||
- 5pin ZH5 cable | ||
|
||
## Programming | ||
|
||
The code is part of this GitHub repository. You can follow this guide to find out more about how to program the ATtiny85: https://create.arduino.cc/projecthub/arjun/programming-attiny85-with-arduino-uno-afb829 | ||
|
||
## Images | ||
![Festool PCB](festool_pcb.jpg) | ||
![Test circuit](test_circuit.jpg) | ||
![Custom PCB front](custom_pcb_front.jpg) | ||
![Custom PCB back](custom_pcb_back.jpg) | ||
![Bluetooth modle mounted](bluetooth_module.jpg) | ||
![Mounted PCB 1](mounted_pcb_1.jpg) | ||
![Mounted PCB 2](mounted_pcb_2.jpg) |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
const int REMOTE_IN = 3; | ||
const int RELAY_OUT = 4; | ||
|
||
bool vacuum_running = LOW; | ||
bool remote_state = LOW; | ||
|
||
unsigned long lastDebounceTime = 0; // the last time a bluetooth signal has been received | ||
unsigned long debounceDelay = 2000; // the debounce time, can probably be reduced | ||
|
||
void setup() { | ||
pinMode(REMOTE_IN, INPUT); | ||
pinMode(RELAY_OUT, OUTPUT); | ||
|
||
// ensure a defined state at bootup | ||
digitalWrite(RELAY_OUT, vacuum_running); | ||
} | ||
|
||
void loop() { | ||
// after the remote has been triggered, "wait" debounceDelay until reading again to avoid boucing | ||
if ((millis() - lastDebounceTime) < debounceDelay) { | ||
return; | ||
} | ||
remote_state = digitalRead(REMOTE_IN); | ||
if (remote_state == HIGH) { | ||
// reset the debouncing timer | ||
lastDebounceTime = millis(); | ||
|
||
// toggle vacuum | ||
vacuum_running = !vacuum_running; | ||
digitalWrite(RELAY_OUT, vacuum_running); | ||
} | ||
|
||
} |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.