Compare commits

...

100 Commits

Author SHA1 Message Date
15af0c7e9a Update README.md 2024-10-18 14:06:19 +02:00
2bb280c208 Update README.md 2024-10-18 14:04:14 +02:00
micworg
6218a4a4c7
Merge pull request #1 from BernhardSchlegel/patch-1
added links for components
2020-03-12 18:38:26 +01:00
Bernhard Schlegel
370b284bb6
added links for components 2020-03-12 18:34:34 +01:00
Michael Wesemann
8da220cbdb bug fix 2019-11-05 14:49:48 +01:00
Michael Wesemann
97aacae7b9 - 2019-10-09 11:40:47 +02:00
Michael Wesemann
052c350dad - 2019-10-09 11:37:20 +02:00
Michael Wesemann
d11fda9a71 - 2019-10-09 09:17:38 +02:00
Michael Wesemann
51b7789311 - 2019-10-09 08:52:09 +02:00
Michael Wesemann
458dfd2621 - 2019-10-09 08:49:53 +02:00
Michael Wesemann
30578560cc - 2019-10-09 08:47:24 +02:00
Michael Wesemann
96f890588d - 2019-10-09 08:46:17 +02:00
Michael Wesemann
7594f5396e - 2019-10-09 08:45:18 +02:00
Michael Wesemann
789c5f230f - 2019-10-09 08:43:26 +02:00
Michael Wesemann
e5b5a36a06 - 2019-10-09 08:42:51 +02:00
Michael Wesemann
8a2ef9be32 - 2019-10-09 08:42:30 +02:00
Michael Wesemann
cc60e10a33 - 2019-10-09 08:41:24 +02:00
Michael Wesemann
c8da085c22 - 2019-10-09 08:39:07 +02:00
Michael Wesemann
6422fa3a8a - 2019-10-09 08:38:41 +02:00
Michael Wesemann
d815054215 - 2019-10-09 08:36:53 +02:00
Michael Wesemann
4de79a9d6c - 2019-10-08 14:40:25 +02:00
Michael Wesemann
f00cb821e3 - 2019-10-08 14:39:55 +02:00
Michael Wesemann
f508e869ed - 2019-10-08 14:38:49 +02:00
Michael Wesemann
485fa38021 - 2019-10-08 14:25:08 +02:00
Michael Wesemann
0689ea7e9e - 2019-10-08 14:22:27 +02:00
Michael Wesemann
17062e17cc - 2019-10-08 14:21:09 +02:00
Michael Wesemann
c1e12c7286 - 2019-10-08 14:18:23 +02:00
Michael Wesemann
4be02dca3f - 2019-10-08 14:18:06 +02:00
Michael Wesemann
7a265978f1 - 2019-10-08 14:17:10 +02:00
Michael Wesemann
15da3e7dc8 - 2019-10-06 19:51:14 +02:00
Michael Wesemann
17aa9f611e - 2019-10-06 19:50:34 +02:00
Michael Wesemann
f5e0bcc72b - 2019-10-06 19:46:24 +02:00
Michael Wesemann
a19d1dfe54 - 2019-10-05 15:33:36 +02:00
Michael Wesemann
4feb32a702 - 2019-10-05 15:32:54 +02:00
Michael Wesemann
76f390897f - 2019-10-04 22:19:19 +02:00
Michael Wesemann
b5c6b0741d - 2019-10-04 17:45:22 +02:00
Michael Wesemann
69865a06e6 - 2019-10-04 17:16:14 +02:00
Michael Wesemann
0e67219478 - 2019-10-04 17:14:09 +02:00
Michael Wesemann
5c78d839ef - 2019-10-04 17:13:03 +02:00
Michael Wesemann
6eb004d420 - 2019-10-04 17:11:38 +02:00
Michael Wesemann
b1316d8d9d - 2019-10-04 17:05:03 +02:00
Michael Wesemann
2ebf823f32 - 2019-10-04 17:04:00 +02:00
Michael Wesemann
160219215e - 2019-10-04 17:02:42 +02:00
Michael Wesemann
1094ada372 - 2019-10-04 17:02:27 +02:00
Michael Wesemann
f4968c0b66 - 2019-10-04 17:01:14 +02:00
Michael Wesemann
0c1d20ce5c - 2019-10-04 17:00:47 +02:00
Michael Wesemann
dbfc10a358 - 2019-10-04 16:58:40 +02:00
Michael Wesemann
fbd399f310 - 2019-10-04 16:55:03 +02:00
Michael Wesemann
5606de2e30 - 2019-10-04 16:53:53 +02:00
Michael Wesemann
38af1654af - 2019-10-04 16:52:16 +02:00
Michael Wesemann
c651235a54 - 2019-10-04 16:47:39 +02:00
Michael Wesemann
c07685d07a - 2019-10-04 16:47:01 +02:00
Michael Wesemann
b17f299211 - 2019-10-04 16:46:05 +02:00
Michael Wesemann
4f355add20 - 2019-10-04 16:40:19 +02:00
Michael Wesemann
01d921ff10 bug fix 2019-10-02 15:01:09 +02:00
Michael Wesemann
f4f173d22d bug fix 2019-10-02 15:00:01 +02:00
Michael Wesemann
09d9733046 bug fix 2019-10-02 14:53:40 +02:00
Michael Wesemann
d316f6c884 bug fix 2019-10-02 14:53:21 +02:00
Michael Wesemann
a11d33d0d3 bug fix 2019-10-02 14:53:01 +02:00
Michael Wesemann
80242b3031 updated support files 2019-09-28 21:22:29 +02:00
Michael Wesemann
7f1b6089db updated NANO shields 2019-09-18 12:40:38 +02:00
Michael Wesemann
ec2b571047 updated NANO shields 2019-09-18 12:40:07 +02:00
Michael Wesemann
7466d161ef updated NANO shields 2019-09-18 12:39:10 +02:00
Michael Wesemann
1e036907a9 updated NANO shields 2019-09-18 12:38:14 +02:00
Michael Wesemann
096e6a47ac updated NANO shields 2019-09-18 08:56:05 +02:00
Michael Wesemann
b50ab170ce updated NANO shields 2019-09-18 08:55:04 +02:00
Michael Wesemann
92eea55eaa updated NANO shields 2019-09-18 08:54:18 +02:00
Michael Wesemann
1481348f3d updated NANO shields 2019-09-18 08:53:43 +02:00
Michael Wesemann
f63c52ebf5 updated NANO shields 2019-09-18 08:52:58 +02:00
Michael Wesemann
22ada2c9e0 updated NANO shields 2019-09-18 08:49:15 +02:00
Michael Wesemann
d74bacde6b updated cad files 2019-09-17 11:41:15 +02:00
Michael Wesemann
5c1021abfd updated readme 2019-09-12 09:36:42 +02:00
Michael Wesemann
03c484f1c6 added NANO shield 2019-09-12 08:55:53 +02:00
Michael Wesemann
f4704f57ce - 2019-09-12 08:55:18 +02:00
Michael Wesemann
55b1e7559a added nanoshiel 2019-09-12 08:52:44 +02:00
Michael Wesemann
5368b67f95 added nanoshiel 2019-09-12 08:50:58 +02:00
Michael Wesemann
58794502cf added nanoshiel 2019-09-12 08:49:05 +02:00
Michael Wesemann
57899c5600 added nanoshiel 2019-09-12 08:47:58 +02:00
Michael Wesemann
0496e468aa added nanoshiel 2019-09-12 08:46:04 +02:00
Michael Wesemann
8443725f70 improved encoder behavior 2019-07-07 16:16:53 +02:00
Michael Wesemann
e3b308aad7 updated readme 2019-06-03 12:49:35 +02:00
Michael Wesemann
659ae261b1 minor changes, bug fixes 2019-06-03 12:43:31 +02:00
Michael Wesemann
b8a657de73 random mode added 2019-06-03 09:43:41 +02:00
Michael Wesemann
71bce7ad0f random mode added 2019-06-03 09:41:23 +02:00
Michael Wesemann
0ac4d63b19 random mode added 2019-06-02 14:20:59 +02:00
Michael Wesemann
079cb51254 added UNO shield 2019-05-14 14:44:32 +02:00
Michael Wesemann
024910542d added UNO shield 2019-05-12 18:46:43 +02:00
Michael Wesemann
8f5c637d7a added UNO shield 2019-05-12 18:45:57 +02:00
Michael Wesemann
ffd85f2a06 added UNO shield 2019-05-12 18:44:48 +02:00
Michael Wesemann
c86e82bedf added Magnetrührer_Folie.pdf 2019-04-30 18:56:24 +02:00
Michael Wesemann
05c9c3bad0 updated readme 2019-04-30 08:06:38 +02:00
Michael Wesemann
8a8a586ce4 updated readme 2019-04-30 08:05:16 +02:00
Michael Wesemann
353ef24b1e updated readme 2019-04-30 08:04:20 +02:00
Michael Wesemann
d8b2997a65 updated readme 2019-04-30 08:03:40 +02:00
Michael Wesemann
e4f7aa7e51 added bezel files from Herbert 2019-04-30 07:52:49 +02:00
Michael Wesemann
c54269b217 reordered CAD directory 2019-04-30 07:49:26 +02:00
Michael Wesemann
54e8b1c60b added case files from Jens 2019-04-30 07:47:16 +02:00
Michael Wesemann
34da83cb91 updated readme 2019-03-29 13:46:55 +01:00
Michael Wesemann
6e3c0a41ce off state pins, brightness control 2019-03-29 13:44:32 +01:00
Michael Wesemann
d77e56a5d5 bug fix 2019-03-20 14:45:16 +01:00
55 changed files with 45025 additions and 40841 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*.hex
*.elf
.DS_Store

BIN
Gerber_Stir V2.zip Normal file

Binary file not shown.

177
README.md
View File

@ -1,14 +1,61 @@
# Dual magnetic stir controller
# Dual magnetic stir controller V2
## Overview
This is the Arduino sketch to build a double magnetic stirrer based on 2 fans, a 1602 LCD display, a KY-040 encoder and an Arduino (e.g. Uno, Leonardo, Pro Micro).
This is the Arduino project to build a double magnetic stirrer based on 2 fans, a 1602 LCD display, a KY-040 encoder and an Arduino Nano and a special PCB designed in the Hobbybrauer-Forum.
<p align="center">
<img src="https://github.com/micworg/stir/blob/master/images/stir.jpg" width=500>
<img src="https://git.fhi.mpg.de/mike/stir/raw/branch/master/images/stir+pcb.jpg" width=700>
</p>
In order to put the stirrer into operation you have to change the settings in stir.ino according to your setup.
V2 supports dual voltage for the fans which increases the speed range.
In order to put the stirrer into operation you have to change the settings in stir.ino according to your setup (see below).
The stir V2 software is compatible with V1 hardware if you have used neither the RS232 Api nor the OFF0 and OFF1 relais pins.
## Part List
* 1x PCB "Stir V2.0"
* 1x Arduino Nano V3
* 1x [Voltage regulator TE818 5-24V to 5V 3A step down buck converter](https://www.ebay.de/itm/5x-Voltage-Regulator-5-24V-to-5V-3A-Step-Down-Buck-Converter-Power-Module-TE818/133109140535?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649)
* 2x [Relais Omron G5Q-1-EU 5DC switching printrelais 5 V/DC 5A](https://www.conrad.de/de/p/omron-g5q-1-eu-5dc-printrelais-5-v-dc-5-a-1-wechsler-1-st-503930.html)
* 2x [Diode 1N4148 Diotec](https://www.conrad.de/de/p/stmicroelectronics-schottky-diode-gleichrichter-1n5822-do-201ad-40-v-einzeln-168275.html)
* 1x [Electrolytic capacitor 1000µF/16V Yageo SE016M1000B5S-1015](https://www.conrad.de/de/p/yageo-se016m1000b5s-1015-elektrolyt-kondensator-radial-bedrahtet-5-mm-1000-f-16-v-20-x-h-10-mm-x-15-mm-1-st-445386.html)
* 2x [Diode 1N5822 STMicroelectronics Schottky-Diode](https://www.conrad.de/de/p/diotec-ultraschnelle-si-diode-1n4148-sod-27-75-v-150-ma-162280.html)
* 4x [Metal film resistor 10 KOhm 0,6 W](https://www.conrad.de/de/p/rs-pro-metallschichtwiderstand-10k-0-5-0-6w-807200469.html)
* 2x Fan BeQuiet SilentWings 3 120mm PWM Highspeed or Noctua NF-R8 Redux-1800 80mm PWM
* 1x Power supply 12V-16V DC / 2A
* 1x Built-in socket for plug-in power supply unit
* 1x I2C 16x2 Arduino LCD Display Module
* 1x [Rotary encoder KY-040](https://www.conrad.de/de/p/joy-it-kodierter-drehschalter-rotary-encoder-1695709.html)
* 2x Magnet mount (3D printed)
* 4x Neodymium magnet 20x10 mm (N52, 1 oder 2 mm dick)
In addition, a housing is required that can be individually designed according to possibilities and capabilities.
<p align="center">
<img src="https://git.fhi.mpg.de/mike/stir/raw/branch/master/images/v2_board.jpg" width=350>
</p>
## Reference
This project was created based on an idea from the german Hobbybrauer-Forum and would not be possible without the ideas from there.
The forum: https://hobbybrauer.de/
The thread: https://hobbybrauer.de/forum/viewtopic.php?f=21&t=1456
Special thanks for development and testing:
* Herbert Schmid
* Adrian Sigel
* Jens Warkentin
* Bastian Werner
## Overview of Functions
@ -25,6 +72,15 @@ All functions are controlled by the KY-040 encoder:
* **CTIME**: turn changes the interval in minutes for the fish catching function
* **RTIME**: turn changes speed rise time in seconds (applies to power on, stirrer on, boost on and fish catching)
* **OTIME**: turn changes switch off time in hours (the timer activates immediately, 0 = switch off disabled)
* **RNVAL**: random value range (a random values in this range will be added to speed)
* **Other menu options**:
* **CFG**: Configuration menu
Functions in the congirutation sub menu
* **Short Press**: switch between config option and and value.
* **Long press**: exit configuration menu.
* **Turn**: select configuration option or change value.
## Display Indicators:
@ -35,82 +91,39 @@ All functions are controlled by the KY-040 encoder:
## Settings (in stir.ino)
|Value|Description|
|:----|:----------|
|`SPEEDINC`|increment of speed values when turning the encoder|
|`FANMIN`|fan minimum speed (should be a value at which the fan runs safely) (rpm)|
|`FANMAX`|maximum speed of the fan (it is important that this is the real maximum value of the fan) (rpm)|
|`CATCHSTOP`|stop interval for stir fish catch function (ms)|
|`PWM0`, `PWN1`|PWM output pins|
|`I0`, `I1`|interrupts for rpm measurement (2 and 3 for Leonardo and ProMicro / 0 and 1 for Uno)|
|`CLK`, `DT`, `SW`|pins for KY-040 encoder|
|`RINTERVAL`|regulation interval (ms)|
|`RDELAY`|extra regulation delay when value changes (ms)|
|`RTOL`|regulation tolerance (rpm)|
|`SINTERVAL`|speed measurement interval (ms)|
|`SAVERAGE`|speed measurement average|
|`SAVETAG`|parameter save identifier|
|`SAVEDELAY`|delay in seconds before parameter will be saved to EEPROM|
|Value|Config|Description|
|:----------------|:-----|:----------|
|`LGHT` |`LGHT`|LCD display brightness|
|`SPEEDINC1` |`SPI1`|increment of speed values when turning the encoder (1. range)|
|`SPEEDINC2` |`SPI2`|increment of speed values when turning the encoder (2. range)|
|`SPEEDINC3` |`SPI3`|increment of speed values when turning the encoder (3. range)|
|`SPEEDSTEP1` |`SPS1`|speed increment steps (increment changes at these values, separates range 1 and 2)|
|`SPEEDSTEP2` |`SPS2`|speed increment steps (increment changes at these values, separates range 2 and 3))|
|`FANMIN` |`FMIN`|fan minimum speed (should be a value at which the fan runs safely) (rpm)|
|`FANMAX` |`FMAX`|fan maximum speed (it's important that this is the real maximum value of the fan) (rpm)|
|`FANINIT` |`FINI`|set fans to high voltage for 3 sec at boot (0/1)|
|`BOFF` |`BOFF`|if set boost off will also turn the normal mode off (0/1)|
|`BINC` |`BINC`|boost time increment (min)|
|`CINC` |`CINC`|catch time increment (min)|
|`RINC` |`RINC`|rise time increment (sec)|
|`OINC` |`OINC`|off timer increment (hour)|
|`RNDINC` |`RINC`|randon value increment (rpm)|
|`CATCHSTOP` |`CSTP`|stop interval for stir fish catch function (ms)|
|`PWM0`, `PWM1` | |PWM output pins for fan speed|
|`PWM2` | |PWM output pin for LCD brightness control|
|`I0`, `I1` | |interrupts for rpm measurement (0/1 for Uno/Nano, 2/3 for Leonardo/ProMicro)|
|`SWAPENC` |`SWEN`|switch KY-040 encoder direxction (0/1)|
|`CLK`, `DT`, `SW`| |pins for KY-040 encoder|
|`R0`, `R0` | |voltage select relais pin|
|`RTHRES` |`RTHR`|voltage switch threshold (rpm)|
|`RINTERVAL` |`XINT`|regulation interval (ms)|
|`RDELAY` |`XDEL`|extra regulation delay when value changes (ms)|
|`RTOL` |`XTOL`|regulation tolerance (rpm)|
|`RNDINTERVL` |`RINT`|randon value range change interval (ms)|
|`SINTERVAL` |`SINT`|speed measurement interval (ms)|
|`SAVERAGE` |`SAVG`|speed measurement average|
|`SAVETAG` | |parameter save identifier|
|`SAVEDELAY` | |delay in seconds before parameter will be saved to EEPROM|
|`LCDB` | |LCD brightness steps (10 values, 0=off, 255=max)|
|`RESET` |`RSET`|change this value in configuration menu to 1 for factory reset|
## API commands
Commands are colon separated an can be send via USB/Serial
|Command|Description|
|:------|:----------|
|`info`|returns a colon separated string with all parameters (see below)|
|`version`|returns the software version|
|`on:<0/1>`|switch stirren on|
|`off:<0/1>`|switch stirren off|
|`bon:<0/1>`|switch boost mode on|
|`boff:<0/1>`|switch boost mode off|
|`speed:<0/1>:<rpm>`|set stirrer speed (FANMIN-FANMAX rpm)|
|`bspeed:<0/1>:<rpm>`|set stirrer boost speed (speed-FANMAX rpm)|
|`btime:<0/1>:<min>`|set boost time (0-60)|
|`con:<0/1>`|switch catch mode on|
|`coff:<0/1>`|switch catch mode off|
|`ctime:<0/1>:<min>`|set catch mode interval (60-240 min)|
|`rtime:<0/1>:<sec>`|set speed rise time (0-240 sec)|
|`otime:<0/1>:<hour>`|switch stirrer off after time in hours (1-99 hour, 0 deactivates switch off)|
All commands return a colon separated string with all current parameters:
|Element|Stirrer|Variable in stir.ino|Description|
|:------|:------|:-------------------|:----------|
| 0|0|`F[0]` |state (0=on, 1=off)|
| 1|0|`v[0]` |speed (rpm)|
| 2|0|`b[0]` |boost speed (rpm)|
| 3|0|`rpm[0]` |rpm|
| 4|0|`xpm[0]` |averaged rpm|
| 5|0|`r[0]` |regulation value|
| 6|0|`bstate[0]`|boost state (0=on, 1=off)|
| 7|0|`btime[0]` |boost time (min)|
| 8|0|`cat[0]` |fish catch mode state (0=on, 1=off)|
| 9|0|`ctime[0]` |fish catch time interval (min)|
|10|0|`rtime[0]` |speed rise time (sec)|
|11|0|`otime[0]` |switch off time (hour)|
|12|0| |boost remain (sec)|
|13|0| |off timer remain (sec)|
|14|1|`F[1]` |state (0=on, 1=off)|
|15|1|`v[1]` |speed (rpm)|
|16|1|`b[1]` |boost speed (rpm)|
|17|1|`rpm[1]` |rpm|
|18|1|`xpm[1]` |averaged rpm|
|19|1|`r[1]` |regulation value|
|20|1|`bstate[1]`|boost state (0=on, 1=off)|
|21|1|`btime[1]` |boost time (min)|
|22|1|`cat[1]` |fish catch mode state (0=on, 1=off)|
|23|1|`ctime[1]` |fish catch time interval (min)|
|24|1|`rtime[1]` |speed rise time (sec)|
|25|1|`otime[1]` |switch off time (hour)|
|26|1| |boost remain (sec)|
|27|1| |off timer remain (sec)|
|28| | |0=ok, 1=error|
|29| | |software version|
## Schematics
<p align="center">
<img src="https://github.com/micworg/stir/blob/master/images/schematic_leonardo.png" width=500>
<img src="https://github.com/micworg/stir/blob/master/images/schematic_uno.png" width=500>
</p>

143
V1 (old)/README.md Normal file
View File

@ -0,0 +1,143 @@
# Dual magnetic stir controller V1
## Overview
This is the Arduino sketch to build a double magnetic stirrer based on 2 fans, a 1602 LCD display, a KY-040 encoder and an Arduino (e.g. Uno, Nano, Leonardo, Pro Micro).
<p align="center">
<img src="https://github.com/micworg/stir/blob/master/images/stir.jpg" width=500>
</p>
In order to put the stirrer into operation you have to change the settings in stir.ino according to your setup.
## Reference
This project was created based on an idea from the Hobbybrauer-Forum and would not be possible without the ideas from there.
The forum: https://hobbybrauer.de/
The thread: https://hobbybrauer.de/forum/viewtopic.php?f=21&t=1456
## Overview of Functions
All functions are controlled by the KY-040 encoder:
* **Short Press:** change between menu, stirrer 1 and stirrer 2
* **Turn when menu is selected**: change between menu items (SPEED, BOOST, BTIME, CATCH, CTIME)
* **Long press when menu is selected**: lock all functions (unlock also by long press)
* **When a stirrer is selected**:
* **SPEED**: turn sets speed, long press switches stirrer on or off.
* **BOOST**: turn sets boost speed, long press activates/deactivates the boost function (running time is shown in the display).
* **BTIME**: turn changes the boost time in minutes.
* **CATCH**: turn activates/deactivates the fishing function
* **CTIME**: turn changes the interval in minutes for the fish catching function
* **RTIME**: turn changes speed rise time in seconds (applies to power on, stirrer on, boost on and fish catching)
* **OTIME**: turn changes switch off time in hours (the timer activates immediately, 0 = switch off disabled)
* **RNVAL**: random value range (a random values in this range will be added to speed)
* **Other menu options**:
* **BRGHT**: LCD brightness
## Display Indicators:
* **Bottom Left**: Menu
* **Bottom Center/Right**: displays the set values for the stirrers depending on the selected menu item.
* **Top Center/Right**: displays the current stirrer speed (or 'OFF' or 'CAT' (Fishing)).
* **Top Left**: shows the remaining time of the boost or switch off function.
## Settings (in stir.ino)
|Value|Description|
|:----|:----------|
|`SPEEDINC`|increment of speed values when turning the encoder|
|`FANMIN`|fan minimum speed (should be a value at which the fan runs safely) (rpm)|
|`FANMAX`|maximum speed of the fan (it is important that this is the real maximum value of the fan) (rpm)|
|`BOFF`|if set boost off will also turn the normal mode off|
|`BINC`|boost time increment (min)|
|`CINC`|catch time increment (min)|
|`RINC`|rise time increment (sec)|
|`OINC`|off timer increment (hour)|
|`CATCHSTOP`|stop interval for stir fish catch function (ms)|
|`PWM0`, `PWM1`|PWM output pins for fan speed|
|`PWM2`|PWM output pin for LCD brightness control|
|`I0`, `I1`|interrupts for rpm measurement (2 and 3 for Leonardo and ProMicro / 0 and 1 for Uno)|
|`CLK`, `DT`, `SW`|pins for KY-040 encoder|
|`OFF0`, `OFF1`|these pins will be set if the fan is off|
|`OFFSTATE`|off state (LOW/HIGH)|
|`RINTERVAL`|regulation interval (ms)|
|`RDELAY`|extra regulation delay when value changes (ms)|
|`RTOL`|regulation tolerance (rpm)|
|`RNDINTERVL`|randon value range change interval (ms)|
|`SINTERVAL`|speed measurement interval (ms)|
|`SAVERAGE`|speed measurement average|
|`SAVETAG`|parameter save identifier|
|`SAVEDELAY`|delay in seconds before parameter will be saved to EEPROM|
|`LCDB`|LCD brightness steps (10 values, 0=off, 255=max)|
## API commands
Commands are colon separated an can be send via USB/Serial
|Command|Description|
|:------|:----------|
|`info`|returns a colon separated string with all parameters (see below)|
|`version`|returns the software version|
|`on:<0/1>`|switch stirren on|
|`off:<0/1>`|switch stirren off|
|`bon:<0/1>`|switch boost mode on|
|`boff:<0/1>`|switch boost mode off|
|`speed:<0/1>:<rpm>`|set stirrer speed (FANMIN-FANMAX rpm)|
|`bspeed:<0/1>:<rpm>`|set stirrer boost speed (speed-FANMAX rpm)|
|`btime:<0/1>:<min>`|set boost time (0-60)|
|`con:<0/1>`|switch catch mode on|
|`coff:<0/1>`|switch catch mode off|
|`ctime:<0/1>:<min>`|set catch mode interval (60-240 min)|
|`rtime:<0/1>:<sec>`|set speed rise time (0-240 sec)|
|`rnval:<0/1>:<rpm>`|set randon value range (0-1000 rpm)|
|`otime:<0/1>:<hour>`|switch stirrer off after time in hours (1-99 hour, 0 deactivates switch off)|
All commands return a colon separated string with all current parameters:
|Element|Stirrer|Variable in stir.ino|Description|
|:------|:------|:-------------------|:----------|
| 0|0|`F[0]` |state (0=on, 1=off)|
| 1|0|`v[0]` |speed (rpm)|
| 2|0|`b[0]` |boost speed (rpm)|
| 3|0|`rpm[0]` |rpm|
| 4|0|`xpm[0]` |averaged rpm|
| 5|0|`r[0]` |regulation value|
| 6|0|`bstate[0]`|boost state (0=on, 1=off)|
| 7|0|`btime[0]` |boost time (min)|
| 8|0|`cat[0]` |fish catch mode state (0=on, 1=off)|
| 9|0|`ctime[0]` |fish catch time interval (min)|
|10|0|`rtime[0]` |speed rise time (sec)|
|11|0|`otime[0]` |switch off time (hour)|
|12|0|`rnval[0]` |random value range (rpm)|
|13|0|`rnd[0]` |current random value (rpm)|
|14|0| |boost remain (sec)|
|15|0| |off timer remain (sec)|
|16|1|`F[1]` |state (0=on, 1=off)|
|17|1|`v[1]` |speed (rpm)|
|18|1|`b[1]` |boost speed (rpm)|
|19|1|`rpm[1]` |rpm|
|20|1|`xpm[1]` |averaged rpm|
|21|1|`r[1]` |regulation value|
|22|1|`bstate[1]`|boost state (0=on, 1=off)|
|23|1|`btime[1]` |boost time (min)|
|24|1|`cat[1]` |fish catch mode state (0=on, 1=off)|
|25|1|`ctime[1]` |fish catch time interval (min)|
|26|1|`rtime[1]` |speed rise time (sec)|
|27|1|`otime[1]` |switch off time (hour)|
|28|1|`rnval[1]` |random value range (rpm)|
|29|1|`rnd[1]` |current random value (rpm)|
|30|1| |boost remain (sec)|
|31|1| |off timer remain (sec)|
|32| | |software version|
|33| | |uptime (ms)|
|34| | |0=ok, 1=error|
## Schematics
<p align="center">
<img src="https://github.com/micworg/stir/blob/master/images/schematic_leonardo.png" width=500>
<img src="https://github.com/micworg/stir/blob/master/images/schematic_uno.png" width=500>
</p>

Binary file not shown.

View File

@ -0,0 +1,15 @@
# Stir Shield
Stir shields for Arduino NANO from Jens Warkentin.
<p align="center">
<B>Gerber_Stir.Nano+StepDown.V3_.zip<B><BR>
<img src="https://github.com/micworg/stir/blob/master/shields/nano/images/topv3.png" width=300>
</p>
<p align="center">
<B>Gerber_Stir_Arduino_Nano.zip<B><BR>
<img src="https://github.com/micworg/stir/blob/master/shields/nano/images/top.png" width=300>
</p>

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

23
V1 (old)/shields/uno/BOM.txt Executable file
View File

@ -0,0 +1,23 @@
Power Input:
1x KF301-2P screw terminal => https://de.aliexpress.com/item/20-teile-los-KF301-2P-KF301-5-0-2P-KF301-Schraube-2Pin-5-0mm-Gerade-Pin/32867190033.html?spm=a2g0x.search0104.3.1.2c912b5fntkTJD&ws_ab_test=searchweb0_0%2Csearchweb201602_10_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536_10134%2Csearchweb201603_52%2CppcSwitch_0&algo_pvid=18c869a1-9cc5-4b81-88bd-10d4c096c0ee&algo_expid=18c869a1-9cc5-4b81-88bd-10d4c096c0ee-0
Fan:
2x 2,54mm KF2510 3 + 1 P Straight => https://de.aliexpress.com/item/50-teile-los-2-54mm-KF2510-3-1-P-KF2510-4AW-m-nnlich-weibliche-geh-use/32961935772.html?spm=a2g0x.search0104.3.1.5d447ae1Nki8jb&ws_ab_test=searchweb0_0%2Csearchweb201602_10_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536_10134%2Csearchweb201603_52%2CppcSwitch_0&algo_pvid=cbe6ff59-92a1-432d-8c5c-8c9c7732600b&algo_expid=cbe6ff59-92a1-432d-8c5c-8c9c7732600b-0
2x 2.54mm Pin header male => https://de.aliexpress.com/item/10-st-cke-40Pin-2-54mm-Gerade-Einreihige-M-nnlichen-Pin-Header-Stecker-Streifen-PBC-DIY/32878749052.html?spm=a2g0x.search0104.3.85.48754ae7pld96U&ws_ab_test=searchweb0_0%2Csearchweb201602_10_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536_10134%2Csearchweb201603_52%2CppcSwitch_0&algo_pvid=6d1373ff-487b-4174-b289-f2b8f8d6dcd0&algo_expid=6d1373ff-487b-4174-b289-f2b8f8d6dcd0-12
Reset:
1x Micro pressure switch => https://de.aliexpress.com/item/100-teile-los-Mini-Micro-Momentary-Taktile-Druckschalter-6-6-5mm-4-pin-ON-OFF-tasten/32858344336.html?spm=a2g0x.search0104.3.43.3aa022bdWBlQ8n&ws_ab_test=searchweb0_0%2Csearchweb201602_10_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536_10134%2Csearchweb201603_52%2CppcSwitch_0&algo_pvid=2cb51b61-71a9-4cec-b3bf-494134fa318e&algo_expid=2cb51b61-71a9-4cec-b3bf-494134fa318e-6
Output's:
2x XH2.54 square male 5P => https://de.aliexpress.com/item/50PCS-Lot-XH2-54-Right-Angle-Pin-Header-Connector-2P-3P-4P-5P-6P-7P-8P/32822859426.html?spm=a2g0x.search0104.3.8.d58e3f185YK9t8&ws_ab_test=searchweb0_0,searchweb201602_10_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536_10134,searchweb201603_52,ppcSwitch_0&algo_expid=9f565a80-ffcb-40ff-a45a-78ad388fbc3b-1&algo_pvid=9f565a80-ffcb-40ff-a45a-78ad388fbc3b
2x XH2.54 female 5P => https://de.aliexpress.com/item/10PCS-XH2-54-2P-3P-3P-4P-5P-6P-7P-8P-9P-10P-11P-12P-Pitch/32771742483.html?spm=a2g0x.search0104.3.304.643773f2xd0Fnr&ws_ab_test=searchweb0_0,searchweb201602_10_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536_10134,searchweb201603_52,ppcSwitch_0&algo_expid=ff250363-7f23-4460-b86f-a25e39925240-43&algo_pvid=ff250363-7f23-4460-b86f-a25e39925240
Resistors:
4x 10 kOhm SMD or THT Resistors =>
https://de.aliexpress.com/item/100-st-cke-0805-5-1-8-watt-SMD-chip-widerstand-0R-10-mt-0-1R/32865947306.html?spm=a2g0x.search0104.3.2.3e337801L8ie9i&ws_ab_test=searchweb0_0%2Csearchweb201602_10_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536_10134%2Csearchweb201603_52%2CppcSwitch_0&algo_pvid=771d229c-6332-4f9b-86f8-d9c456937ff3&algo_expid=771d229c-6332-4f9b-86f8-d9c456937ff3-0
https://de.aliexpress.com/item/100-st-cke-1-4-watt-Metall-Film-Widerstand-0-25-watt-1-0-2-2/32952777282.html?spm=a2g0x.search0104.3.16.5e9c112fwd3FS3&ws_ab_test=searchweb0_0%2Csearchweb201602_10_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536_10134%2Csearchweb201603_52%2CppcSwitch_0&algo_pvid=9573d819-3d0b-4108-9ac4-c8d4065f59a4&algo_expid=9573d819-3d0b-4108-9ac4-c8d4065f59a4-2

View File

@ -0,0 +1,13 @@
# Stir Shield
Stir shield for Arduino UNO from Adrian Sigel.
<p align="center">
<img src="https://github.com/micworg/stir/blob/master/shields/uno/images/pcb_top.png" width=500>
</p>
<p align="center">
<img src="https://github.com/micworg/stir/blob/master/shields/uno/images/pcb_bottom.png" width=500>
</p>

View File

@ -0,0 +1,467 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
<eagle version="9.3.0">
<drawing>
<settings>
<setting alwaysvectorfont="no"/>
<setting verticaltext="up"/>
</settings>
<grid distance="50" unitdist="mil" unit="mm" style="lines" multiple="1" display="yes" altdistance="5" altunitdist="mil" altunit="mil"/>
<layers>
<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>
<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>
<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>
<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>
<layer number="20" name="Dimension" color="24" fill="1" visible="yes" active="yes"/>
<layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes"/>
<layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes"/>
<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes"/>
<layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes"/>
<layer number="31" name="tCream" color="7" fill="4" visible="no" active="yes"/>
<layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes"/>
<layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes"/>
<layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes"/>
<layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes"/>
<layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes"/>
<layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes"/>
<layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes"/>
<layer number="39" name="tKeepout" color="4" fill="11" visible="yes" active="yes"/>
<layer number="40" name="bKeepout" color="1" fill="11" visible="yes" active="yes"/>
<layer number="41" name="tRestrict" color="4" fill="10" visible="yes" active="yes"/>
<layer number="42" name="bRestrict" color="1" fill="10" visible="yes" active="yes"/>
<layer number="43" name="vRestrict" color="2" fill="10" visible="yes" active="yes"/>
<layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes"/>
<layer number="45" name="Holes" color="7" fill="1" visible="no" active="yes"/>
<layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes"/>
<layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes"/>
<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>
<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>
<layer number="50" name="dxf" color="7" fill="1" visible="no" active="no"/>
<layer number="51" name="tDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="52" name="bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="53" name="tGND_GNDA" color="7" fill="9" visible="no" active="no"/>
<layer number="54" name="bGND_GNDA" color="1" fill="9" visible="no" active="no"/>
<layer number="56" name="wert" color="7" fill="1" visible="no" active="no"/>
<layer number="57" name="tCAD" color="7" fill="1" visible="no" active="no"/>
<layer number="59" name="tCarbon" color="7" fill="1" visible="no" active="no"/>
<layer number="60" name="bCarbon" color="7" fill="1" visible="no" active="no"/>
<layer number="88" name="SimResults" color="9" fill="1" visible="yes" active="yes"/>
<layer number="89" name="SimProbes" color="9" fill="1" visible="yes" active="yes"/>
<layer number="90" name="Modules" color="5" fill="1" visible="yes" active="yes"/>
<layer number="91" name="Nets" color="2" fill="1" visible="yes" active="yes"/>
<layer number="92" name="Busses" color="1" fill="1" visible="yes" active="yes"/>
<layer number="93" name="Pins" color="2" fill="1" visible="yes" active="yes"/>
<layer number="94" name="Symbols" color="4" fill="1" visible="yes" active="yes"/>
<layer number="95" name="Names" color="7" fill="1" visible="yes" active="yes"/>
<layer number="96" name="Values" color="7" fill="1" visible="yes" active="yes"/>
<layer number="97" name="Info" color="7" fill="1" visible="yes" active="yes"/>
<layer number="98" name="Guide" color="6" fill="1" visible="yes" active="yes"/>
<layer number="99" name="SpiceOrder" color="7" fill="1" visible="no" active="no"/>
<layer number="100" name="Muster" color="7" fill="1" visible="no" active="no"/>
<layer number="101" name="Patch_Top" color="12" fill="4" visible="yes" active="yes"/>
<layer number="102" name="Vscore" color="7" fill="1" visible="yes" active="yes"/>
<layer number="103" name="tMap" color="7" fill="1" visible="yes" active="yes"/>
<layer number="104" name="Name" color="16" fill="1" visible="yes" active="yes"/>
<layer number="105" name="tPlate" color="7" fill="1" visible="yes" active="yes"/>
<layer number="106" name="bPlate" color="7" fill="1" visible="yes" active="yes"/>
<layer number="107" name="Crop" color="7" fill="1" visible="yes" active="yes"/>
<layer number="108" name="tplace-old" color="10" fill="1" visible="yes" active="yes"/>
<layer number="109" name="ref-old" color="11" fill="1" visible="yes" active="yes"/>
<layer number="110" name="fp0" color="7" fill="1" visible="yes" active="yes"/>
<layer number="111" name="LPC17xx" color="7" fill="1" visible="yes" active="yes"/>
<layer number="112" name="tSilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="113" name="IDFDebug" color="7" fill="1" visible="yes" active="yes"/>
<layer number="114" name="Badge_Outline" color="11" fill="1" visible="no" active="no"/>
<layer number="115" name="ReferenceISLANDS" color="7" fill="1" visible="yes" active="yes"/>
<layer number="116" name="Patch_BOT" color="9" fill="4" visible="yes" active="yes"/>
<layer number="118" name="Rect_Pads" color="7" fill="1" visible="yes" active="yes"/>
<layer number="121" name="_tsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="122" name="_bsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="123" name="tTestmark" color="7" fill="1" visible="yes" active="yes"/>
<layer number="124" name="bTestmark" color="7" fill="1" visible="yes" active="yes"/>
<layer number="125" name="_tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="126" name="_bNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="127" name="_tValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="128" name="_bValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="129" name="Mask" color="7" fill="1" visible="yes" active="yes"/>
<layer number="131" name="tAdjust" color="7" fill="1" visible="yes" active="yes"/>
<layer number="132" name="bAdjust" color="7" fill="1" visible="yes" active="yes"/>
<layer number="144" name="Drill_legend" color="7" fill="1" visible="yes" active="yes"/>
<layer number="150" name="Notes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="151" name="HeatSink" color="7" fill="1" visible="yes" active="yes"/>
<layer number="152" name="_bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="153" name="FabDoc1" color="7" fill="1" visible="yes" active="yes"/>
<layer number="154" name="FabDoc2" color="7" fill="1" visible="yes" active="yes"/>
<layer number="155" name="FabDoc3" color="7" fill="1" visible="yes" active="yes"/>
<layer number="199" name="Contour" color="7" fill="1" visible="yes" active="yes"/>
<layer number="200" name="200bmp" color="1" fill="10" visible="yes" active="yes"/>
<layer number="201" name="201bmp" color="2" fill="10" visible="yes" active="yes"/>
<layer number="202" name="202bmp" color="3" fill="10" visible="yes" active="yes"/>
<layer number="203" name="203bmp" color="4" fill="10" visible="yes" active="yes"/>
<layer number="204" name="204bmp" color="5" fill="10" visible="yes" active="yes"/>
<layer number="205" name="205bmp" color="6" fill="10" visible="yes" active="yes"/>
<layer number="206" name="206bmp" color="7" fill="10" visible="yes" active="yes"/>
<layer number="207" name="207bmp" color="8" fill="10" visible="yes" active="yes"/>
<layer number="208" name="208bmp" color="9" fill="10" visible="yes" active="yes"/>
<layer number="209" name="209bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="210" name="210bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="211" name="211bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="212" name="212bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="213" name="213bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="214" name="214bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="215" name="215bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="216" name="216bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="217" name="217bmp" color="18" fill="1" visible="no" active="no"/>
<layer number="218" name="218bmp" color="19" fill="1" visible="no" active="no"/>
<layer number="219" name="219bmp" color="20" fill="1" visible="no" active="no"/>
<layer number="220" name="220bmp" color="21" fill="1" visible="no" active="no"/>
<layer number="221" name="221bmp" color="22" fill="1" visible="no" active="no"/>
<layer number="222" name="222bmp" color="23" fill="1" visible="no" active="no"/>
<layer number="223" name="223bmp" color="24" fill="1" visible="no" active="no"/>
<layer number="224" name="224bmp" color="25" fill="1" visible="no" active="no"/>
<layer number="225" name="225bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="226" name="226bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="227" name="227bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="228" name="228bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="229" name="229bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="230" name="230bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="231" name="231bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="248" name="Housing" color="7" fill="1" visible="yes" active="yes"/>
<layer number="249" name="Edge" color="7" fill="1" visible="yes" active="yes"/>
<layer number="250" name="Descript" color="3" fill="1" visible="no" active="no"/>
<layer number="251" name="SMDround" color="12" fill="11" visible="no" active="no"/>
<layer number="254" name="cooling" color="7" fill="1" visible="yes" active="yes"/>
<layer number="255" name="routoute" color="7" fill="1" visible="yes" active="yes"/>
</layers>
<library>
<packages>
<package name="5PIN_KY-04">
<pad name="P$2" x="2.54" y="0" drill="1" diameter="1.9304"/>
<pad name="P$1" x="0" y="0" drill="1" diameter="1.9304" shape="square"/>
<pad name="P$3" x="5.08" y="0" drill="1" diameter="1.9304"/>
<pad name="P$4" x="7.62" y="0" drill="1" diameter="1.9304"/>
<pad name="P$5" x="10.16" y="0" drill="1" diameter="1.9304"/>
<wire x1="-2.54" y1="-1.27" x2="12.7" y2="-1.27" width="0.2" layer="21"/>
<wire x1="12.7" y1="-1.27" x2="12.7" y2="-7.62" width="0.2" layer="21"/>
<wire x1="12.7" y1="-7.62" x2="11.43" y2="-7.62" width="0.2" layer="21"/>
<wire x1="11.43" y1="-7.62" x2="10.16" y2="-7.62" width="0.2" layer="21"/>
<wire x1="10.16" y1="-7.62" x2="0" y2="-7.62" width="0.2" layer="21"/>
<wire x1="0" y1="-7.62" x2="-1.27" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-2.54" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-2.54" y1="-7.62" x2="-2.54" y2="-1.27" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-1.27" y2="-10.16" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-10.16" x2="-2.54" y2="-10.16" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-10.16" x2="11.43" y2="-10.16" width="0.2" layer="21"/>
<wire x1="12.7" y1="-10.16" x2="11.43" y2="-10.16" width="0.2" layer="21"/>
<wire x1="11.43" y1="-10.16" x2="11.43" y2="-7.62" width="0.2" layer="21"/>
<wire x1="11.43" y1="-7.62" x2="11.43" y2="-3.81" width="0.2" layer="21"/>
<wire x1="11.43" y1="-3.81" x2="10.16" y2="-3.81" width="0.2" layer="21"/>
<wire x1="10.16" y1="-3.81" x2="10.16" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-1.27" y2="-3.81" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-3.81" x2="0" y2="-3.81" width="0.2" layer="21"/>
<wire x1="0" y1="-3.81" x2="0" y2="-7.62" width="0.2" layer="21"/>
<text x="0.635" y="1.27" size="1.27" layer="25" rot="R90">GND</text>
<text x="3.175" y="1.27" size="1.27" layer="25" rot="R90">VCC</text>
<text x="-1.905" y="-12.065" size="1.27" layer="25">&gt;NAME</text>
<text x="5.715" y="1.27" size="1.27" layer="21" rot="R90">SW</text>
<text x="8.255" y="1.27" size="1.27" layer="21" rot="R90">DT</text>
<text x="10.795" y="1.27" size="1.27" layer="21" rot="R90">CLK</text>
</package>
<package name="4PIN">
<pad name="P$1" x="0" y="0" drill="1" diameter="1.9304" shape="square"/>
<pad name="P$2" x="2.54" y="0" drill="1" diameter="1.9304"/>
<pad name="P$3" x="5.08" y="0" drill="1" diameter="1.9304"/>
<pad name="P$4" x="7.62" y="0" drill="1" diameter="1.9304"/>
<wire x1="-1.27" y1="-2.54" x2="-1.27" y2="3.81" width="0.127" layer="21"/>
<wire x1="8.89" y1="3.81" x2="8.89" y2="-2.54" width="0.127" layer="21"/>
<wire x1="5.08" y1="-1.27" x2="0" y2="-1.27" width="0.127" layer="21"/>
<wire x1="0" y1="-2.54" x2="0" y2="-1.27" width="0.127" layer="21"/>
<wire x1="5.08" y1="-1.27" x2="5.08" y2="-2.54" width="0.127" layer="21"/>
<text x="-1.27" y="-5.08" size="1.27" layer="21">&gt;NAME</text>
<wire x1="0" y1="-2.54" x2="5.08" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-2.54" x2="8.89" y2="-2.54" width="0.127" layer="21"/>
<text x="0.635" y="3.81" size="1.27" layer="21" rot="R90">GND</text>
<text x="3.175" y="3.81" size="1.27" layer="21" rot="R90">VCC</text>
<text x="5.715" y="3.81" size="1.27" layer="21" rot="R90">SEN</text>
<text x="8.255" y="3.81" size="1.27" layer="21" rot="R90">CON</text>
<wire x1="-1.27" y1="3.81" x2="8.89" y2="3.81" width="0.127" layer="21"/>
</package>
<package name="2PIN">
<pad name="P$1" x="0" y="0" drill="1" diameter="1.9304" shape="square"/>
<pad name="P$2" x="5.08" y="0" drill="1" diameter="1.9304"/>
<wire x1="-2.54" y1="-3.81" x2="-2.54" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-2.54" y1="-2.54" x2="-2.54" y2="1.27" width="0.127" layer="21"/>
<wire x1="-2.54" y1="1.27" x2="-2.54" y2="1.905" width="0.127" layer="21"/>
<wire x1="-2.54" y1="1.905" x2="-2.54" y2="3.175" width="0.127" layer="21"/>
<wire x1="-2.54" y1="3.175" x2="-2.54" y2="3.81" width="0.127" layer="21"/>
<wire x1="-2.54" y1="3.81" x2="7.62" y2="3.81" width="0.127" layer="21"/>
<wire x1="7.62" y1="3.81" x2="7.62" y2="3.175" width="0.127" layer="21"/>
<wire x1="7.62" y1="3.175" x2="7.62" y2="1.905" width="0.127" layer="21"/>
<wire x1="7.62" y1="1.905" x2="7.62" y2="1.27" width="0.127" layer="21"/>
<wire x1="7.62" y1="1.27" x2="7.62" y2="-2.54" width="0.127" layer="21"/>
<wire x1="7.62" y1="-2.54" x2="7.62" y2="-3.81" width="0.127" layer="21"/>
<wire x1="7.62" y1="-3.81" x2="6.35" y2="-3.81" width="0.127" layer="21"/>
<wire x1="3.81" y1="-3.81" x2="1.27" y2="-3.81" width="0.127" layer="21"/>
<wire x1="1.27" y1="-3.81" x2="-1.27" y2="-3.81" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-3.81" x2="-2.54" y2="-3.81" width="0.127" layer="21"/>
<wire x1="-2.54" y1="3.175" x2="-3.175" y2="3.175" width="0.127" layer="21"/>
<wire x1="-3.175" y1="3.175" x2="-3.175" y2="1.905" width="0.127" layer="21"/>
<wire x1="-3.175" y1="1.905" x2="-2.54" y2="1.905" width="0.127" layer="21"/>
<wire x1="7.62" y1="3.175" x2="6.985" y2="3.175" width="0.127" layer="21"/>
<wire x1="6.985" y1="3.175" x2="6.985" y2="1.905" width="0.127" layer="21"/>
<wire x1="6.985" y1="1.905" x2="7.62" y2="1.905" width="0.127" layer="21"/>
<wire x1="-2.54" y1="1.27" x2="7.62" y2="1.27" width="0.127" layer="21"/>
<wire x1="2.54" y1="0.635" x2="2.54" y2="-1.905" width="0.127" layer="21"/>
<wire x1="-2.54" y1="-2.54" x2="-1.27" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-2.54" x2="1.27" y2="-2.54" width="0.127" layer="21"/>
<wire x1="1.27" y1="-2.54" x2="3.81" y2="-2.54" width="0.127" layer="21"/>
<wire x1="3.81" y1="-2.54" x2="6.35" y2="-2.54" width="0.127" layer="21"/>
<wire x1="6.35" y1="-2.54" x2="7.62" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-3.81" x2="-1.27" y2="-2.54" width="0.127" layer="21"/>
<wire x1="1.27" y1="-2.54" x2="1.27" y2="-3.81" width="0.127" layer="21"/>
<wire x1="3.81" y1="-2.54" x2="3.81" y2="-3.81" width="0.127" layer="21"/>
<wire x1="3.81" y1="-3.81" x2="6.35" y2="-3.81" width="0.127" layer="21"/>
<wire x1="6.35" y1="-3.81" x2="6.35" y2="-2.54" width="0.127" layer="21"/>
<text x="5.08" y="-6.35" size="1.778" layer="21">+</text>
<text x="-1.27" y="-6.35" size="1.778" layer="21">-</text>
<text x="-5.08" y="-3.81" size="1.778" layer="21" rot="R90">&gt;NAME</text>
</package>
<package name="1PIN">
<pad name="P$1" x="0" y="0" drill="1" diameter="1.9304"/>
<wire x1="-0.635" y1="1.27" x2="0.635" y2="1.27" width="0.127" layer="21"/>
<wire x1="0.635" y1="1.27" x2="1.27" y2="0.635" width="0.127" layer="21"/>
<wire x1="1.27" y1="0.635" x2="1.27" y2="-0.635" width="0.127" layer="21"/>
<wire x1="1.27" y1="-0.635" x2="0.635" y2="-1.27" width="0.127" layer="21"/>
<wire x1="0.635" y1="-1.27" x2="-0.635" y2="-1.27" width="0.127" layer="21"/>
<wire x1="-0.635" y1="-1.27" x2="-1.27" y2="-0.635" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-0.635" x2="-1.27" y2="0.635" width="0.127" layer="21"/>
<wire x1="-1.27" y1="0.635" x2="-0.635" y2="1.27" width="0.127" layer="21"/>
</package>
<package name="BUTTON">
<pad name="P$1" x="0" y="0" drill="1" diameter="1.9304"/>
<pad name="P$2" x="4.2" y="0" drill="1" diameter="1.9304"/>
<pad name="P$3" x="0" y="-6" drill="1" diameter="1.9304"/>
<pad name="P$4" x="4.2" y="-6" drill="1" diameter="1.9304" rot="R180"/>
<wire x1="-0.5" y1="0" x2="4.7" y2="0" width="0.127" layer="21"/>
<wire x1="4.7" y1="0" x2="4.7" y2="-6" width="0.127" layer="21"/>
<wire x1="4.7" y1="-6" x2="-0.5" y2="-6" width="0.127" layer="21"/>
<wire x1="-0.5" y1="-6" x2="-0.5" y2="0" width="0.127" layer="21"/>
<circle x="2.1" y="-3" radius="2" width="0.127" layer="21"/>
<text x="-2.21" y="-6.25" size="1.016" layer="25" rot="R90">&gt;NAME</text>
</package>
<package name="5PIN_LCD">
<pad name="P$2" x="2.54" y="0" drill="1" diameter="1.9304"/>
<pad name="P$1" x="0" y="0" drill="1" diameter="1.9304" shape="square"/>
<pad name="P$3" x="5.08" y="0" drill="1" diameter="1.9304"/>
<pad name="P$4" x="7.62" y="0" drill="1" diameter="1.9304"/>
<pad name="P$5" x="10.16" y="0" drill="1" diameter="1.9304"/>
<wire x1="-2.54" y1="-1.27" x2="12.7" y2="-1.27" width="0.2" layer="21"/>
<wire x1="12.7" y1="-1.27" x2="12.7" y2="-7.62" width="0.2" layer="21"/>
<wire x1="12.7" y1="-7.62" x2="11.43" y2="-7.62" width="0.2" layer="21"/>
<wire x1="11.43" y1="-7.62" x2="10.16" y2="-7.62" width="0.2" layer="21"/>
<wire x1="10.16" y1="-7.62" x2="0" y2="-7.62" width="0.2" layer="21"/>
<wire x1="0" y1="-7.62" x2="-1.27" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-2.54" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-2.54" y1="-7.62" x2="-2.54" y2="-1.27" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-1.27" y2="-10.16" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-10.16" x2="-2.54" y2="-10.16" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-10.16" x2="11.43" y2="-10.16" width="0.2" layer="21"/>
<wire x1="12.7" y1="-10.16" x2="11.43" y2="-10.16" width="0.2" layer="21"/>
<wire x1="11.43" y1="-10.16" x2="11.43" y2="-7.62" width="0.2" layer="21"/>
<wire x1="11.43" y1="-7.62" x2="11.43" y2="-3.81" width="0.2" layer="21"/>
<wire x1="11.43" y1="-3.81" x2="10.16" y2="-3.81" width="0.2" layer="21"/>
<wire x1="10.16" y1="-3.81" x2="10.16" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-1.27" y2="-3.81" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-3.81" x2="0" y2="-3.81" width="0.2" layer="21"/>
<wire x1="0" y1="-3.81" x2="0" y2="-7.62" width="0.2" layer="21"/>
<text x="0.635" y="1.27" size="1.27" layer="25" rot="R90">GND</text>
<text x="3.175" y="1.27" size="1.27" layer="25" rot="R90">VCC</text>
<text x="-1.905" y="-12.065" size="1.27" layer="25">&gt;NAME</text>
<text x="5.715" y="1.27" size="1.27" layer="21" rot="R90">SDA</text>
<text x="8.255" y="1.27" size="1.27" layer="21" rot="R90">SCL</text>
<text x="10.795" y="1.27" size="1.27" layer="21" rot="R90">LCD</text>
</package>
</packages>
<symbols>
<symbol name="5PIN_KY-04">
<pin name="GND" x="0" y="0" length="middle"/>
<pin name="VCC" x="0" y="-2.54" length="middle"/>
<pin name="SW" x="0" y="-5.08" length="middle"/>
<pin name="DT" x="0" y="-7.62" length="middle"/>
<pin name="CLK" x="0" y="-10.16" length="middle"/>
<wire x1="5.08" y1="2.54" x2="17.78" y2="2.54" width="0.254" layer="94"/>
<wire x1="17.78" y1="2.54" x2="17.78" y2="-12.7" width="0.254" layer="94"/>
<wire x1="17.78" y1="-12.7" x2="5.08" y2="-12.7" width="0.254" layer="94"/>
<wire x1="5.08" y1="-12.7" x2="5.08" y2="2.54" width="0.254" layer="94"/>
<text x="5.08" y="5.08" size="1.27" layer="95">&gt;NAME</text>
</symbol>
<symbol name="4PIN">
<pin name="GND" x="0" y="0" length="middle"/>
<pin name="VCC" x="0" y="-2.54" length="middle"/>
<pin name="SENCE" x="0" y="-5.08" length="middle"/>
<pin name="CONTROL" x="0" y="-7.62" length="middle"/>
<wire x1="5.08" y1="0" x2="5.08" y2="2.54" width="0.254" layer="94"/>
<wire x1="5.08" y1="2.54" x2="17.78" y2="2.54" width="0.254" layer="94"/>
<wire x1="17.78" y1="2.54" x2="17.78" y2="-10.16" width="0.254" layer="94"/>
<wire x1="17.78" y1="-10.16" x2="5.08" y2="-10.16" width="0.254" layer="94"/>
<wire x1="5.08" y1="-10.16" x2="5.08" y2="0" width="0.254" layer="94"/>
<text x="5.08" y="5.08" size="1.778" layer="95">&gt;NAME</text>
</symbol>
<symbol name="2PIN">
<pin name="GND" x="0" y="0" length="middle"/>
<pin name="VCC" x="0" y="-2.54" length="middle"/>
<text x="0" y="5.08" size="1.778" layer="95">&gt;NAME</text>
<wire x1="5.08" y1="2.54" x2="12.7" y2="2.54" width="0.254" layer="94"/>
<wire x1="12.7" y1="2.54" x2="12.7" y2="-5.08" width="0.254" layer="94"/>
<wire x1="12.7" y1="-5.08" x2="5.08" y2="-5.08" width="0.254" layer="94"/>
<wire x1="5.08" y1="-5.08" x2="5.08" y2="2.54" width="0.254" layer="94"/>
</symbol>
<symbol name="1PIN">
<pin name="P$1" x="0" y="0" length="middle"/>
<wire x1="5.08" y1="2.54" x2="12.7" y2="2.54" width="0.254" layer="94"/>
<wire x1="12.7" y1="2.54" x2="12.7" y2="-2.54" width="0.254" layer="94"/>
<wire x1="12.7" y1="-2.54" x2="5.08" y2="-2.54" width="0.254" layer="94"/>
<wire x1="5.08" y1="-2.54" x2="5.08" y2="2.54" width="0.254" layer="94"/>
<text x="5.08" y="5.08" size="1.778" layer="95">&gt;NAME</text>
</symbol>
<symbol name="BUTTON">
<pin name="IN1" x="0" y="0" length="middle"/>
<pin name="OUT1" x="0" y="-2.54" length="middle"/>
<pin name="IN2" x="0" y="-7.62" length="middle"/>
<pin name="OUT2" x="0" y="-10.16" length="middle"/>
<wire x1="5.08" y1="2.54" x2="15.24" y2="2.54" width="0.254" layer="94"/>
<wire x1="15.24" y1="2.54" x2="15.24" y2="-12.7" width="0.254" layer="94"/>
<wire x1="15.24" y1="-12.7" x2="5.08" y2="-12.7" width="0.254" layer="94"/>
<wire x1="5.08" y1="-12.7" x2="5.08" y2="2.54" width="0.254" layer="94"/>
<text x="5.08" y="5.08" size="1.778" layer="95">&gt;NAME</text>
</symbol>
<symbol name="5PIN_LCD">
<pin name="GND" x="0" y="0" length="middle"/>
<pin name="VCC" x="0" y="-2.54" length="middle"/>
<pin name="SDA" x="0" y="-5.08" length="middle"/>
<pin name="SCL" x="0" y="-7.62" length="middle"/>
<pin name="LED" x="0" y="-10.16" length="middle"/>
<wire x1="5.08" y1="2.54" x2="17.78" y2="2.54" width="0.254" layer="94"/>
<wire x1="17.78" y1="2.54" x2="17.78" y2="-12.7" width="0.254" layer="94"/>
<wire x1="17.78" y1="-12.7" x2="5.08" y2="-12.7" width="0.254" layer="94"/>
<wire x1="5.08" y1="-12.7" x2="5.08" y2="2.54" width="0.254" layer="94"/>
<text x="5.08" y="5.08" size="1.27" layer="95">&gt;NAME</text>
</symbol>
</symbols>
<devicesets>
<deviceset name="5PIN_KY-04">
<gates>
<gate name="G$1" symbol="5PIN_KY-04" x="5.08" y="2.54"/>
</gates>
<devices>
<device name="" package="5PIN_KY-04">
<connects>
<connect gate="G$1" pin="CLK" pad="P$5"/>
<connect gate="G$1" pin="DT" pad="P$4"/>
<connect gate="G$1" pin="GND" pad="P$1"/>
<connect gate="G$1" pin="SW" pad="P$3"/>
<connect gate="G$1" pin="VCC" pad="P$2"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="4PIN">
<gates>
<gate name="G$1" symbol="4PIN" x="10.16" y="5.08"/>
</gates>
<devices>
<device name="" package="4PIN">
<connects>
<connect gate="G$1" pin="CONTROL" pad="P$4"/>
<connect gate="G$1" pin="GND" pad="P$1"/>
<connect gate="G$1" pin="SENCE" pad="P$3"/>
<connect gate="G$1" pin="VCC" pad="P$2"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="2PIN">
<gates>
<gate name="G$1" symbol="2PIN" x="2.54" y="0"/>
</gates>
<devices>
<device name="" package="2PIN">
<connects>
<connect gate="G$1" pin="GND" pad="P$1"/>
<connect gate="G$1" pin="VCC" pad="P$2"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="1PIN">
<gates>
<gate name="G$1" symbol="1PIN" x="0" y="0"/>
</gates>
<devices>
<device name="" package="1PIN">
<connects>
<connect gate="G$1" pin="P$1" pad="P$1"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="BUTTON">
<gates>
<gate name="G$1" symbol="BUTTON" x="0" y="0"/>
</gates>
<devices>
<device name="" package="BUTTON">
<connects>
<connect gate="G$1" pin="IN1" pad="P$1"/>
<connect gate="G$1" pin="IN2" pad="P$3"/>
<connect gate="G$1" pin="OUT1" pad="P$2"/>
<connect gate="G$1" pin="OUT2" pad="P$4"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="5PIN_LCD">
<gates>
<gate name="G$1" symbol="5PIN_LCD" x="5.08" y="5.08"/>
</gates>
<devices>
<device name="" package="5PIN_LCD">
<connects>
<connect gate="G$1" pin="GND" pad="P$1"/>
<connect gate="G$1" pin="LED" pad="P$5"/>
<connect gate="G$1" pin="SCL" pad="P$4"/>
<connect gate="G$1" pin="SDA" pad="P$3"/>
<connect gate="G$1" pin="VCC" pad="P$2"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
</devicesets>
</library>
</drawing>
</eagle>

View File

@ -0,0 +1,334 @@
[Eagle]
Version="09 03 00"
Platform="Windows"
Globals="Globals"
Desktop="Desktop"
[Globals]
AutoSaveProject=1
UsedLibraryUrn="urn:adsk.eagle:library:79"
UsedLibraryUrn="urn:adsk.eagle:library:88"
UsedLibraryUrn="urn:adsk.eagle:library:201"
UsedLibraryUrn="urn:adsk.eagle:library:202"
UsedLibraryUrn="urn:adsk.eagle:library:203"
UsedLibraryUrn="urn:adsk.eagle:library:204"
UsedLibraryUrn="urn:adsk.eagle:library:206"
UsedLibraryUrn="urn:adsk.eagle:library:208"
UsedLibraryUrn="urn:adsk.eagle:library:210"
UsedLibraryUrn="urn:adsk.eagle:library:211"
UsedLibraryUrn="urn:adsk.eagle:library:212"
UsedLibraryUrn="urn:adsk.eagle:library:213"
UsedLibraryUrn="urn:adsk.eagle:library:89"
UsedLibraryUrn="urn:adsk.eagle:library:214"
UsedLibraryUrn="urn:adsk.eagle:library:215"
UsedLibraryUrn="urn:adsk.eagle:library:218"
UsedLibraryUrn="urn:adsk.eagle:library:220"
UsedLibraryUrn="urn:adsk.eagle:library:221"
UsedLibraryUrn="urn:adsk.eagle:library:222"
UsedLibraryUrn="urn:adsk.eagle:library:224"
UsedLibraryUrn="urn:adsk.eagle:library:226"
UsedLibraryUrn="urn:adsk.eagle:library:229"
UsedLibraryUrn="urn:adsk.eagle:library:230"
UsedLibraryUrn="urn:adsk.eagle:library:90"
UsedLibraryUrn="urn:adsk.eagle:library:231"
UsedLibraryUrn="urn:adsk.eagle:library:233"
UsedLibraryUrn="urn:adsk.eagle:library:234"
UsedLibraryUrn="urn:adsk.eagle:library:235"
UsedLibraryUrn="urn:adsk.eagle:library:236"
UsedLibraryUrn="urn:adsk.eagle:library:237"
UsedLibraryUrn="urn:adsk.eagle:library:238"
UsedLibraryUrn="urn:adsk.eagle:library:239"
UsedLibraryUrn="urn:adsk.eagle:library:240"
UsedLibraryUrn="urn:adsk.eagle:library:241"
UsedLibraryUrn="urn:adsk.eagle:library:93"
UsedLibraryUrn="urn:adsk.eagle:library:242"
UsedLibraryUrn="urn:adsk.eagle:library:243"
UsedLibraryUrn="urn:adsk.eagle:library:244"
UsedLibraryUrn="urn:adsk.eagle:library:245"
UsedLibraryUrn="urn:adsk.eagle:library:248"
UsedLibraryUrn="urn:adsk.eagle:library:250"
UsedLibraryUrn="urn:adsk.eagle:library:251"
UsedLibraryUrn="urn:adsk.eagle:library:252"
UsedLibraryUrn="urn:adsk.eagle:library:255"
UsedLibraryUrn="urn:adsk.eagle:library:256"
UsedLibraryUrn="urn:adsk.eagle:library:94"
UsedLibraryUrn="urn:adsk.eagle:library:258"
UsedLibraryUrn="urn:adsk.eagle:library:259"
UsedLibraryUrn="urn:adsk.eagle:library:260"
UsedLibraryUrn="urn:adsk.eagle:library:261"
UsedLibraryUrn="urn:adsk.eagle:library:262"
UsedLibraryUrn="urn:adsk.eagle:library:263"
UsedLibraryUrn="urn:adsk.eagle:library:264"
UsedLibraryUrn="urn:adsk.eagle:library:265"
UsedLibraryUrn="urn:adsk.eagle:library:266"
UsedLibraryUrn="urn:adsk.eagle:library:267"
UsedLibraryUrn="urn:adsk.eagle:library:96"
UsedLibraryUrn="urn:adsk.eagle:library:269"
UsedLibraryUrn="urn:adsk.eagle:library:270"
UsedLibraryUrn="urn:adsk.eagle:library:272"
UsedLibraryUrn="urn:adsk.eagle:library:273"
UsedLibraryUrn="urn:adsk.eagle:library:274"
UsedLibraryUrn="urn:adsk.eagle:library:275"
UsedLibraryUrn="urn:adsk.eagle:library:276"
UsedLibraryUrn="urn:adsk.eagle:library:278"
UsedLibraryUrn="urn:adsk.eagle:library:279"
UsedLibraryUrn="urn:adsk.eagle:library:281"
UsedLibraryUrn="urn:adsk.eagle:library:97"
UsedLibraryUrn="urn:adsk.eagle:library:283"
UsedLibraryUrn="urn:adsk.eagle:library:284"
UsedLibraryUrn="urn:adsk.eagle:library:285"
UsedLibraryUrn="urn:adsk.eagle:library:287"
UsedLibraryUrn="urn:adsk.eagle:library:288"
UsedLibraryUrn="urn:adsk.eagle:library:289"
UsedLibraryUrn="urn:adsk.eagle:library:290"
UsedLibraryUrn="urn:adsk.eagle:library:291"
UsedLibraryUrn="urn:adsk.eagle:library:293"
UsedLibraryUrn="urn:adsk.eagle:library:294"
UsedLibraryUrn="urn:adsk.eagle:library:98"
UsedLibraryUrn="urn:adsk.eagle:library:296"
UsedLibraryUrn="urn:adsk.eagle:library:297"
UsedLibraryUrn="urn:adsk.eagle:library:298"
UsedLibraryUrn="urn:adsk.eagle:library:300"
UsedLibraryUrn="urn:adsk.eagle:library:302"
UsedLibraryUrn="urn:adsk.eagle:library:303"
UsedLibraryUrn="urn:adsk.eagle:library:304"
UsedLibraryUrn="urn:adsk.eagle:library:307"
UsedLibraryUrn="urn:adsk.eagle:library:312"
UsedLibraryUrn="urn:adsk.eagle:library:313"
UsedLibraryUrn="urn:adsk.eagle:library:99"
UsedLibraryUrn="urn:adsk.eagle:library:314"
UsedLibraryUrn="urn:adsk.eagle:library:315"
UsedLibraryUrn="urn:adsk.eagle:library:317"
UsedLibraryUrn="urn:adsk.eagle:library:318"
UsedLibraryUrn="urn:adsk.eagle:library:319"
UsedLibraryUrn="urn:adsk.eagle:library:320"
UsedLibraryUrn="urn:adsk.eagle:library:322"
UsedLibraryUrn="urn:adsk.eagle:library:323"
UsedLibraryUrn="urn:adsk.eagle:library:324"
UsedLibraryUrn="urn:adsk.eagle:library:325"
UsedLibraryUrn="urn:adsk.eagle:library:102"
UsedLibraryUrn="urn:adsk.eagle:library:327"
UsedLibraryUrn="urn:adsk.eagle:library:328"
UsedLibraryUrn="urn:adsk.eagle:library:331"
UsedLibraryUrn="urn:adsk.eagle:library:332"
UsedLibraryUrn="urn:adsk.eagle:library:334"
UsedLibraryUrn="urn:adsk.eagle:library:335"
UsedLibraryUrn="urn:adsk.eagle:library:336"
UsedLibraryUrn="urn:adsk.eagle:library:337"
UsedLibraryUrn="urn:adsk.eagle:library:338"
UsedLibraryUrn="urn:adsk.eagle:library:339"
UsedLibraryUrn="urn:adsk.eagle:library:80"
UsedLibraryUrn="urn:adsk.eagle:library:105"
UsedLibraryUrn="urn:adsk.eagle:library:341"
UsedLibraryUrn="urn:adsk.eagle:library:342"
UsedLibraryUrn="urn:adsk.eagle:library:343"
UsedLibraryUrn="urn:adsk.eagle:library:344"
UsedLibraryUrn="urn:adsk.eagle:library:346"
UsedLibraryUrn="urn:adsk.eagle:library:347"
UsedLibraryUrn="urn:adsk.eagle:library:350"
UsedLibraryUrn="urn:adsk.eagle:library:351"
UsedLibraryUrn="urn:adsk.eagle:library:353"
UsedLibraryUrn="urn:adsk.eagle:library:358"
UsedLibraryUrn="urn:adsk.eagle:library:107"
UsedLibraryUrn="urn:adsk.eagle:library:360"
UsedLibraryUrn="urn:adsk.eagle:library:361"
UsedLibraryUrn="urn:adsk.eagle:library:362"
UsedLibraryUrn="urn:adsk.eagle:library:364"
UsedLibraryUrn="urn:adsk.eagle:library:366"
UsedLibraryUrn="urn:adsk.eagle:library:367"
UsedLibraryUrn="urn:adsk.eagle:library:368"
UsedLibraryUrn="urn:adsk.eagle:library:369"
UsedLibraryUrn="urn:adsk.eagle:library:371"
UsedLibraryUrn="urn:adsk.eagle:library:372"
UsedLibraryUrn="urn:adsk.eagle:library:109"
UsedLibraryUrn="urn:adsk.eagle:library:373"
UsedLibraryUrn="urn:adsk.eagle:library:374"
UsedLibraryUrn="urn:adsk.eagle:library:375"
UsedLibraryUrn="urn:adsk.eagle:library:376"
UsedLibraryUrn="urn:adsk.eagle:library:377"
UsedLibraryUrn="urn:adsk.eagle:library:378"
UsedLibraryUrn="urn:adsk.eagle:library:379"
UsedLibraryUrn="urn:adsk.eagle:library:380"
UsedLibraryUrn="urn:adsk.eagle:library:382"
UsedLibraryUrn="urn:adsk.eagle:library:383"
UsedLibraryUrn="urn:adsk.eagle:library:111"
UsedLibraryUrn="urn:adsk.eagle:library:385"
UsedLibraryUrn="urn:adsk.eagle:library:386"
UsedLibraryUrn="urn:adsk.eagle:library:387"
UsedLibraryUrn="urn:adsk.eagle:library:388"
UsedLibraryUrn="urn:adsk.eagle:library:389"
UsedLibraryUrn="urn:adsk.eagle:library:391"
UsedLibraryUrn="urn:adsk.eagle:library:392"
UsedLibraryUrn="urn:adsk.eagle:library:393"
UsedLibraryUrn="urn:adsk.eagle:library:394"
UsedLibraryUrn="urn:adsk.eagle:library:396"
UsedLibraryUrn="urn:adsk.eagle:library:112"
UsedLibraryUrn="urn:adsk.eagle:library:397"
UsedLibraryUrn="urn:adsk.eagle:library:398"
UsedLibraryUrn="urn:adsk.eagle:library:399"
UsedLibraryUrn="urn:adsk.eagle:library:400"
UsedLibraryUrn="urn:adsk.eagle:library:401"
UsedLibraryUrn="urn:adsk.eagle:library:402"
UsedLibraryUrn="urn:adsk.eagle:library:403"
UsedLibraryUrn="urn:adsk.eagle:library:404"
UsedLibraryUrn="urn:adsk.eagle:library:407"
UsedLibraryUrn="urn:adsk.eagle:library:408"
UsedLibraryUrn="urn:adsk.eagle:library:113"
UsedLibraryUrn="urn:adsk.eagle:library:409"
UsedLibraryUrn="urn:adsk.eagle:library:410"
UsedLibraryUrn="urn:adsk.eagle:library:411"
UsedLibraryUrn="urn:adsk.eagle:library:412"
UsedLibraryUrn="urn:adsk.eagle:library:417"
UsedLibraryUrn="urn:adsk.eagle:library:418"
UsedLibraryUrn="urn:adsk.eagle:library:419"
UsedLibraryUrn="urn:adsk.eagle:library:527439"
UsedLibraryUrn="urn:adsk.eagle:library:420"
UsedLibraryUrn="urn:adsk.eagle:library:509"
UsedLibraryUrn="urn:adsk.eagle:library:116"
UsedLibraryUrn="urn:adsk.eagle:library:117"
UsedLibraryUrn="urn:adsk.eagle:library:118"
UsedLibraryUrn="urn:adsk.eagle:library:119"
UsedLibraryUrn="urn:adsk.eagle:library:81"
UsedLibraryUrn="urn:adsk.eagle:library:121"
UsedLibraryUrn="urn:adsk.eagle:library:122"
UsedLibraryUrn="urn:adsk.eagle:library:123"
UsedLibraryUrn="urn:adsk.eagle:library:124"
UsedLibraryUrn="urn:adsk.eagle:library:125"
UsedLibraryUrn="urn:adsk.eagle:library:126"
UsedLibraryUrn="urn:adsk.eagle:library:127"
UsedLibraryUrn="urn:adsk.eagle:library:128"
UsedLibraryUrn="urn:adsk.eagle:library:129"
UsedLibraryUrn="urn:adsk.eagle:library:130"
UsedLibraryUrn="urn:adsk.eagle:library:82"
UsedLibraryUrn="urn:adsk.eagle:library:132"
UsedLibraryUrn="urn:adsk.eagle:library:133"
UsedLibraryUrn="urn:adsk.eagle:library:134"
UsedLibraryUrn="urn:adsk.eagle:library:135"
UsedLibraryUrn="urn:adsk.eagle:library:136"
UsedLibraryUrn="urn:adsk.eagle:library:138"
UsedLibraryUrn="urn:adsk.eagle:library:139"
UsedLibraryUrn="urn:adsk.eagle:library:140"
UsedLibraryUrn="urn:adsk.eagle:library:141"
UsedLibraryUrn="urn:adsk.eagle:library:143"
UsedLibraryUrn="urn:adsk.eagle:library:83"
UsedLibraryUrn="urn:adsk.eagle:library:144"
UsedLibraryUrn="urn:adsk.eagle:library:145"
UsedLibraryUrn="urn:adsk.eagle:library:147"
UsedLibraryUrn="urn:adsk.eagle:library:148"
UsedLibraryUrn="urn:adsk.eagle:library:149"
UsedLibraryUrn="urn:adsk.eagle:library:150"
UsedLibraryUrn="urn:adsk.eagle:library:151"
UsedLibraryUrn="urn:adsk.eagle:library:152"
UsedLibraryUrn="urn:adsk.eagle:library:153"
UsedLibraryUrn="urn:adsk.eagle:library:154"
UsedLibraryUrn="urn:adsk.eagle:library:84"
UsedLibraryUrn="urn:adsk.eagle:library:155"
UsedLibraryUrn="urn:adsk.eagle:library:156"
UsedLibraryUrn="urn:adsk.eagle:library:157"
UsedLibraryUrn="urn:adsk.eagle:library:158"
UsedLibraryUrn="urn:adsk.eagle:library:159"
UsedLibraryUrn="urn:adsk.eagle:library:160"
UsedLibraryUrn="urn:adsk.eagle:library:161"
UsedLibraryUrn="urn:adsk.eagle:library:162"
UsedLibraryUrn="urn:adsk.eagle:library:163"
UsedLibraryUrn="urn:adsk.eagle:library:164"
UsedLibraryUrn="urn:adsk.eagle:library:85"
UsedLibraryUrn="urn:adsk.eagle:library:165"
UsedLibraryUrn="urn:adsk.eagle:library:166"
UsedLibraryUrn="urn:adsk.eagle:library:167"
UsedLibraryUrn="urn:adsk.eagle:library:169"
UsedLibraryUrn="urn:adsk.eagle:library:170"
UsedLibraryUrn="urn:adsk.eagle:library:171"
UsedLibraryUrn="urn:adsk.eagle:library:172"
UsedLibraryUrn="urn:adsk.eagle:library:173"
UsedLibraryUrn="urn:adsk.eagle:library:174"
UsedLibraryUrn="urn:adsk.eagle:library:175"
UsedLibraryUrn="urn:adsk.eagle:library:86"
UsedLibraryUrn="urn:adsk.eagle:library:176"
UsedLibraryUrn="urn:adsk.eagle:library:177"
UsedLibraryUrn="urn:adsk.eagle:library:179"
UsedLibraryUrn="urn:adsk.eagle:library:180"
UsedLibraryUrn="urn:adsk.eagle:library:181"
UsedLibraryUrn="urn:adsk.eagle:library:182"
UsedLibraryUrn="urn:adsk.eagle:library:183"
UsedLibraryUrn="urn:adsk.eagle:library:184"
UsedLibraryUrn="urn:adsk.eagle:library:188"
UsedLibraryUrn="urn:adsk.eagle:library:189"
UsedLibraryUrn="urn:adsk.eagle:library:87"
UsedLibraryUrn="urn:adsk.eagle:library:190"
UsedLibraryUrn="urn:adsk.eagle:library:191"
UsedLibraryUrn="urn:adsk.eagle:library:192"
UsedLibraryUrn="urn:adsk.eagle:library:193"
UsedLibraryUrn="urn:adsk.eagle:library:194"
UsedLibraryUrn="urn:adsk.eagle:library:195"
UsedLibraryUrn="urn:adsk.eagle:library:196"
UsedLibraryUrn="urn:adsk.eagle:library:197"
UsedLibraryUrn="urn:adsk.eagle:library:198"
UsedLibraryUrn="urn:adsk.eagle:library:199"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/433MHz.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/DUAL20PINCON.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/ESP8266.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/HEATSINK.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/L298N.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/MOLEX-SELF.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/RJ45FOOT.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/SparkFun-Boards.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/TINYRTC.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/c.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/iSpindel.lbr"
UsedLibrary="C:/Users/sigel/Documents/EAGLE/libraries/stir_shield.lbr"
[Win_1]
Type="Schematic Editor"
Number=2
File="stir-shield.sch"
View="-11.6227 -79.9277 187.93 105.328"
WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524"
PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6"
ViaDiameters=" 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1 1.05 1.1 1.15 1.2 1.3 0"
ViaDrills=" 0.2 0.25 0.3 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 1 0.35"
HoleDrills=" 0.2 0.25 0.3 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 1 0.35"
TextSizes=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.9304 2.1844 2.54 3.81 5.08 6.4516 1.778"
PolygonSpacings=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 5.08 6.4516 1.27"
PolygonIsolates=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
MiterRadiuss=" 0.254 0.3175 0.635 1.27 2.54 1 2 2.5 5 7.5 10 0"
DimensionWidths=" 0 0.127 0.254 0.1 0.26 0.13"
DimensionExtWidths=" 0.127 0.254 0.1 0.13 0.26 0"
DimensionExtLengths=" 1.27 2.54 1 2 3 0"
DimensionExtOffsets=" 1.27 2.54 1 2 3 0"
SmdSizes=" 0.3048 0.1524 0.4064 0.2032 0.6096 0.3048 0.8128 0.4064 1.016 0.508 1.27 0.6604 1.4224 0.7112 1.6764 0.8128 1.778 0.9144 1.9304 0.9652 2.1844 1.0668 2.54 1.27 3.81 1.9304 5.08 2.54 6.4516 3.2512 1.27 0.635"
WireBend=0
WireBendSet=31
WireCap=1
MiterStyle=1
PadShape=0
ViaShape=1
PolygonPour=0
PolygonRank=0
PolygonThermals=1
PolygonOrphans=0
TextRatio=8
DimensionUnit=1
DimensionPrecision=2
DimensionShowUnit=0
PinDirection=3
PinFunction=0
PinLength=2
PinVisible=3
SwapLevel=0
ArcDirection=0
AddLevel=2
PadsSameType=0
Layer=91
Views=" 1: -11.6227 -79.9277 187.93 105.328"
Sheet="1"
[Win_2]
Type="Control Panel"
Number=0
[Desktop]
Screen="3600 1080"
Window="Win_1"
Window="Win_2"

View File

@ -0,0 +1,992 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
<eagle version="9.3.0">
<drawing>
<settings>
<setting alwaysvectorfont="no"/>
<setting verticaltext="up"/>
</settings>
<grid distance="12.5" unitdist="mil" unit="mil" style="lines" multiple="1" display="no" altdistance="5" altunitdist="mil" altunit="mil"/>
<layers>
<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>
<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>
<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>
<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>
<layer number="20" name="Dimension" color="24" fill="1" visible="yes" active="yes"/>
<layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes"/>
<layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes"/>
<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes"/>
<layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes"/>
<layer number="31" name="tCream" color="7" fill="4" visible="no" active="yes"/>
<layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes"/>
<layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes"/>
<layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes"/>
<layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes"/>
<layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes"/>
<layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes"/>
<layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes"/>
<layer number="39" name="tKeepout" color="4" fill="11" visible="yes" active="yes"/>
<layer number="40" name="bKeepout" color="1" fill="11" visible="yes" active="yes"/>
<layer number="41" name="tRestrict" color="4" fill="10" visible="yes" active="yes"/>
<layer number="42" name="bRestrict" color="1" fill="10" visible="yes" active="yes"/>
<layer number="43" name="vRestrict" color="2" fill="10" visible="yes" active="yes"/>
<layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes"/>
<layer number="45" name="Holes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes"/>
<layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes"/>
<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>
<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>
<layer number="50" name="dxf" color="7" fill="1" visible="no" active="no"/>
<layer number="51" name="tDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="52" name="bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="53" name="tGND_GNDA" color="7" fill="9" visible="no" active="no"/>
<layer number="54" name="bGND_GNDA" color="1" fill="9" visible="no" active="no"/>
<layer number="56" name="wert" color="7" fill="1" visible="no" active="no"/>
<layer number="57" name="tCAD" color="7" fill="1" visible="no" active="no"/>
<layer number="59" name="tCarbon" color="7" fill="1" visible="no" active="no"/>
<layer number="60" name="bCarbon" color="7" fill="1" visible="no" active="no"/>
<layer number="88" name="SimResults" color="9" fill="1" visible="no" active="no"/>
<layer number="89" name="SimProbes" color="9" fill="1" visible="no" active="no"/>
<layer number="90" name="Modules" color="5" fill="1" visible="no" active="no"/>
<layer number="91" name="Nets" color="2" fill="1" visible="no" active="no"/>
<layer number="92" name="Busses" color="1" fill="1" visible="no" active="no"/>
<layer number="93" name="Pins" color="2" fill="1" visible="no" active="no"/>
<layer number="94" name="Symbols" color="4" fill="1" visible="no" active="no"/>
<layer number="95" name="Names" color="7" fill="1" visible="no" active="no"/>
<layer number="96" name="Values" color="7" fill="1" visible="no" active="no"/>
<layer number="97" name="Info" color="7" fill="1" visible="no" active="no"/>
<layer number="98" name="Guide" color="6" fill="1" visible="no" active="no"/>
<layer number="99" name="SpiceOrder" color="7" fill="1" visible="no" active="no"/>
<layer number="100" name="Muster" color="7" fill="1" visible="no" active="no"/>
<layer number="101" name="Patch_Top" color="12" fill="4" visible="yes" active="yes"/>
<layer number="102" name="Vscore" color="7" fill="1" visible="yes" active="yes"/>
<layer number="103" name="tMap" color="7" fill="1" visible="yes" active="yes"/>
<layer number="104" name="Name" color="16" fill="1" visible="yes" active="yes"/>
<layer number="105" name="tPlate" color="7" fill="1" visible="yes" active="yes"/>
<layer number="106" name="bPlate" color="7" fill="1" visible="yes" active="yes"/>
<layer number="107" name="Crop" color="7" fill="1" visible="yes" active="yes"/>
<layer number="108" name="tplace-old" color="10" fill="1" visible="yes" active="yes"/>
<layer number="109" name="ref-old" color="11" fill="1" visible="yes" active="yes"/>
<layer number="110" name="fp0" color="7" fill="1" visible="yes" active="yes"/>
<layer number="111" name="LPC17xx" color="7" fill="1" visible="yes" active="yes"/>
<layer number="112" name="tSilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="113" name="IDFDebug" color="7" fill="1" visible="yes" active="yes"/>
<layer number="114" name="Badge_Outline" color="11" fill="1" visible="no" active="no"/>
<layer number="115" name="ReferenceISLANDS" color="7" fill="1" visible="yes" active="yes"/>
<layer number="116" name="Patch_BOT" color="9" fill="4" visible="yes" active="yes"/>
<layer number="118" name="Rect_Pads" color="7" fill="1" visible="yes" active="yes"/>
<layer number="121" name="_tsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="122" name="_bsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="123" name="tTestmark" color="7" fill="1" visible="yes" active="yes"/>
<layer number="124" name="bTestmark" color="7" fill="1" visible="yes" active="yes"/>
<layer number="125" name="_tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="126" name="_bNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="127" name="_tValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="128" name="_bValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="129" name="Mask" color="7" fill="1" visible="yes" active="yes"/>
<layer number="131" name="tAdjust" color="7" fill="1" visible="yes" active="yes"/>
<layer number="132" name="bAdjust" color="7" fill="1" visible="yes" active="yes"/>
<layer number="144" name="Drill_legend" color="7" fill="1" visible="yes" active="yes"/>
<layer number="150" name="Notes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="151" name="HeatSink" color="7" fill="1" visible="yes" active="yes"/>
<layer number="152" name="_bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="153" name="FabDoc1" color="7" fill="1" visible="yes" active="yes"/>
<layer number="154" name="FabDoc2" color="7" fill="1" visible="yes" active="yes"/>
<layer number="155" name="FabDoc3" color="7" fill="1" visible="yes" active="yes"/>
<layer number="199" name="Contour" color="7" fill="1" visible="yes" active="yes"/>
<layer number="200" name="200bmp" color="1" fill="10" visible="yes" active="yes"/>
<layer number="201" name="201bmp" color="2" fill="10" visible="yes" active="yes"/>
<layer number="202" name="202bmp" color="3" fill="10" visible="yes" active="yes"/>
<layer number="203" name="203bmp" color="4" fill="10" visible="yes" active="yes"/>
<layer number="204" name="204bmp" color="5" fill="10" visible="yes" active="yes"/>
<layer number="205" name="205bmp" color="6" fill="10" visible="yes" active="yes"/>
<layer number="206" name="206bmp" color="7" fill="10" visible="yes" active="yes"/>
<layer number="207" name="207bmp" color="8" fill="10" visible="yes" active="yes"/>
<layer number="208" name="208bmp" color="9" fill="10" visible="yes" active="yes"/>
<layer number="209" name="209bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="210" name="210bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="211" name="211bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="212" name="212bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="213" name="213bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="214" name="214bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="215" name="215bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="216" name="216bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="217" name="217bmp" color="18" fill="1" visible="no" active="no"/>
<layer number="218" name="218bmp" color="19" fill="1" visible="no" active="no"/>
<layer number="219" name="219bmp" color="20" fill="1" visible="no" active="no"/>
<layer number="220" name="220bmp" color="21" fill="1" visible="no" active="no"/>
<layer number="221" name="221bmp" color="22" fill="1" visible="no" active="no"/>
<layer number="222" name="222bmp" color="23" fill="1" visible="no" active="no"/>
<layer number="223" name="223bmp" color="24" fill="1" visible="no" active="no"/>
<layer number="224" name="224bmp" color="25" fill="1" visible="no" active="no"/>
<layer number="225" name="225bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="226" name="226bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="227" name="227bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="228" name="228bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="229" name="229bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="230" name="230bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="231" name="231bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="232" name="Eagle3D_PG2" color="7" fill="1" visible="no" active="no"/>
<layer number="233" name="Eagle3D_PG3" color="7" fill="1" visible="no" active="no"/>
<layer number="248" name="Housing" color="7" fill="1" visible="yes" active="yes"/>
<layer number="249" name="Edge" color="7" fill="1" visible="yes" active="yes"/>
<layer number="250" name="Descript" color="3" fill="1" visible="no" active="no"/>
<layer number="251" name="SMDround" color="12" fill="11" visible="no" active="no"/>
<layer number="254" name="cooling" color="7" fill="1" visible="yes" active="yes"/>
<layer number="255" name="routoute" color="7" fill="1" visible="yes" active="yes"/>
</layers>
<board>
<plain>
<wire x1="0" y1="50.83" x2="0" y2="2.5" width="0" layer="20"/>
<wire x1="0" y1="2.5" x2="2.5" y2="0" width="0" layer="20"/>
<wire x1="2.5" y1="0" x2="57.368" y2="-0.254" width="0" layer="20"/>
<wire x1="57.368" y1="-0.254" x2="57.321953125" y2="2.404778125" width="0" layer="20"/>
<wire x1="57.321953125" y1="2.404778125" x2="59.912146875" y2="5.0109375" width="0" layer="20"/>
<wire x1="59.912146875" y1="5.0109375" x2="59.809484375" y2="37.7148375" width="0" layer="20"/>
<wire x1="59.809484375" y1="37.7148375" x2="57.283425" y2="40.4506" width="0" layer="20"/>
<wire x1="57.283425" y1="40.4506" x2="57.12" y2="51.74" width="0" layer="20"/>
<wire x1="57.12" y1="51.74" x2="55.59" y2="53.33" width="0" layer="20"/>
<wire x1="55.59" y1="53.33" x2="2.5" y2="53.33" width="0" layer="20"/>
<wire x1="2.5" y1="53.33" x2="0" y2="50.83" width="0" layer="20"/>
<text x="13.97" y="13.97" size="1.4224" layer="25" rot="R90">F1 Power Control</text>
<text x="19.05" y="13.97" size="1.4224" layer="25" rot="R90">F2 Power Control</text>
<text x="5.08" y="34.29" size="2.1844" layer="25" rot="R90">Stir Shield</text>
<text x="57.15" y="8.89" size="1.27" layer="25" rot="R90">https://github.com/micworg/stir</text>
</plain>
<libraries>
<library name="stir_shield">
<packages>
<package name="4PIN">
<pad name="P$1" x="0" y="0" drill="0.8" diameter="1.9304" shape="square"/>
<pad name="P$2" x="2.54" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$3" x="5.08" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$4" x="7.62" y="0" drill="0.8" diameter="1.9304"/>
<wire x1="-1.27" y1="-2.54" x2="-1.27" y2="3.81" width="0.127" layer="21"/>
<wire x1="8.89" y1="3.81" x2="8.89" y2="-2.54" width="0.127" layer="21"/>
<wire x1="5.08" y1="-1.27" x2="0" y2="-1.27" width="0.127" layer="21"/>
<wire x1="0" y1="-2.54" x2="0" y2="-1.27" width="0.127" layer="21"/>
<wire x1="5.08" y1="-1.27" x2="5.08" y2="-2.54" width="0.127" layer="21"/>
<text x="-1.27" y="-5.08" size="1.27" layer="21">&gt;NAME</text>
<wire x1="0" y1="-2.54" x2="5.08" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-2.54" x2="8.89" y2="-2.54" width="0.127" layer="21"/>
<text x="0.635" y="3.81" size="1.27" layer="21" rot="R90">GND</text>
<text x="3.175" y="3.81" size="1.27" layer="21" rot="R90">VCC</text>
<text x="5.715" y="3.81" size="1.27" layer="21" rot="R90">SEN</text>
<text x="8.255" y="3.81" size="1.27" layer="21" rot="R90">CON</text>
<wire x1="-1.27" y1="3.81" x2="8.89" y2="3.81" width="0.127" layer="21"/>
</package>
<package name="1PIN">
<pad name="P$1" x="0" y="0" drill="0.8" diameter="1.9304"/>
<wire x1="-0.635" y1="1.27" x2="0.635" y2="1.27" width="0.127" layer="21"/>
<wire x1="0.635" y1="1.27" x2="1.27" y2="0.635" width="0.127" layer="21"/>
<wire x1="1.27" y1="0.635" x2="1.27" y2="-0.635" width="0.127" layer="21"/>
<wire x1="1.27" y1="-0.635" x2="0.635" y2="-1.27" width="0.127" layer="21"/>
<wire x1="0.635" y1="-1.27" x2="-0.635" y2="-1.27" width="0.127" layer="21"/>
<wire x1="-0.635" y1="-1.27" x2="-1.27" y2="-0.635" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-0.635" x2="-1.27" y2="0.635" width="0.127" layer="21"/>
<wire x1="-1.27" y1="0.635" x2="-0.635" y2="1.27" width="0.127" layer="21"/>
</package>
<package name="2PIN">
<pad name="P$1" x="0" y="0" drill="1" diameter="1.9304" shape="square"/>
<pad name="P$2" x="5.08" y="0" drill="1" diameter="1.9304"/>
<wire x1="-2.54" y1="-3.81" x2="-2.54" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-2.54" y1="-2.54" x2="-2.54" y2="1.27" width="0.127" layer="21"/>
<wire x1="-2.54" y1="1.27" x2="-2.54" y2="1.905" width="0.127" layer="21"/>
<wire x1="-2.54" y1="1.905" x2="-2.54" y2="3.175" width="0.127" layer="21"/>
<wire x1="-2.54" y1="3.175" x2="-2.54" y2="3.81" width="0.127" layer="21"/>
<wire x1="-2.54" y1="3.81" x2="7.62" y2="3.81" width="0.127" layer="21"/>
<wire x1="7.62" y1="3.81" x2="7.62" y2="3.175" width="0.127" layer="21"/>
<wire x1="7.62" y1="3.175" x2="7.62" y2="1.905" width="0.127" layer="21"/>
<wire x1="7.62" y1="1.905" x2="7.62" y2="1.27" width="0.127" layer="21"/>
<wire x1="7.62" y1="1.27" x2="7.62" y2="-2.54" width="0.127" layer="21"/>
<wire x1="7.62" y1="-2.54" x2="7.62" y2="-3.81" width="0.127" layer="21"/>
<wire x1="7.62" y1="-3.81" x2="6.35" y2="-3.81" width="0.127" layer="21"/>
<wire x1="3.81" y1="-3.81" x2="1.27" y2="-3.81" width="0.127" layer="21"/>
<wire x1="1.27" y1="-3.81" x2="-1.27" y2="-3.81" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-3.81" x2="-2.54" y2="-3.81" width="0.127" layer="21"/>
<wire x1="-2.54" y1="3.175" x2="-3.175" y2="3.175" width="0.127" layer="21"/>
<wire x1="-3.175" y1="3.175" x2="-3.175" y2="1.905" width="0.127" layer="21"/>
<wire x1="-3.175" y1="1.905" x2="-2.54" y2="1.905" width="0.127" layer="21"/>
<wire x1="7.62" y1="3.175" x2="6.985" y2="3.175" width="0.127" layer="21"/>
<wire x1="6.985" y1="3.175" x2="6.985" y2="1.905" width="0.127" layer="21"/>
<wire x1="6.985" y1="1.905" x2="7.62" y2="1.905" width="0.127" layer="21"/>
<wire x1="-2.54" y1="1.27" x2="7.62" y2="1.27" width="0.127" layer="21"/>
<wire x1="2.54" y1="0.635" x2="2.54" y2="-1.905" width="0.127" layer="21"/>
<wire x1="-2.54" y1="-2.54" x2="-1.27" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-2.54" x2="1.27" y2="-2.54" width="0.127" layer="21"/>
<wire x1="1.27" y1="-2.54" x2="3.81" y2="-2.54" width="0.127" layer="21"/>
<wire x1="3.81" y1="-2.54" x2="6.35" y2="-2.54" width="0.127" layer="21"/>
<wire x1="6.35" y1="-2.54" x2="7.62" y2="-2.54" width="0.127" layer="21"/>
<wire x1="-1.27" y1="-3.81" x2="-1.27" y2="-2.54" width="0.127" layer="21"/>
<wire x1="1.27" y1="-2.54" x2="1.27" y2="-3.81" width="0.127" layer="21"/>
<wire x1="3.81" y1="-2.54" x2="3.81" y2="-3.81" width="0.127" layer="21"/>
<wire x1="3.81" y1="-3.81" x2="6.35" y2="-3.81" width="0.127" layer="21"/>
<wire x1="6.35" y1="-3.81" x2="6.35" y2="-2.54" width="0.127" layer="21"/>
<text x="5.08" y="-6.35" size="1.778" layer="21">+</text>
<text x="-1.27" y="-6.35" size="1.778" layer="21">-</text>
<text x="-5.08" y="-3.81" size="1.778" layer="21" rot="R90">&gt;NAME</text>
</package>
<package name="BUTTON">
<pad name="P$1" x="0" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$2" x="4.2" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$3" x="0" y="-6" drill="0.8" diameter="1.9304"/>
<pad name="P$4" x="4.2" y="-6" drill="0.8" diameter="1.9304" rot="R180"/>
<wire x1="-0.5" y1="0" x2="4.7" y2="0" width="0.127" layer="21"/>
<wire x1="4.7" y1="0" x2="4.7" y2="-6" width="0.127" layer="21"/>
<wire x1="4.7" y1="-6" x2="-0.5" y2="-6" width="0.127" layer="21"/>
<wire x1="-0.5" y1="-6" x2="-0.5" y2="0" width="0.127" layer="21"/>
<circle x="2.1" y="-3" radius="2" width="0.127" layer="21"/>
<text x="-2.21" y="-6.25" size="1.016" layer="25" rot="R90">&gt;NAME</text>
</package>
<package name="5PIN_KY-04">
<pad name="P$2" x="2.54" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$1" x="0" y="0" drill="0.8" diameter="1.9304" shape="square"/>
<pad name="P$3" x="5.08" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$4" x="7.62" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$5" x="10.16" y="0" drill="0.8" diameter="1.9304"/>
<wire x1="-2.54" y1="-1.27" x2="12.7" y2="-1.27" width="0.2" layer="21"/>
<wire x1="12.7" y1="-1.27" x2="12.7" y2="-7.62" width="0.2" layer="21"/>
<wire x1="12.7" y1="-7.62" x2="11.43" y2="-7.62" width="0.2" layer="21"/>
<wire x1="11.43" y1="-7.62" x2="10.16" y2="-7.62" width="0.2" layer="21"/>
<wire x1="10.16" y1="-7.62" x2="0" y2="-7.62" width="0.2" layer="21"/>
<wire x1="0" y1="-7.62" x2="-1.27" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-2.54" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-2.54" y1="-7.62" x2="-2.54" y2="-1.27" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-1.27" y2="-10.16" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-10.16" x2="-2.54" y2="-10.16" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-10.16" x2="11.43" y2="-10.16" width="0.2" layer="21"/>
<wire x1="12.7" y1="-10.16" x2="11.43" y2="-10.16" width="0.2" layer="21"/>
<wire x1="11.43" y1="-10.16" x2="11.43" y2="-7.62" width="0.2" layer="21"/>
<wire x1="11.43" y1="-7.62" x2="11.43" y2="-3.81" width="0.2" layer="21"/>
<wire x1="11.43" y1="-3.81" x2="10.16" y2="-3.81" width="0.2" layer="21"/>
<wire x1="10.16" y1="-3.81" x2="10.16" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-1.27" y2="-3.81" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-3.81" x2="0" y2="-3.81" width="0.2" layer="21"/>
<wire x1="0" y1="-3.81" x2="0" y2="-7.62" width="0.2" layer="21"/>
<text x="0.635" y="1.27" size="1.27" layer="25" rot="R90">GND</text>
<text x="3.175" y="1.27" size="1.27" layer="25" rot="R90">VCC</text>
<text x="-1.905" y="-12.065" size="1.27" layer="25">&gt;NAME</text>
<text x="5.715" y="1.27" size="1.27" layer="21" rot="R90">SW</text>
<text x="8.255" y="1.27" size="1.27" layer="21" rot="R90">DT</text>
<text x="10.795" y="1.27" size="1.27" layer="21" rot="R90">CLK</text>
</package>
<package name="5PIN_LCD">
<pad name="P$2" x="2.54" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$1" x="0" y="0" drill="0.8" diameter="1.9304" shape="square"/>
<pad name="P$3" x="5.08" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$4" x="7.62" y="0" drill="0.8" diameter="1.9304"/>
<pad name="P$5" x="10.16" y="0" drill="0.8" diameter="1.9304"/>
<wire x1="-2.54" y1="-1.27" x2="12.7" y2="-1.27" width="0.2" layer="21"/>
<wire x1="12.7" y1="-1.27" x2="12.7" y2="-7.62" width="0.2" layer="21"/>
<wire x1="12.7" y1="-7.62" x2="11.43" y2="-7.62" width="0.2" layer="21"/>
<wire x1="11.43" y1="-7.62" x2="10.16" y2="-7.62" width="0.2" layer="21"/>
<wire x1="10.16" y1="-7.62" x2="0" y2="-7.62" width="0.2" layer="21"/>
<wire x1="0" y1="-7.62" x2="-1.27" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-2.54" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-2.54" y1="-7.62" x2="-2.54" y2="-1.27" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-1.27" y2="-10.16" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-10.16" x2="-2.54" y2="-10.16" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-10.16" x2="11.43" y2="-10.16" width="0.2" layer="21"/>
<wire x1="12.7" y1="-10.16" x2="11.43" y2="-10.16" width="0.2" layer="21"/>
<wire x1="11.43" y1="-10.16" x2="11.43" y2="-7.62" width="0.2" layer="21"/>
<wire x1="11.43" y1="-7.62" x2="11.43" y2="-3.81" width="0.2" layer="21"/>
<wire x1="11.43" y1="-3.81" x2="10.16" y2="-3.81" width="0.2" layer="21"/>
<wire x1="10.16" y1="-3.81" x2="10.16" y2="-7.62" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-7.62" x2="-1.27" y2="-3.81" width="0.2" layer="21"/>
<wire x1="-1.27" y1="-3.81" x2="0" y2="-3.81" width="0.2" layer="21"/>
<wire x1="0" y1="-3.81" x2="0" y2="-7.62" width="0.2" layer="21"/>
<text x="0.635" y="1.27" size="1.27" layer="25" rot="R90">GND</text>
<text x="3.175" y="1.27" size="1.27" layer="25" rot="R90">VCC</text>
<text x="-1.905" y="-12.065" size="1.27" layer="25">&gt;NAME</text>
<text x="5.715" y="1.27" size="1.27" layer="21" rot="R90">SDA</text>
<text x="8.255" y="1.27" size="1.27" layer="21" rot="R90">SCL</text>
<text x="10.795" y="1.27" size="1.27" layer="21" rot="R90">LCD</text>
</package>
</packages>
</library>
<library name="adafruit" urn="urn:adsk.eagle:library:420">
<packages>
<package name="0805-THM" urn="urn:adsk.eagle:footprint:6240080/1" library_version="2">
<wire x1="5.08" y1="0" x2="4.064" y2="0" width="0.6096" layer="51"/>
<wire x1="-5.08" y1="0" x2="-4.064" y2="0" width="0.6096" layer="51"/>
<wire x1="-3.175" y1="0.889" x2="-2.921" y2="1.143" width="0.1524" layer="21" curve="-90"/>
<wire x1="-3.175" y1="-0.889" x2="-2.921" y2="-1.143" width="0.1524" layer="21" curve="90"/>
<wire x1="2.921" y1="-1.143" x2="3.175" y2="-0.889" width="0.1524" layer="21" curve="90"/>
<wire x1="2.921" y1="1.143" x2="3.175" y2="0.889" width="0.1524" layer="21" curve="-90"/>
<wire x1="-3.175" y1="-0.889" x2="-3.175" y2="0.889" width="0.1524" layer="21"/>
<wire x1="-2.921" y1="1.143" x2="-2.54" y2="1.143" width="0.1524" layer="21"/>
<wire x1="-2.413" y1="1.016" x2="-2.54" y2="1.143" width="0.1524" layer="21"/>
<wire x1="-2.921" y1="-1.143" x2="-2.54" y2="-1.143" width="0.1524" layer="21"/>
<wire x1="-2.413" y1="-1.016" x2="-2.54" y2="-1.143" width="0.1524" layer="21"/>
<wire x1="2.413" y1="1.016" x2="2.54" y2="1.143" width="0.1524" layer="21"/>
<wire x1="2.413" y1="1.016" x2="-2.413" y2="1.016" width="0.1524" layer="21"/>
<wire x1="2.413" y1="-1.016" x2="2.54" y2="-1.143" width="0.1524" layer="21"/>
<wire x1="2.413" y1="-1.016" x2="-2.413" y2="-1.016" width="0.1524" layer="21"/>
<wire x1="2.921" y1="1.143" x2="2.54" y2="1.143" width="0.1524" layer="21"/>
<wire x1="2.921" y1="-1.143" x2="2.54" y2="-1.143" width="0.1524" layer="21"/>
<wire x1="3.175" y1="-0.889" x2="3.175" y2="0.889" width="0.1524" layer="21"/>
<wire x1="-0.41" y1="0.635" x2="0.41" y2="0.635" width="0.1524" layer="51"/>
<wire x1="-0.41" y1="-0.635" x2="0.41" y2="-0.635" width="0.1524" layer="51"/>
<wire x1="-1.973" y1="0.983" x2="1.973" y2="0.983" width="0.0508" layer="39"/>
<wire x1="1.973" y1="0.983" x2="1.973" y2="-0.983" width="0.0508" layer="39"/>
<wire x1="1.973" y1="-0.983" x2="-1.973" y2="-0.983" width="0.0508" layer="39"/>
<wire x1="-1.973" y1="-0.983" x2="-1.973" y2="0.983" width="0.0508" layer="39"/>
<wire x1="-4.5" y1="0" x2="-1.1" y2="0" width="0.3048" layer="1"/>
<wire x1="1" y1="0" x2="5.1" y2="0" width="0.3048" layer="1"/>
<pad name="1" x="-5.08" y="0" drill="0.8128" diameter="1.6764" shape="octagon"/>
<pad name="2" x="5.08" y="0" drill="0.8128" diameter="1.6764" shape="octagon"/>
<text x="-3.048" y="1.524" size="1.27" layer="25" ratio="10">&gt;NAME</text>
<text x="-3.1306" y="-2.775" size="1.27" layer="27" ratio="10">&gt;VALUE</text>
<rectangle x1="3.175" y1="-0.3048" x2="4.0386" y2="0.3048" layer="21"/>
<rectangle x1="-4.0386" y1="-0.3048" x2="-3.175" y2="0.3048" layer="21"/>
<rectangle x1="0.4064" y1="-0.6985" x2="1.0564" y2="0.7015" layer="21"/>
<rectangle x1="-1.0668" y1="-0.6985" x2="-0.4168" y2="0.7015" layer="21"/>
<rectangle x1="-1.6254" y1="-0.7" x2="-0.4254" y2="0.7" layer="1"/>
<rectangle x1="0.4254" y1="-0.7" x2="1.6254" y2="0.7" layer="1"/>
<rectangle x1="-1.7254" y1="-0.8" x2="-0.3254" y2="0.8" layer="29"/>
<rectangle x1="0.3254" y1="-0.8" x2="1.7254" y2="0.8" layer="29"/>
<rectangle x1="-1.6254" y1="-0.7" x2="-0.4254" y2="0.7" layer="31"/>
<rectangle x1="0.4254" y1="-0.7" x2="1.6254" y2="0.7" layer="31"/>
</package>
</packages>
<packages3d>
<package3d name="0805-THM" urn="urn:adsk.eagle:package:6240726/1" type="box" library_version="2">
<packageinstances>
<packageinstance name="0805-THM"/>
</packageinstances>
</package3d>
</packages3d>
</library>
<library name="SparkFun-Boards">
<description>&lt;h3&gt;SparkFun Electronics' preferred foot prints&lt;/h3&gt;
This library contains footprints for SparkFun breakout boards, microcontrollers (Arduino, Particle, Teensy, etc.), breadboards, non-RF modules, etc.
&lt;br&gt;
&lt;br&gt;
We've spent an enormous amount of time creating and checking these footprints and parts, but it is &lt;b&gt; the end user's responsibility&lt;/b&gt; to ensure correctness and suitablity for a given componet or application.
&lt;br&gt;
&lt;br&gt;If you enjoy using this library, please buy one of our products at &lt;a href=" www.sparkfun.com"&gt;SparkFun.com&lt;/a&gt;.
&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Licensing:&lt;/b&gt; Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/
&lt;br&gt;
&lt;br&gt;
You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage.</description>
<packages>
<package name="UNO_R3_SHIELD_NOLABELS" urn="urn:adsk.eagle:footprint:37254/1" locally_modified="yes">
<description>&lt;h3&gt;Arduino Uno-Compatible Footprint&lt;/h3&gt;
No holes, no ICSP connections, no silk labels.
&lt;p&gt;Specifications:
&lt;ul&gt;&lt;li&gt;Pin count: 32&lt;/li&gt;
&lt;li&gt;Pin pitch: 0.1"&lt;/li&gt;
&lt;li&gt;Area:2.1x2.35"&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Example device(s):
&lt;ul&gt;&lt;li&gt;Arduino Uno R3 Shield&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description>
<wire x1="-24.13" y1="-30.48" x2="-17.17" y2="-30.48" width="0.254" layer="51"/>
<wire x1="-17.17" y1="-30.48" x2="-4.97" y2="-30.48" width="0.254" layer="51"/>
<wire x1="-4.97" y1="-30.48" x2="24.13" y2="-30.48" width="0.254" layer="51"/>
<wire x1="24.13" y1="-30.48" x2="26.67" y2="-27.94" width="0.254" layer="51"/>
<wire x1="26.67" y1="26.67" x2="24.13" y2="26.67" width="0.254" layer="51"/>
<wire x1="24.13" y1="26.67" x2="21.59" y2="29.21" width="0.254" layer="51"/>
<wire x1="-26.67" y1="25.4" x2="-26.67" y2="-27.94" width="0.254" layer="51"/>
<wire x1="-26.67" y1="-27.94" x2="-24.13" y2="-30.48" width="0.254" layer="51"/>
<wire x1="21.59" y1="29.21" x2="-11.43" y2="29.21" width="0.254" layer="51"/>
<wire x1="-11.43" y1="29.21" x2="-13.97" y2="26.67" width="0.254" layer="51"/>
<wire x1="-13.97" y1="26.67" x2="-25.4" y2="26.67" width="0.254" layer="51"/>
<wire x1="-25.4" y1="26.67" x2="-26.67" y2="25.4" width="0.254" layer="51"/>
<wire x1="26.67" y1="-27.94" x2="26.67" y2="26.67" width="0.254" layer="51"/>
<wire x1="-25.4" y1="25.4" x2="-22.86" y2="25.4" width="0.127" layer="51"/>
<wire x1="-22.86" y1="25.4" x2="-22.86" y2="5.08" width="0.127" layer="51"/>
<wire x1="-22.86" y1="5.08" x2="-25.4" y2="5.08" width="0.127" layer="51"/>
<wire x1="-25.4" y1="5.08" x2="-25.4" y2="25.4" width="0.127" layer="51"/>
<wire x1="-25.4" y1="3.81" x2="-22.86" y2="3.81" width="0.127" layer="51"/>
<wire x1="-22.86" y1="3.81" x2="-22.86" y2="-21.59" width="0.127" layer="51"/>
<wire x1="-22.86" y1="-21.59" x2="-25.4" y2="-21.59" width="0.127" layer="51"/>
<wire x1="-25.4" y1="-21.59" x2="-25.4" y2="3.81" width="0.127" layer="51"/>
<wire x1="22.86" y1="-12.7" x2="25.4" y2="-12.7" width="0.127" layer="51"/>
<wire x1="25.4" y1="-12.7" x2="25.4" y2="7.62" width="0.127" layer="51"/>
<wire x1="25.4" y1="7.62" x2="22.86" y2="7.62" width="0.127" layer="51"/>
<wire x1="25.4" y1="10.16" x2="22.86" y2="10.16" width="0.127" layer="51"/>
<wire x1="22.86" y1="10.16" x2="22.86" y2="25.4" width="0.127" layer="51"/>
<wire x1="22.86" y1="25.4" x2="25.4" y2="25.4" width="0.127" layer="51"/>
<wire x1="25.4" y1="25.4" x2="25.4" y2="10.16" width="0.127" layer="51"/>
<wire x1="22.86" y1="7.62" x2="22.86" y2="-12.7" width="0.127" layer="51"/>
<pad name="RES" x="24.13" y="-6.35" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="3.3V" x="24.13" y="-3.81" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="5V" x="24.13" y="-1.27" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="GND@0" x="24.13" y="1.27" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="GND@1" x="24.13" y="3.81" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="VIN" x="24.13" y="6.35" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="A0" x="24.13" y="11.43" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="A1" x="24.13" y="13.97" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="A2" x="24.13" y="16.51" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="A3" x="24.13" y="19.05" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="A4" x="24.13" y="21.59" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="A5" x="24.13" y="24.13" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="RX" x="-24.13" y="24.13" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="TX" x="-24.13" y="21.59" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D2" x="-24.13" y="19.05" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D3" x="-24.13" y="16.51" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D4" x="-24.13" y="13.97" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D5" x="-24.13" y="11.43" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D6" x="-24.13" y="8.89" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D7" x="-24.13" y="6.35" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D8" x="-24.13" y="2.54" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D9" x="-24.13" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D10" x="-24.13" y="-2.54" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D11" x="-24.13" y="-5.08" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D12" x="-24.13" y="-7.62" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="D13" x="-24.13" y="-10.16" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="GND@2" x="-24.13" y="-12.7" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="AREF" x="-24.13" y="-15.24" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="SDA" x="-24.13" y="-17.78" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="SCL" x="-24.13" y="-20.32" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="IOREF" x="24.13" y="-8.89" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="NC" x="24.13" y="-11.43" drill="1.016" diameter="1.8796" rot="R90"/>
</package>
</packages>
<packages3d>
<package3d name="UNO_R3_SHIELD_NOLABELS" urn="urn:adsk.eagle:package:37324/1" locally_modified="yes" type="box">
<description>Arduino Uno-Compatible Footprint
No holes, no ICSP connections, no silk labels.
Specifications:
Pin count: 32
Pin pitch: 0.1"
Area:2.1x2.35"
Example device(s):
Arduino Uno R3 Shield
</description>
<packageinstances>
<packageinstance name="UNO_R3_SHIELD_NOLABELS"/>
</packageinstances>
</package3d>
</packages3d>
</library>
</libraries>
<attributes>
</attributes>
<variantdefs>
</variantdefs>
<classes>
<class number="0" name="default" width="0.4" drill="0">
<clearance class="0" value="0.25"/>
</class>
</classes>
<designrules name="default">
<description language="de">&lt;b&gt;EAGLE Design Rules&lt;/b&gt;
&lt;p&gt;
Die Standard-Design-Rules sind so gewählt, dass sie für
die meisten Anwendungen passen. Sollte ihre Platine
besondere Anforderungen haben, treffen Sie die erforderlichen
Einstellungen hier und speichern die Design Rules unter
einem neuen Namen ab.</description>
<description language="en">&lt;b&gt;EAGLE Design Rules&lt;/b&gt;
&lt;p&gt;
The default Design Rules have been set to cover
a wide range of applications. Your particular design
may have different requirements, so please make the
necessary adjustments and save your customized
design rules under a new name.</description>
<param name="layerSetup" value="(1*16)"/>
<param name="mtCopper" value="0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm"/>
<param name="mtIsolate" value="1.5mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm"/>
<param name="mdWireWire" value="6mil"/>
<param name="mdWirePad" value="6mil"/>
<param name="mdWireVia" value="6mil"/>
<param name="mdPadPad" value="6mil"/>
<param name="mdPadVia" value="6mil"/>
<param name="mdViaVia" value="6mil"/>
<param name="mdSmdPad" value="6mil"/>
<param name="mdSmdVia" value="6mil"/>
<param name="mdSmdSmd" value="6mil"/>
<param name="mdViaViaSameLayer" value="6mil"/>
<param name="mnLayersViaInSmd" value="2"/>
<param name="mdCopperDimension" value="40mil"/>
<param name="mdDrill" value="6mil"/>
<param name="mdSmdStop" value="0mil"/>
<param name="msWidth" value="6mil"/>
<param name="msDrill" value="0.35mm"/>
<param name="msMicroVia" value="9.99mm"/>
<param name="msBlindViaRatio" value="0.5"/>
<param name="rvPadTop" value="0.25"/>
<param name="rvPadInner" value="0.25"/>
<param name="rvPadBottom" value="0.25"/>
<param name="rvViaOuter" value="0.25"/>
<param name="rvViaInner" value="0.25"/>
<param name="rvMicroViaOuter" value="0.25"/>
<param name="rvMicroViaInner" value="0.25"/>
<param name="rlMinPadTop" value="10mil"/>
<param name="rlMaxPadTop" value="20mil"/>
<param name="rlMinPadInner" value="10mil"/>
<param name="rlMaxPadInner" value="20mil"/>
<param name="rlMinPadBottom" value="10mil"/>
<param name="rlMaxPadBottom" value="20mil"/>
<param name="rlMinViaOuter" value="8mil"/>
<param name="rlMaxViaOuter" value="20mil"/>
<param name="rlMinViaInner" value="8mil"/>
<param name="rlMaxViaInner" value="20mil"/>
<param name="rlMinMicroViaOuter" value="4mil"/>
<param name="rlMaxMicroViaOuter" value="20mil"/>
<param name="rlMinMicroViaInner" value="4mil"/>
<param name="rlMaxMicroViaInner" value="20mil"/>
<param name="psTop" value="-1"/>
<param name="psBottom" value="-1"/>
<param name="psFirst" value="-1"/>
<param name="psElongationLong" value="100"/>
<param name="psElongationOffset" value="100"/>
<param name="mvStopFrame" value="1"/>
<param name="mvCreamFrame" value="0"/>
<param name="mlMinStopFrame" value="4mil"/>
<param name="mlMaxStopFrame" value="4mil"/>
<param name="mlMinCreamFrame" value="0mil"/>
<param name="mlMaxCreamFrame" value="0mil"/>
<param name="mlViaStopLimit" value="0mil"/>
<param name="srRoundness" value="0"/>
<param name="srMinRoundness" value="0mil"/>
<param name="srMaxRoundness" value="0mil"/>
<param name="slThermalIsolate" value="10mil"/>
<param name="slThermalsForVias" value="0"/>
<param name="dpMaxLengthDifference" value="10mm"/>
<param name="dpGapFactor" value="2.5"/>
<param name="checkAngle" value="0"/>
<param name="checkFont" value="1"/>
<param name="checkRestrict" value="1"/>
<param name="checkStop" value="0"/>
<param name="checkValues" value="0"/>
<param name="checkNames" value="1"/>
<param name="checkWireStubs" value="1"/>
<param name="checkPolygonWidth" value="0"/>
<param name="useDiameter" value="13"/>
<param name="maxErrors" value="50"/>
</designrules>
<autorouter>
<pass name="Default">
<param name="RoutingGrid" value="50mil"/>
<param name="AutoGrid" value="1"/>
<param name="Efforts" value="2"/>
<param name="TopRouterVariant" value="1"/>
<param name="tpViaShape" value="round"/>
<param name="PrefDir.1" value="a"/>
<param name="PrefDir.2" value="0"/>
<param name="PrefDir.3" value="0"/>
<param name="PrefDir.4" value="0"/>
<param name="PrefDir.5" value="0"/>
<param name="PrefDir.6" value="0"/>
<param name="PrefDir.7" value="0"/>
<param name="PrefDir.8" value="0"/>
<param name="PrefDir.9" value="0"/>
<param name="PrefDir.10" value="0"/>
<param name="PrefDir.11" value="0"/>
<param name="PrefDir.12" value="0"/>
<param name="PrefDir.13" value="0"/>
<param name="PrefDir.14" value="0"/>
<param name="PrefDir.15" value="0"/>
<param name="PrefDir.16" value="a"/>
<param name="cfVia" value="8"/>
<param name="cfNonPref" value="5"/>
<param name="cfChangeDir" value="2"/>
<param name="cfOrthStep" value="2"/>
<param name="cfDiagStep" value="3"/>
<param name="cfExtdStep" value="0"/>
<param name="cfBonusStep" value="1"/>
<param name="cfMalusStep" value="1"/>
<param name="cfPadImpact" value="4"/>
<param name="cfSmdImpact" value="4"/>
<param name="cfBusImpact" value="0"/>
<param name="cfHugging" value="3"/>
<param name="cfAvoid" value="4"/>
<param name="cfPolygon" value="10"/>
<param name="cfBase.1" value="0"/>
<param name="cfBase.2" value="1"/>
<param name="cfBase.3" value="1"/>
<param name="cfBase.4" value="1"/>
<param name="cfBase.5" value="1"/>
<param name="cfBase.6" value="1"/>
<param name="cfBase.7" value="1"/>
<param name="cfBase.8" value="1"/>
<param name="cfBase.9" value="1"/>
<param name="cfBase.10" value="1"/>
<param name="cfBase.11" value="1"/>
<param name="cfBase.12" value="1"/>
<param name="cfBase.13" value="1"/>
<param name="cfBase.14" value="1"/>
<param name="cfBase.15" value="1"/>
<param name="cfBase.16" value="0"/>
<param name="mnVias" value="20"/>
<param name="mnSegments" value="9999"/>
<param name="mnExtdSteps" value="9999"/>
<param name="mnRipupLevel" value="10"/>
<param name="mnRipupSteps" value="100"/>
<param name="mnRipupTotal" value="100"/>
</pass>
<pass name="Follow-me" refer="Default" active="yes">
</pass>
<pass name="Busses" refer="Default" active="yes">
<param name="cfNonPref" value="4"/>
<param name="cfBusImpact" value="4"/>
<param name="cfHugging" value="0"/>
<param name="mnVias" value="0"/>
</pass>
<pass name="Route" refer="Default" active="yes">
</pass>
<pass name="Optimize1" refer="Default" active="yes">
<param name="cfVia" value="99"/>
<param name="cfExtdStep" value="10"/>
<param name="cfHugging" value="1"/>
<param name="mnExtdSteps" value="1"/>
<param name="mnRipupLevel" value="0"/>
</pass>
<pass name="Optimize2" refer="Optimize1" active="yes">
<param name="cfNonPref" value="0"/>
<param name="cfChangeDir" value="6"/>
<param name="cfExtdStep" value="0"/>
<param name="cfBonusStep" value="2"/>
<param name="cfMalusStep" value="2"/>
<param name="cfPadImpact" value="2"/>
<param name="cfSmdImpact" value="2"/>
<param name="cfHugging" value="0"/>
</pass>
<pass name="Optimize3" refer="Optimize2" active="yes">
<param name="cfChangeDir" value="8"/>
<param name="cfPadImpact" value="0"/>
<param name="cfSmdImpact" value="0"/>
</pass>
<pass name="Optimize4" refer="Optimize3" active="yes">
<param name="cfChangeDir" value="25"/>
</pass>
</autorouter>
<elements>
<element name="FAN1" library="stir_shield" package="4PIN" value="4PIN" x="24.13" y="36.83" smashed="yes">
<attribute name="NAME" x="22.86" y="31.75" size="1.27" layer="21"/>
</element>
<element name="FAN1-POW-CON" library="stir_shield" package="1PIN" value="1PIN" x="13.97" y="11.43" smashed="yes"/>
<element name="FAN2" library="stir_shield" package="4PIN" value="4PIN" x="11.43" y="36.83" smashed="yes">
<attribute name="NAME" x="11.43" y="31.75" size="1.27" layer="21"/>
</element>
<element name="FAN2_POW_CON" library="stir_shield" package="1PIN" value="1PIN" x="19.05" y="11.43" smashed="yes"/>
<element name="R1" library="adafruit" library_urn="urn:adsk.eagle:library:420" package="0805-THM" package3d_urn="urn:adsk.eagle:package:6240726/1" value="" x="27.94" y="26.67" smashed="yes">
<attribute name="NAME" x="24.892" y="28.194" size="1.27" layer="25" ratio="10"/>
<attribute name="VALUE" x="24.8094" y="23.895" size="1.27" layer="27" ratio="10"/>
</element>
<element name="R2" library="adafruit" library_urn="urn:adsk.eagle:library:420" package="0805-THM" package3d_urn="urn:adsk.eagle:package:6240726/1" value="" x="27.94" y="21.59" smashed="yes">
<attribute name="NAME" x="24.892" y="23.114" size="1.27" layer="25" ratio="10"/>
<attribute name="VALUE" x="24.8094" y="18.815" size="1.27" layer="27" ratio="10"/>
</element>
<element name="R3" library="adafruit" library_urn="urn:adsk.eagle:library:420" package="0805-THM" package3d_urn="urn:adsk.eagle:package:6240726/1" value="" x="27.94" y="16.51" smashed="yes">
<attribute name="NAME" x="24.892" y="18.034" size="1.27" layer="25" ratio="10"/>
<attribute name="VALUE" x="24.8094" y="13.735" size="1.27" layer="27" ratio="10"/>
</element>
<element name="R4" library="adafruit" library_urn="urn:adsk.eagle:library:420" package="0805-THM" package3d_urn="urn:adsk.eagle:package:6240726/1" value="" x="27.94" y="11.43" smashed="yes">
<attribute name="NAME" x="24.892" y="12.954" size="1.27" layer="25" ratio="10"/>
<attribute name="VALUE" x="24.8094" y="8.655" size="1.27" layer="27" ratio="10"/>
</element>
<element name="U$1" library="stir_shield" package="2PIN" value="2PIN" x="6.35" y="25.4" smashed="yes" rot="R270"/>
<element name="KY-040" library="stir_shield" package="5PIN_KY-04" value="5PIN_KY-04" x="41.91" y="34.29" smashed="yes" rot="R90">
<attribute name="NAME" x="53.975" y="32.385" size="1.27" layer="25" rot="R90"/>
</element>
<element name="LCD" library="stir_shield" package="5PIN_LCD" value="5PIN_LCD" x="41.91" y="10.16" smashed="yes" rot="R90">
<attribute name="NAME" x="53.975" y="8.255" size="1.27" layer="25" rot="R90"/>
</element>
<element name="B1" library="SparkFun-Boards" package="UNO_R3_SHIELD_NOLABELS" package3d_urn="urn:adsk.eagle:package:37324/1" value="ARDUINO_UNO_R3_SHIELDNOLABELS" x="30.734" y="26.416" smashed="yes" rot="R270"/>
<element name="RESET" library="stir_shield" package="BUTTON" value="BUTTON" x="10.16" y="2.54" smashed="yes" rot="R90">
<attribute name="NAME" x="7.62" y="6.35" size="1.016" layer="25" rot="R270"/>
</element>
</elements>
<signals>
<signal name="N$2">
<contactref element="U$1" pad="P$2"/>
<contactref element="FAN1" pad="P$2"/>
<contactref element="FAN2" pad="P$2"/>
<contactref element="B1" pad="VIN"/>
<wire x1="13.97" y1="36.83" x2="16.51" y2="39.37" width="0.8128" layer="16"/>
<wire x1="16.51" y1="39.37" x2="25.4" y2="39.37" width="0.8128" layer="16"/>
<wire x1="25.4" y1="39.37" x2="26.67" y2="38.1" width="0.8128" layer="16"/>
<wire x1="26.67" y1="38.1" x2="26.67" y2="36.83" width="0.8128" layer="16"/>
<wire x1="6.35" y1="20.32" x2="13.97" y2="27.94" width="0.8128" layer="1"/>
<wire x1="13.97" y1="27.94" x2="13.97" y2="36.83" width="0.8128" layer="1"/>
<wire x1="37.084" y1="2.286" x2="30.48" y2="8.89" width="0.8128" layer="1"/>
<wire x1="30.48" y1="8.89" x2="11.43" y2="8.89" width="0.8128" layer="1"/>
<wire x1="11.43" y1="8.89" x2="6.35" y2="13.97" width="0.8128" layer="1"/>
<wire x1="6.35" y1="13.97" x2="6.35" y2="20.32" width="0.8128" layer="1"/>
</signal>
<signal name="N$3">
<contactref element="R1" pad="1"/>
<contactref element="FAN1" pad="P$4"/>
<contactref element="B1" pad="D9"/>
<wire x1="23.075" y1="28.275" x2="23.075" y2="26.975" width="0.4" layer="16"/>
<wire x1="31.525" y1="36.725" x2="23.075" y2="28.275" width="0.4" layer="16"/>
<wire x1="23.075" y1="26.975" x2="22.86" y2="26.67" width="0.4" layer="16"/>
<wire x1="31.525" y1="36.725" x2="31.75" y2="36.83" width="0.4" layer="16"/>
<wire x1="30.875" y1="41.925" x2="30.875" y2="50.375" width="0.4" layer="16"/>
<wire x1="31.85" y1="40.95" x2="30.875" y2="41.925" width="0.4" layer="16"/>
<wire x1="31.85" y1="37.05" x2="31.85" y2="40.95" width="0.4" layer="16"/>
<wire x1="30.875" y1="50.375" x2="30.734" y2="50.546" width="0.4" layer="16"/>
<wire x1="31.85" y1="37.05" x2="31.75" y2="36.83" width="0.4" layer="16"/>
</signal>
<signal name="N$4">
<contactref element="R2" pad="1"/>
<contactref element="FAN2" pad="P$4"/>
<contactref element="B1" pad="D10"/>
<wire x1="22.75" y1="24.7" x2="22.75" y2="21.775" width="0.4" layer="1"/>
<wire x1="19.175" y1="28.275" x2="22.75" y2="24.7" width="0.4" layer="1"/>
<wire x1="19.175" y1="36.725" x2="19.175" y2="28.275" width="0.4" layer="1"/>
<wire x1="22.75" y1="21.775" x2="22.86" y2="21.59" width="0.4" layer="1"/>
<wire x1="19.175" y1="36.725" x2="19.05" y2="36.83" width="0.4" layer="1"/>
<wire x1="27.95" y1="45.825" x2="27.95" y2="50.375" width="0.4" layer="1"/>
<wire x1="19.175" y1="37.05" x2="27.95" y2="45.825" width="0.4" layer="1"/>
<wire x1="27.95" y1="50.375" x2="28.194" y2="50.546" width="0.4" layer="1"/>
<wire x1="19.175" y1="37.05" x2="19.05" y2="36.83" width="0.4" layer="1"/>
</signal>
<signal name="N$5">
<contactref element="R3" pad="2"/>
<contactref element="R4" pad="2"/>
<contactref element="KY-040" pad="P$2"/>
<contactref element="LCD" pad="P$2"/>
<contactref element="B1" pad="5V"/>
<wire x1="33.15" y1="16.25" x2="33.15" y2="11.7" width="0.4" layer="16"/>
<wire x1="33.15" y1="11.7" x2="33.02" y2="11.43" width="0.4" layer="16"/>
<wire x1="33.15" y1="16.25" x2="33.02" y2="16.51" width="0.4" layer="16"/>
<wire x1="32.825" y1="11.375" x2="33.02" y2="11.43" width="0.4" layer="16"/>
<wire x1="41.6" y1="12.675" x2="41.91" y2="12.7" width="0.4" layer="16"/>
<wire x1="36.4" y1="31.525" x2="41.6" y2="36.725" width="0.4" layer="16"/>
<wire x1="41.6" y1="36.725" x2="41.91" y2="36.83" width="0.4" layer="16"/>
<wire x1="33.15" y1="16.575" x2="33.02" y2="16.51" width="0.4" layer="16"/>
<wire x1="29.464" y1="2.286" x2="29.464" y2="8.014" width="0.4" layer="16"/>
<wire x1="29.464" y1="8.014" x2="32.825" y2="11.375" width="0.4" layer="16"/>
<wire x1="29.464" y1="2.286" x2="29.464" y2="5.969" width="0.4" layer="16"/>
<wire x1="29.464" y1="5.969" x2="36.4" y2="12.905" width="0.4" layer="16"/>
<wire x1="36.4" y1="12.905" x2="36.4" y2="31.525" width="0.4" layer="16"/>
<wire x1="29.464" y1="2.286" x2="39.878" y2="12.7" width="0.4" layer="16"/>
<wire x1="39.878" y1="12.7" x2="41.91" y2="12.7" width="0.4" layer="16"/>
</signal>
<signal name="N$6">
<contactref element="R3" pad="1"/>
<contactref element="FAN1" pad="P$3"/>
<contactref element="B1" pad="D2"/>
<wire x1="22.75" y1="16.9" x2="22.75" y2="16.575" width="0.4" layer="1"/>
<wire x1="26" y1="20.15" x2="22.75" y2="16.9" width="0.4" layer="1"/>
<wire x1="33.475" y1="20.15" x2="26" y2="20.15" width="0.4" layer="1"/>
<wire x1="34.45" y1="21.125" x2="33.475" y2="20.15" width="0.4" layer="1"/>
<wire x1="34.45" y1="31.525" x2="34.45" y2="21.125" width="0.4" layer="1"/>
<wire x1="29.25" y1="36.725" x2="34.125" y2="31.85" width="0.4" layer="1"/>
<wire x1="34.125" y1="31.85" x2="34.45" y2="31.525" width="0.4" layer="1"/>
<wire x1="22.75" y1="16.575" x2="22.86" y2="16.51" width="0.4" layer="1"/>
<wire x1="29.25" y1="36.725" x2="29.21" y2="36.83" width="0.4" layer="1"/>
<wire x1="49.075" y1="50.375" x2="49.725" y2="50.375" width="0.4" layer="16"/>
<wire x1="44.85" y1="46.15" x2="49.075" y2="50.375" width="0.4" layer="16"/>
<wire x1="41.6" y1="46.15" x2="44.85" y2="46.15" width="0.4" layer="16"/>
<wire x1="35.75" y1="40.3" x2="41.6" y2="46.15" width="0.4" layer="16"/>
<wire x1="35.75" y1="33.475" x2="35.75" y2="40.3" width="0.4" layer="16"/>
<wire x1="34.125" y1="31.85" x2="35.75" y2="33.475" width="0.4" layer="1"/>
<wire x1="49.725" y1="50.375" x2="49.784" y2="50.546" width="0.4" layer="16"/>
<via x="35.75" y="33.475" extent="1-16" drill="0.35"/>
</signal>
<signal name="N$7">
<contactref element="R4" pad="1"/>
<contactref element="FAN2" pad="P$3"/>
<contactref element="B1" pad="D3"/>
<wire x1="22.75" y1="14.625" x2="22.75" y2="11.7" width="0.4" layer="1"/>
<wire x1="16.575" y1="20.8" x2="22.75" y2="14.625" width="0.4" layer="1"/>
<wire x1="16.575" y1="36.725" x2="16.575" y2="20.8" width="0.4" layer="1"/>
<wire x1="22.75" y1="11.7" x2="22.86" y2="11.43" width="0.4" layer="1"/>
<wire x1="16.575" y1="36.725" x2="16.51" y2="36.83" width="0.4" layer="1"/>
<wire x1="43.55" y1="46.8" x2="47.125" y2="50.375" width="0.4" layer="16"/>
<wire x1="41.275" y1="46.8" x2="43.55" y2="46.8" width="0.4" layer="16"/>
<wire x1="34.775" y1="40.3" x2="41.275" y2="46.8" width="0.4" layer="16"/>
<wire x1="34.775" y1="28.925" x2="34.775" y2="40.3" width="0.4" layer="16"/>
<wire x1="35.75" y1="27.95" x2="34.775" y2="28.925" width="0.4" layer="16"/>
<wire x1="35.75" y1="21.45" x2="35.75" y2="27.95" width="0.4" layer="16"/>
<wire x1="26" y1="11.7" x2="35.75" y2="21.45" width="0.4" layer="16"/>
<wire x1="23.075" y1="11.7" x2="26" y2="11.7" width="0.4" layer="16"/>
<wire x1="47.125" y1="50.375" x2="47.244" y2="50.546" width="0.4" layer="16"/>
<wire x1="23.075" y1="11.7" x2="22.86" y2="11.43" width="0.4" layer="16"/>
</signal>
<signal name="N$9">
<contactref element="FAN2_POW_CON" pad="P$1"/>
<contactref element="B1" pad="D7"/>
<wire x1="37.05" y1="43.55" x2="37.05" y2="50.375" width="0.4" layer="16"/>
<wire x1="34.125" y1="40.625" x2="37.05" y2="43.55" width="0.4" layer="16"/>
<wire x1="34.125" y1="28.6" x2="34.125" y2="40.625" width="0.4" layer="16"/>
<wire x1="35.1" y1="27.625" x2="34.125" y2="28.6" width="0.4" layer="16"/>
<wire x1="35.1" y1="21.775" x2="35.1" y2="27.625" width="0.4" layer="16"/>
<wire x1="26.325" y1="13" x2="35.1" y2="21.775" width="0.4" layer="16"/>
<wire x1="20.475" y1="13" x2="26.325" y2="13" width="0.4" layer="16"/>
<wire x1="19.175" y1="11.7" x2="20.475" y2="13" width="0.4" layer="16"/>
<wire x1="37.05" y1="50.375" x2="37.084" y2="50.546" width="0.4" layer="16"/>
<wire x1="19.175" y1="11.7" x2="19.05" y2="11.43" width="0.4" layer="16"/>
</signal>
<signal name="RESET">
<contactref element="B1" pad="RES"/>
<contactref element="RESET" pad="P$1"/>
<wire x1="10.16" y1="2.54" x2="10.795" y2="2.54" width="0.4" layer="16"/>
<wire x1="10.795" y1="2.54" x2="12.7" y2="4.445" width="0.4" layer="16"/>
<wire x1="12.7" y1="4.445" x2="22.225" y2="4.445" width="0.4" layer="16"/>
<wire x1="22.225" y1="4.445" x2="24.384" y2="2.286" width="0.4" layer="16"/>
</signal>
<signal name="N$18">
<contactref element="KY-040" pad="P$1"/>
<contactref element="B1" pad="GND@0"/>
<contactref element="FAN1" pad="P$1"/>
<contactref element="U$1" pad="P$1"/>
<contactref element="FAN2" pad="P$1"/>
<contactref element="R1" pad="2"/>
<contactref element="R2" pad="2"/>
<contactref element="LCD" pad="P$1"/>
<wire x1="41.6" y1="10.075" x2="41.91" y2="10.16" width="0.4" layer="16"/>
<wire x1="41.925" y1="22.425" x2="41.925" y2="34.125" width="0.4" layer="1"/>
<wire x1="43.55" y1="20.8" x2="41.925" y2="22.425" width="0.4" layer="1"/>
<wire x1="43.55" y1="12.025" x2="43.55" y2="20.8" width="0.4" layer="1"/>
<wire x1="41.925" y1="10.4" x2="43.55" y2="12.025" width="0.4" layer="1"/>
<wire x1="41.925" y1="34.125" x2="41.91" y2="34.29" width="0.4" layer="1"/>
<wire x1="41.925" y1="10.4" x2="41.91" y2="10.16" width="0.4" layer="1"/>
<wire x1="6.5" y1="31.85" x2="6.5" y2="25.675" width="0.4" layer="1"/>
<wire x1="11.375" y1="36.725" x2="6.5" y2="31.85" width="0.4" layer="1"/>
<wire x1="6.5" y1="25.675" x2="6.35" y2="25.4" width="0.4" layer="1"/>
<wire x1="11.375" y1="36.725" x2="11.43" y2="36.83" width="0.4" layer="1"/>
<wire x1="24.7" y1="26.65" x2="32.825" y2="26.65" width="0.4" layer="16"/>
<wire x1="23.4" y1="25.35" x2="24.7" y2="26.65" width="0.4" layer="16"/>
<wire x1="22.1" y1="25.35" x2="23.4" y2="25.35" width="0.4" layer="16"/>
<wire x1="21.45" y1="26" x2="22.1" y2="25.35" width="0.4" layer="16"/>
<wire x1="21.45" y1="34.125" x2="21.45" y2="26" width="0.4" layer="16"/>
<wire x1="24.05" y1="36.725" x2="21.45" y2="34.125" width="0.4" layer="16"/>
<wire x1="32.825" y1="26.65" x2="33.02" y2="26.67" width="0.4" layer="16"/>
<wire x1="24.05" y1="36.725" x2="24.13" y2="36.83" width="0.4" layer="16"/>
<wire x1="14.3" y1="34.125" x2="11.7" y2="36.725" width="0.4" layer="16"/>
<wire x1="21.45" y1="34.125" x2="14.3" y2="34.125" width="0.4" layer="16"/>
<wire x1="11.7" y1="36.725" x2="11.43" y2="36.83" width="0.4" layer="16"/>
<wire x1="30.875" y1="21.45" x2="32.825" y2="21.45" width="0.4" layer="16"/>
<wire x1="23.075" y1="13.65" x2="23.1275" y2="13.7025" width="0.4" layer="16"/>
<wire x1="23.1275" y1="13.7025" x2="30.875" y2="21.45" width="0.4" layer="16"/>
<wire x1="32.825" y1="21.45" x2="33.02" y2="21.59" width="0.4" layer="16"/>
<contactref element="RESET" pad="P$2"/>
<wire x1="32.004" y1="2.286" x2="39.793" y2="10.075" width="0.4" layer="16"/>
<wire x1="39.793" y1="10.075" x2="41.6" y2="10.075" width="0.4" layer="16"/>
<wire x1="10.16" y1="6.74" x2="12.455" y2="4.445" width="0.4" layer="1"/>
<wire x1="12.455" y1="4.445" x2="29.845" y2="4.445" width="0.4" layer="1"/>
<wire x1="29.845" y1="4.445" x2="32.004" y2="2.286" width="0.4" layer="1"/>
<wire x1="6.35" y1="25.4" x2="4.445" y2="23.495" width="0.4" layer="16"/>
<wire x1="4.445" y1="12.455" x2="10.16" y2="6.74" width="0.4" layer="16"/>
<wire x1="4.445" y1="23.495" x2="4.445" y2="12.455" width="0.4" layer="16"/>
<wire x1="10.16" y1="6.74" x2="12.31" y2="8.89" width="0.4" layer="16"/>
<wire x1="14.5086" y1="8.89" x2="12.31" y2="8.89" width="0.4" layer="16"/>
<wire x1="23.1275" y1="13.7025" x2="23.07174375" y2="13.7025" width="0.4" layer="16"/>
<wire x1="23.07174375" y1="13.7025" x2="23.01924375" y2="13.65" width="0.4" layer="16"/>
<wire x1="23.01924375" y1="13.65" x2="19.2686" y2="13.65" width="0.4" layer="16"/>
<wire x1="19.2686" y1="13.65" x2="14.5086" y2="8.89" width="0.4" layer="16"/>
</signal>
<signal name="N$1">
<contactref element="B1" pad="D8"/>
<contactref element="FAN1-POW-CON" pad="P$1"/>
<wire x1="33.475" y1="28.275" x2="33.475" y2="50.375" width="0.4" layer="16"/>
<wire x1="34.45" y1="27.3" x2="33.475" y2="28.275" width="0.4" layer="16"/>
<wire x1="34.45" y1="26" x2="34.45" y2="27.3" width="0.4" layer="16"/>
<wire x1="22.75" y1="14.3" x2="34.45" y2="26" width="0.4" layer="16"/>
<wire x1="16.575" y1="14.3" x2="22.75" y2="14.3" width="0.4" layer="16"/>
<wire x1="13.975" y1="11.7" x2="16.575" y2="14.3" width="0.4" layer="16"/>
<wire x1="33.475" y1="50.375" x2="33.274" y2="50.546" width="0.4" layer="16"/>
<wire x1="13.975" y1="11.7" x2="13.97" y2="11.43" width="0.4" layer="16"/>
</signal>
<signal name="N$8">
<contactref element="LCD" pad="P$5"/>
<contactref element="B1" pad="D11"/>
<wire x1="26.325" y1="50.7" x2="25.675" y2="50.7" width="0.4" layer="1"/>
<wire x1="27.625" y1="52" x2="26.325" y2="50.7" width="0.4" layer="1"/>
<wire x1="27.625" y1="52" x2="33.8" y2="52" width="0.4" layer="1"/>
<wire x1="33.8" y1="52" x2="35.425" y2="50.375" width="0.4" layer="1"/>
<wire x1="35.425" y1="37.375" x2="35.425" y2="50.375" width="0.4" layer="1"/>
<wire x1="41.275" y1="31.525" x2="35.425" y2="37.375" width="0.4" layer="1"/>
<wire x1="41.275" y1="20.8" x2="41.275" y2="31.525" width="0.4" layer="1"/>
<wire x1="41.6" y1="20.475" x2="41.275" y2="20.8" width="0.4" layer="1"/>
<wire x1="25.675" y1="50.7" x2="25.654" y2="50.546" width="0.4" layer="1"/>
<wire x1="41.6" y1="20.475" x2="41.91" y2="20.32" width="0.4" layer="1"/>
</signal>
<signal name="N$10">
<contactref element="LCD" pad="P$4"/>
<contactref element="B1" pad="SCL"/>
<wire x1="10.725" y1="50.375" x2="20.8" y2="40.3" width="0.4" layer="16"/>
<wire x1="20.8" y1="40.3" x2="30.55" y2="40.3" width="0.4" layer="16"/>
<wire x1="32.5" y1="39" x2="30.875" y2="40.625" width="0.4" layer="1"/>
<wire x1="32.825" y1="39" x2="32.5" y2="39" width="0.4" layer="1"/>
<wire x1="40.3" y1="31.525" x2="32.825" y2="39" width="0.4" layer="1"/>
<wire x1="40.3" y1="19.175" x2="40.3" y2="31.525" width="0.4" layer="1"/>
<wire x1="41.6" y1="17.875" x2="40.3" y2="19.175" width="0.4" layer="1"/>
<wire x1="10.725" y1="50.375" x2="10.414" y2="50.546" width="0.4" layer="16"/>
<wire x1="41.6" y1="17.875" x2="41.91" y2="17.78" width="0.4" layer="1"/>
<via x="30.875" y="40.625" extent="1-16" drill="0.35"/>
<wire x1="30.875" y1="40.625" x2="30.55" y2="40.3" width="0" layer="19" extent="16-16"/>
</signal>
<signal name="N$11">
<contactref element="LCD" pad="P$3"/>
<contactref element="B1" pad="SDA"/>
<wire x1="13.65" y1="50.375" x2="13" y2="50.375" width="0.4" layer="16"/>
<wire x1="22.75" y1="41.275" x2="13.65" y2="50.375" width="0.4" layer="16"/>
<wire x1="28.925" y1="41.275" x2="22.75" y2="41.275" width="0.4" layer="16"/>
<wire x1="31.85" y1="38.35" x2="28.925" y2="41.275" width="0.4" layer="1"/>
<wire x1="32.5" y1="38.35" x2="31.85" y2="38.35" width="0.4" layer="1"/>
<wire x1="39.65" y1="31.2" x2="32.5" y2="38.35" width="0.4" layer="1"/>
<wire x1="39.65" y1="17.225" x2="39.65" y2="31.2" width="0.4" layer="1"/>
<wire x1="41.6" y1="15.275" x2="39.65" y2="17.225" width="0.4" layer="1"/>
<wire x1="13" y1="50.375" x2="12.954" y2="50.546" width="0.4" layer="16"/>
<wire x1="41.6" y1="15.275" x2="41.91" y2="15.24" width="0.4" layer="1"/>
<via x="28.925" y="41.275" extent="1-16" drill="0.35"/>
</signal>
<signal name="N$12">
<contactref element="KY-040" pad="P$3"/>
<contactref element="B1" pad="D4"/>
<wire x1="44.525" y1="42.25" x2="44.525" y2="50.375" width="0.4" layer="1"/>
<wire x1="41.925" y1="39.65" x2="44.525" y2="42.25" width="0.4" layer="1"/>
<wire x1="44.525" y1="50.375" x2="44.704" y2="50.546" width="0.4" layer="1"/>
<wire x1="41.925" y1="39.65" x2="41.91" y2="39.37" width="0.4" layer="1"/>
</signal>
<signal name="N$13">
<contactref element="KY-040" pad="P$4"/>
<contactref element="B1" pad="D6"/>
<wire x1="39.65" y1="43.875" x2="39.65" y2="50.375" width="0.4" layer="1"/>
<wire x1="41.6" y1="41.925" x2="39.65" y2="43.875" width="0.4" layer="1"/>
<wire x1="39.65" y1="50.375" x2="39.624" y2="50.546" width="0.4" layer="1"/>
<wire x1="41.6" y1="41.925" x2="41.91" y2="41.91" width="0.4" layer="1"/>
</signal>
<signal name="N$14">
<contactref element="KY-040" pad="P$5"/>
<contactref element="B1" pad="D5"/>
<wire x1="41.925" y1="44.525" x2="41.925" y2="50.375" width="0.4" layer="1"/>
<wire x1="41.925" y1="50.375" x2="42.164" y2="50.546" width="0.4" layer="1"/>
<wire x1="41.925" y1="44.525" x2="41.91" y2="44.45" width="0.4" layer="1"/>
</signal>
</signals>
<mfgpreviewcolors>
<mfgpreviewcolor name="soldermaskcolor" color="0xC8008000"/>
<mfgpreviewcolor name="silkscreencolor" color="0xFFFEFEFE"/>
<mfgpreviewcolor name="backgroundcolor" color="0xFF282828"/>
<mfgpreviewcolor name="coppercolor" color="0xFFFFBF00"/>
<mfgpreviewcolor name="substratecolor" color="0xFF786E46"/>
</mfgpreviewcolors>
</board>
</drawing>
<compatibility>
<note version="8.2" severity="warning">
Since Version 8.2, EAGLE supports online libraries. The ids
of those online libraries will not be understood (or retained)
with this version.
</note>
<note version="8.3" severity="warning">
Since Version 8.3, EAGLE supports URNs for individual library
assets (packages, symbols, and devices). The URNs of those assets
will not be understood (or retained) with this version.
</note>
<note version="8.3" severity="warning">
Since Version 8.3, EAGLE supports the association of 3D packages
with devices in libraries, schematics, and board files. Those 3D
packages will not be understood (or retained) with this version.
</note>
</compatibility>
</eagle>

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

441
V1 (old)/stir.ino Normal file
View File

@ -0,0 +1,441 @@
/////////////////////////////////////////////////////////////////////////////////////// Stir Control (mwx'2019)
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#define MS (long)millis()
#define SX Serial.print
#define SXN Serial.println
String VERSION = "1.7.3";
int SPEEDINC = 50; // speed increment (rpm)
int FANMIN = 200; // fan minimum speed (should be a value at which the fan runs safely) (rpm)
int FANMAX = 1600; // fan maximum speed (should be the real maximum value of the fan) (rpm)
int BOFF = 0; // if set boost off will also turn the normal mode off
int BINC = 1; // BTIME increment (min)
int CINC = 10; // CTIME increment (min)
int RINC = 10; // RTIME increment (sec)
int OINC = 3; // OTIME increment (hour)
long CATCHSTOP = 20000; // fish catch stop period (ms)
int PWM0 = 9; // PWM pin for 1. fan
int PWM1 = 10; // PWM pin for 2. fan
int PWM2 = 11; // PWM pin for LCD brightness
int I0 = 2; // interrupt for fan 0 rpm signal (use 2 for Leonardo/ProMicro and 0 for Uno)
int I1 = 3; // interrupt for fan 1 rpm signal (use 3 for Leonardo/ProMicro and 1 for Uno)
int CLK = 5; // clk on KY-040 encoder
int DT = 6; // dt on KY-040 encoder
int SW = 4; // sw on KY-040 encoder
int OFF0 = 7; // off state pin 1. fan
int OFF1 = 8; // off state pin 2. fan
int OFFSTATE = LOW; // off state (LOW/HIGH)
long RINTERVAL = 5000; // regulation internval (ms)
long RDELAY = 3000; // regulation delay on changes (ms)
int RTOL = 8; // regulation tolerance (rpm)
long RNDINTERVAL = 300000; // randon value range change interval (ms)
long SINTERVAL = 2000; // speed measurement internval (ms)
int SAVERAGE = 4; // speed measurement average
int SAVETAG = 1014; // save tag
long SAVEDELAY = 10000; // EEPROM save delay (ms)
byte LCDB[] = {4,8,16,24,32,64,96,128,192,255}; // LCD brightness steps (10 values, 0=off, 255=max)
byte aright[] = {0x00,0x08,0x0C,0x0E,0x0C,0x08,0x00,0x00}; // LCD character
byte aup[] = {0x04,0x0E,0x1F,0x00,0x00,0x00,0x00,0x00};
byte arnd[] = {0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00};
LiquidCrystal_I2C lcd(0x27,16,2); // LCD display (connect to SDA/SCL)
int v[2],b[2],r[2]={0};double q,rpm[2]={0},xpm[2]={0},xb[2]={0},xv[2]={0},rtime[2]; // speed and regulation
long ac[2]={0},bc[2]={0}; // interrupt rpm counter
long xts,sts,rts,swts,buts,savets,catts[2],stop[2],bts[2],vts[2],ots[2],rndts[2]; // timing
int bdelay,bprocess=0,enclast,encval,M=2,S=0; // button/encoder processing
int F[2],bstate[2]={0},btime[2],cat[2],ctime[2],cstate[2]={0},bclr=0,SAVE=0,LOCK=0; // operating states
int ostate[2]={0},otime[2]={0}; // off timer
int brght; // LCD brightness
int rnd[2]={0},rnval[2]={0};long seed; // random speed
char form[8],out[20];String cmd[8];int icmd[8]; // string buffer
void setup() { ////////////////////////////////////////////////////////////////////////////////////////// SETUP
Serial.begin(9600); // start serial
lcd.init();lcd.clear();lcd.backlight(); // initialize lcd
lcd.createChar(0,aright);lcd.createChar(1,aup);lcd.createChar(2,arnd); // load lcd characters
pinMode(PWM0,OUTPUT);pinMode(PWM1,OUTPUT);pinMode(PWM2,OUTPUT); // setup PWM pins
pinMode(CLK,INPUT);pinMode(DT,INPUT);pinMode(SW,INPUT); // setup KY-040 pins
digitalWrite(CLK,true);digitalWrite(DT,true);digitalWrite(SW,true); // turn ON pullup resistors
pinMode(OFF0,OUTPUT);pinMode(OFF1,OUTPUT); // setup off state pins
attachInterrupt(I0,rpmint0,FALLING); // setup interrupts vor rpm in
attachInterrupt(I1,rpmint1,FALLING);
TCCR1A=0;TCCR1B=0;TCNT1=0; // setup timer for 25 kHz PWM
TCCR1A=_BV(COM1A1)|_BV(COM1B1)|_BV(WGM11);TCCR1B=_BV(WGM13)|_BV(CS10);ICR1=320;
SAVE=0; // load/initialize settings
if (eer(0)!=SAVETAG) {
for (int i=0;i<2;i++) {;v[i]=300;b[i]=700;btime[i]=30;cat[i]=0;ctime[i]=120;rtime[i]=60;F[i]=0;rnval[i]=0;}
brght=5;seed=0;
eew(0,SAVETAG);save();
} else {
for (int i=0;i<2;i++) {
v[i]=eer(1+i);b[i]=eer(3+i);btime[i]=eer(5+i);cat[i]=eer(7+i);
ctime[i]=eer(9+i);F[i]=eer(11+i);rtime[i]=eer(13+i);rnval[i]=eer(15+i);
}
seed=eer(100)+1;eew(100,seed);randomSeed(seed);
brght=eer(101);
}
lset();
enclast=digitalRead(CLK); // get encoder state
for (int i=0;i<2;i++) catts[i]=stop[i]=vts[i]=ots[i]=rndts[i]=MS;xts=sts=rts=swts=buts=savets=MS; // timer
updatePWM();updatelcd();updatespeed();updatemarker(); // update all
slcd(0,0,5,VERSION); // show version
}
void loop() { //////////////////////////////////////////////////////////////////////////////////////////// LOOP
if (Serial.available() > 0) { ////////////////////////////////////////////////////////// serial communication
int n=cutcmd(Serial.readString());
int err=1;
int i=cut(icmd[1],0,1);
if (cmd[0]=="info" && n==1) {;err=0;}
if (cmd[0]=="version" && n==1) {;SXN(VERSION);return;}
if (cmd[0]=="save" && n==1) {;save();}
if (cmd[0]=="speed" && n==3) {;v[i]=cut(icmd[2],FANMIN,FANMAX);err=0;}
if (cmd[0]=="bspeed" && n==3) {;b[i]=cut(icmd[2],FANMIN,FANMAX);err=0;}
if (cmd[0]=="btime" && n==3) {;btime[i]=cut(icmd[2],0,60);err=0;}
if (cmd[0]=="ctime" && n==3) {;ctime[i]=cut(icmd[2],60,240);err=0;}
if (cmd[0]=="rtime" && n==3) {;rtime[i]=cut(icmd[2],0,240);err=0;}
if (cmd[0]=="rnval" && n==3) {;rnval[i]=cut(icmd[2],0,1000);err=0;}
if (cmd[0]=="on" && n==2) {;fset(i,1);err=0;}
if (cmd[0]=="off" && n==2) {;fset(i,0);err=0;}
if (cmd[0]=="bon" && n==2) {;bset(i,1);err=0;}
if (cmd[0]=="boff" && n==2) {;bset(i,0);err=0;}
if (cmd[0]=="con" && n==2) {;cat[i]=1;catts[i]=MS;err=0;}
if (cmd[0]=="coff" && n==2) {;cat[i]=0;catts[i]=MS;err=0;}
if (cmd[0]=="otime" && n==3) {;oset(i,icmd[2]);err=0;}
updatelcd();
for (int i=0;i<2;i++) {
SX(F[i]);SX(":"); // 0, 16
SX((int)(v[i]));SX(":"); // 1, 17
SX((int)(b[i]));SX(":"); // 2, 18
SX(rpm[i]);SX(":"); // 3, 19
SX(xpm[i]);SX(":"); // 4, 20
SX(r[i]);SX(":"); // 5, 21
SX(bstate[i]);SX(":"); // 6, 22
SX(btime[i]);SX(":"); // 7, 23
SX(cat[i]);SX(":"); // 8, 24
SX(ctime[i]);SX(":"); // 9, 25
SX(rtime[i]);SX(":"); // 10, 26
SX(otime[i]);SX(":"); // 11, 27
SX(rnval[i]);SX(":"); // 12, 28
SX(rnd[i]);SX(":"); // 13, 29
if (bstate[i]) SX((((long)btime[i]*60000)-(MS-(long)bts[i]))/1000+1); else SX(0);SX(":"); // 14, 30
if (ostate[i]) SX((((long)otime[i]*3600000)-(MS-(long)ots[i]))/1000+1); else SX(0);SX(":"); // 15, 31
}
SX(VERSION);SX(":"); // 32
SX(MS);SX(":"); // 33
SXN(err); // 34
save();
}
if (SAVE>0 && MS-savets>SAVEDELAY) {;save();SAVE=0;savets=MS;} ////////////////////// save settings if needed
if (MS-savets>SAVEDELAY/5) bclr=1;
for (int i=0;i<2;i++) {
if (MS-rndts[i]>RNDINTERVAL) { /////////////////////////////////////////////////////////////// random timer
rnd[i]=int(random(0,rnval[i]+1)/10)*10;rndts[i]=MS;updatelcd();
}
if (ostate[i] && MS-ots[i]>(long)otime[i]*3600000) { ////////////////////////////////////// check off timer
otime[i]=0;ostate[i]=0;fset(i,0);
}
if (cat[i] && MS-catts[i]>(long)ctime[i]*60000 && F[i]==1) { //////////////////////////// initiate cat fish
catts[i]=MS;cstate[i]=1;F[i]=0;stop[i]=MS;updatePWM();updatespeed();
}
if (cstate[i] && MS-stop[i]>CATCHSTOP && F[i]==0) { ////////////////////////// stop cat fish and start over
cstate[i]=0;F[i]=1;vts[i]=MS;rts=MS+2000;updatePWM();updatespeed();
}
if (bstate[i] && MS-bts[i]>(long)btime[i]*60000) {;bstate[i]=0;S=0;updatelcd();} //////// check boost state
}
if (MS-xts>SINTERVAL) { /////////////////////////////////////////////////////////////////// speed measurement
for (int i=0;i<2;i++) xpm[i]=xpm[i]*(SAVERAGE-1)/SAVERAGE+(bc[i]/((MS-xts)/1000.0)*30.0)/SAVERAGE;
updatespeed();xts=MS;bc[0]=0;bc[1]=0;
}
if (MS-rts>RINTERVAL) { //////////////////////////////////////////////////////////////////// speed regulation
for (int i=0;i<2;i++) {
rpm[i]=ac[i]/((MS-sts)/1000.0)*30.0;
ac[i]=0;
calcramp(i);
if (!F[i]) {;r[i]=0;setPWM(i,0);}
else {
q=(bstate[i]?xb[i]:xv[i])-rpm[i];
if (abs(q)>RTOL) r[i]=q<0?r[i]-1-abs(q)/10:r[i]+1+abs(q)/10;
setPWM(i,cut((bstate[i]?xb[i]:xv[i])/(FANMAX/320.0)+r[i],0,320));
}
}
sts=MS;rts=MS;
updatespeed();
}
bdelay=0; //////////////////////////////////////////////////////////////////////////////////// process switch
if (!bprocess) {
while (!digitalRead(SW)){
bdelay++;delay(15);bprocess=1;if (bdelay>20) break;
}
}
if (bdelay>0 && MS-buts>100) { // long button press
if (bdelay>20) {
if (M==2) { // lock/unlock
if (LOCK==0) LOCK=1;
else LOCK=0;
updatemarker();
} else {
if (S==0 && !LOCK) { // fan on/off
if (F[M]==0) fset(M,1); else fset(M,0);
}
if (S==1 && !LOCK) { // boost on/off
if (bstate[M]==0) bset(M,1); else {;bset(M,0);if (BOFF) fset(M,0);}
bclr=1;
}
}
save();updatespeed();bdelay=0;
} else if (bdelay>0 && bdelay<20 && !LOCK) { // short button press, switch: menu -> fan 0 -> fan 1
M++;if (S==8 && M==1) M=2;if (M>2) M=0;
updatemarker();
bdelay=0;
}
SAVE++;buts=MS;
}
if (digitalRead(SW)) bprocess=0;
encval = digitalRead(CLK); ////////////////////////////////////////////////////////////////// process encoder
if (encval != enclast && !LOCK) {
if(!encval){
if (digitalRead(DT) != encval) { // turn encoder clockwise
if (M==2) S++; // scroll menu
else {
if (S==0) v[M]+=SPEEDINC; // fan speed up
if (S==1) b[M]+=SPEEDINC; // boost speed up
if (S==2) btime[M]+=BINC; // boost time up
if (S==3) cat[M]++; // cat on/off
if (S==4) ctime[M]+=CINC; // cat time up
if (S==5) rtime[M]+=RINC; // rise time up
if (S==6) otime[M]+=OINC; // off time up
if (S==7) rnval[M]+=SPEEDINC; // random value
if (S==8) brght++; // increase LCD brightness
}
} else { // turn encoder counterclockwise
if (M==2) S--; // scroll menu
else {
if (S==0) v[M]-=SPEEDINC; // fan speed down
if (S==1) b[M]-=SPEEDINC; // boost speed down
if (S==2) btime[M]-=BINC; // boost time down
if (S==3) cat[M]--; // cat on/off
if (S==4) ctime[M]-=CINC; // cat time down
if (S==5) rtime[M]-=RINC; // rise time down
if (S==6) otime[M]-=OINC; // off time down
if (S==7) rnval[M]-=SPEEDINC; // random value
if (S==8) brght--; // decrease LCD brightness
}
}
for (int i=0;i<2;i++) if (b[i]<v[i]) b[i]=v[i];
if (M!=2) {
if (S<=1) {;updatePWM();rts=MS+RDELAY;} // apply (boost) speed change
if (S==2) btime[M]=cut(btime[M],0,99); // check boost time
if (S==3) {;cat[M]=cut(cat[M],0,1);catts[M]=MS;} // check cat
if (S==4) ctime[M]=cut(ctime[M],60,240); // check cat time
if (S==5) rtime[M]=cut(rtime[M],0,240); // check rise time
if (S==6) oset(M,otime[M]); // check off time
if (S==7) {;rnval[M]=cut(rnval[M],0,1000);updatePWM();} // apply random value change
if (S==8) lset(); // set LCD brightness
}
if (M==2) S=cut(S,0,8); // check menu mode
SAVE++;updatelcd();delay(25);
}
}
enclast=encval;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////// SUPPORT
void lset() { ////////////////////////////////////////////////////////////////////////////// set LCD brightness
brght=cut(brght,0,9);
analogWrite(PWM2,LCDB[brght]);
}
void oset(int n,int t) { ///////////////////////////////////////////////////////////////// set switch off timer
otime[n]=cut(t,0,99);ots[n]=MS;ostate[n]=otime[n]?1:0;
SAVE++;
}
void fset(int n,int s) { /////////////////////////////////////////////////////////////// set fan state (on/off)
if (s==1) {
rts=MS+RDELAY;F[n]=1;catts[n]=vts[n]=MS;r[n]=0;
} else {
F[n]=0;bstate[n]=0;
}
updatePWM();
SAVE++;
}
void bset(int n,int s) { ///////////////////////////////////////////////////////////// set boost state (on/off)
if (s==1) {
rts=MS+RDELAY;bstate[n]=1;bts[n]=MS;F[n]=1;vts[n]=MS;
} else {
bstate[n]=0;rts=MS+RDELAY;
}
updatePWM();
SAVE++;
}
void updatelcd() { ///////////////////////////////////////////////////////////////////////////////// update LCD
for (int i=0;i<2;i++) {
if (S==0) {;slcd(1,1,5,"SPEED");ilcd(7+i*5,1,-4,v[i]);}
if (S==1) {;slcd(1,1,5,"BOOST");ilcd(7+i*5,1,-4,int(b[i]));}
if (S==2) {;slcd(1,1,5,"BTIME");ilcd(7+i*5,1,-4,int(btime[i]));}
if (S==3) {
slcd(1,1,5,"CATCH");
if (cat[i]==0) slcd( 7+i*5,1,-4,"OFF"); else slcd( 7+i*5,1,-3,"ON");
}
if (S==4) {;slcd(1,1,5,"CTIME");ilcd(7+i*5,1,-4,int(ctime[i]));}
if (S==5) {;slcd(1,1,5,"RTIME");ilcd(7+i*5,1,-4,int(rtime[i]));}
if (S==6) {;slcd(1,1,5,"OTIME");ilcd(7+i*5,1,-4,int(otime[i]));}
if (S==7) {;slcd(1,1,5,"RNVAL");ilcd(7+i*5,1,-4,int(rnval[i]));}
}
if (S==8) {;slcd(1,1,5,"BRGHT");ilcd(7,1,-4,brght);slcd(7+5,1,-4," ");}
}
void updatemarker() { ////////////////////////////////////////////////////////////////////// update menu marker
slcd(0,1,1," ");slcd(6,1,1," ");slcd(11,1,1," ");
int m[]={6,11,0};if (!LOCK) clcd(m[M],1,0);
}
void updatespeed() { ///////////////////////////////////////////////////////////////////////// update fan speed
if (bclr) slcd(0,0,6," ");
for (int i=0;i<2;i++) {
slcd(6+i*5,0,1," ");
if (cstate[i]) slcd(7+i*5,0,-4,"CAT");
else {
if (F[i]) {
if (bstate[i]) ilcd(1+i*3,0,-2, (((long)btime[i]*60000)-(MS-(long)bts[i]))/1000/60+1);
else if (ostate[i]) ilcd(1+i*3,0,-2, (((long)otime[i]*3600000)-(MS-(long)ots[i]))/1000/60/60+1);
ilcd(7+i*5,0,-4,round(xpm[i]));
if ((!bstate[i] && xv[i]<v[i]) || (bstate[i] && xb[i]<b[i])) clcd(6+i*5,0,1);
else {
if (xv[i]>=v[i] && rnval[i]>0 && !bstate[i]) clcd(6+i*5,0,2);
}
} else slcd(7+i*5,0,-4,"OFF");
}
}
}
void clcd(int x,int y, char v) { /////////////////////////////////////////////////////// write character to LCD
lcd.setCursor(x,y);lcd.write(v);
}
void ilcd(int x,int y, int l,int v) { //////////////////////////////////////////////////// write integer to LCD
sprintf(form,"%%%dd",l);sprintf(out,form,v);lcd.setCursor(x,y);lcd.print(out);
}
void slcd(int x,int y, int l,String s) { ////////////////////////////////////////////////// write string to LCD
sprintf(form,"%%%ds",l);sprintf(out,form,s.c_str());lcd.setCursor(x,y);lcd.print(out);
}
void calcramp(int i) { ///////////////////////////////////////////////////////////// calculate speed ramp value
xb[i]=b[i];
int rt=rtime[i]?rtime[i]:1;
if (bstate[i]) xb[i]=cut(((b[i]-v[i])/(rt*1000.0)*(MS-bts[i]))+v[i],v[i],b[i]);
xv[i]=v[i];
xv[i]=cut(((v[i]-FANMIN)/(rt*1000.0)*(MS-vts[i]))+FANMIN,FANMIN,v[i]);
if (rnval[i]>0 && xv[i]>=v[i]) xv[i]=cut(xv[i]+rnd[i],FANMIN,FANMAX);
}
void setPWM(int n,int v) { /////////////////////////////////////////// set value to OCR1x and states to off pin
if (n==0) {
OCR1A=v;
if (v==0) digitalWrite(OFF0,OFFSTATE?HIGH:LOW);
else digitalWrite(OFF0,OFFSTATE?LOW:HIGH);
}
if (n==1) {
OCR1B=v;
if (v==0) digitalWrite(OFF1,OFFSTATE?HIGH:LOW);
else digitalWrite(OFF1,OFFSTATE?LOW:HIGH);
}
}
void updatePWM() { ////////////////////////////////////////////////////////////// update PWM output (fan speed)
for (int i=0;i<2;i++) {
v[i]=cut(v[i],FANMIN,FANMAX);
b[i]=cut(b[i],FANMIN,FANMAX);
calcramp(i);
if (!F[i]) setPWM(i,0); else setPWM(i,cut((bstate[i]?xb[i]:xv[i])/(FANMAX/320.0)+r[i],0,320));
}
}
void rpmint0() {;ac[0]++;bc[0]++;} ///////////////////////////////////////////////////////////// rpm interrupts
void rpmint1() {;ac[1]++;bc[1]++;}
double cut(double v,double min,double max) {;return v>max?max:v<min?min:v>max?max:v;} ///// cut values to limit
int eer(int adr) {;return EEPROM.read(adr*2)+EEPROM.read(adr*2+1)*256;} /////////////////////////// read EEPROM
void eew(int adr, int val) {;EEPROM.write(adr*2,val%256);EEPROM.write(adr*2+1,val/256);} /////// save to EEPROM
void save() { /////////////////////////////////////////////////////////////////////////////////// save settings
for (int i=0;i<2;i++) {
eew(1+i,v[i]);eew(3+i,b[i]);eew(5+i,btime[i]);eew(7+i,cat[i]);
eew(9+i,ctime[i]);eew(11+i,F[i]);eew(13+i,rtime[i]);eew(15+i,rnval[i]);
}
eew(100,seed);
eew(101,brght);
}
int cutcmd(String data) { ///////////////////////////////////////////////////////////// get saperated substring
int mi=data.length(),n=0,j=0;
for (int i=0;i<=mi;i++) {
if (data.charAt(i) == ':' || i == mi) {;cmd[n]=data.substring(j,i);j=i+1;n++;}
}
for (int i=1;i<n;i++) icmd[i]=cmd[i].toInt();
return n;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////// END

70
V1 (old)/stirctl Executable file
View File

@ -0,0 +1,70 @@
#!/usr/bin/perl
###################################################################################### stir controll (mwx'2019)
use Device::SerialPort;
use Time::HiRes qw( usleep );
$dev='/dev/ttyACM0';
my $port = Device::SerialPort->new($dev); ################################################### setup serial port
$port->baudrate(9600);
$port->databits(8);
$port->parity("none");
$port->stopbits(1);
$port->lookfor();
$cmd=join(':',@ARGV);$cmd='info' if ($cmd=~/^\s*$/);
@r=split(':',&scmd($cmd));
print " LEFT RIGHT\n";
printf("Stirrer On: %6d %6d\n", $r[0],$r[16]);
printf("Speed: %6d %6d\n", $r[1],$r[17]);
printf("Boost Speed: %6d %6d\n", $r[2],$r[18]);
printf("RPM: %6d %6d\n", $r[3],$r[19]);
printf("Average RPM: %6d %6d\n", $r[4],$r[20]);
printf("Regulation: %6d %6d\n", $r[5],$r[21]);
printf("Boost On: %6d %6d\n", $r[6],$r[22]);
printf("Boost Time: %6d %6d\n", $r[7],$r[23]);
printf("Catch On: %6d %6d\n", $r[8],$r[24]);
printf("Catch Time: %6d %6d\n", $r[9],$r[25]);
printf("Rise Time: %6d %6d\n", $r[10],$r[26]);
printf("Off Time: %6d %6d\n", $r[11],$r[27]);
printf("Random Range: %6d %6d\n", $r[12],$r[28]);
printf("Random Value: %6d %6d\n", $r[13],$r[29]);
printf("Boost Remain: %6d %6d\n", $r[14],$r[30]);
printf("Off Remain: %6d %6d\n", $r[15],$r[31]);
printf("VERSION: %s\n",$r[32]);
printf("UPTIME: %s\n",&dhms($r[33]/1000));
printf("ERROR: %d\n",$r[34]);
sub scmd() { ##################################################################################### send command
my($cmd,$quiet)=@_;
$port->write($cmd);
my $founddata=0;
$msg="";
for ($i=0;$i<1000;$i++) {
$in = $port->lookfor();
$founddata=1 if ($in ne "");
$msg.=$in;
last if ($in eq "" && $founddata);
&usleep(2500);
}
$msg=~s/[\r\n]+//g;
return $msg;
}
sub dhms { ######################################################################## convert secs to dd:hh:mm:ss
my($t)=@_;my ($d,$h,$m,$s);
$s=$t%60;$t=($t-$s)/60;$m=$t%60;$t=($t-$m)/60;$h=$t%24;$t=($t-$h)/24;$d=$t;
return sprintf("%d:%02d:%02d:%02d",$d,$h,$m,$s);
}
########################################################################################################### END

Binary file not shown.

View File

@ -0,0 +1,3 @@
# CAD Files
CAD files for 3D printed display bezel from Herbert Schmid.

Binary file not shown.

Binary file not shown.

BIN
cad/case@jens/Frontblende.stl Executable file

Binary file not shown.

BIN
cad/case@jens/KY040_Knopf.stl Executable file

Binary file not shown.

BIN
cad/case@jens/Kantenschutz.stl Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
cad/case@jens/README.md Normal file
View File

@ -0,0 +1,3 @@
# CAD Files
CAD files for 3D printed case parts from Jens Warkentin.

View File

@ -1,52 +0,0 @@
$fn=128;
g = 10; // magnet gap
fw = 48.3; // fan width
h = 4; // base height
r = 5; // edge width
pn = 7; // number of pins
ph = 7; // pin height
pa = 20; // pin angle
mw = 10.25; // magnet width
ml = 20.25; // magnet length
mb = 17; // magnet bar width
d=fw+r+r; // total diameter
cl=d-r; // magnet bar length
a=360/pn; // segment angle
e=(d+g-10)/d; // elliptic scale factor
difference() {
union() {
difference() {
union() {
translate([0,0,0]) cylinder(h+ph,d/2,d/2);
translate([0,0,0]) scale([e, 1, 1]) cylinder(h,d/2,d/2);
}
translate([0,0,-1]) cylinder(h+ph+2,d/2-r,d/2-r);
for (i =[0:1:pn-1]) {
pin(a*i);
}
}
translate([-cl/2,-mb/2,0]) cube([cl,mb,h]);
rotate ([0,0,90]) translate([-cl/2,-(mb-mw)/4-d/7,0]) cube([cl,(mb-mw)/2,h]);
rotate ([0,0,90]) translate([-cl/2,-(mb-mw)/4+d/7,0]) cube([cl,(mb-mw)/2,h]);
}
translate([-ml-g/2,-mw/2,-1]) cube([ml,mw,h]);
translate([g/2,-mw/2,-1]) cube([ml,mw,h]);
}
module pin(r) {
translate([0,0,0.01]) rotate([0,0,r]) hull() {
translate([0,0,h]) cylinder(h+ph,0.1,0.1);
translate([-d,0,h]) cylinder(h+ph,0.1,0.1);
rotate ([0,0,a-pa])union() {
translate([0,0,h]) cylinder(h+ph,0.1,0.1);
translate([-d,0,h]) cylinder(h+ph,0.1,0.1);
}
}
}

View File

@ -1,7 +1,7 @@
# CAD Files
CAD files for 3D printed magnet holder. Compatible for magnets with size 20x10x5 mm and
*be quiet! Silent Wings 3 140 mm* fans.
CAD files for 3D printed magnet moun. Compatible for magnets with size 20x10x5 mm and
*be quiet! Silent Wings 3 120/140 mm* fans.
<p align="center">
<img src="https://github.com/micworg/stir/blob/master/images/magnetmount.jpg" width=500>

View File

@ -0,0 +1,57 @@
/// magnet mount for for magnets with size 20x10x5 mm and be quiet! Silent Wings 3 120/140 mm fans
$fn=128;
g = 10; // magnet gap
fan = 120; // fan size (120 or 140)
h = 4; // base height
r = 5; // edge width
pn = 7; // number of pins
ph = 7; // pin height
pa = 20; // pin angle
mw = 10.25; // magnet width
ml = 20.25; // magnet length
mb = 17; // magnet bar width
fw= fan==140 ? 48.3 : 42.5; // fan center width
eo= fan==140 ? 10 : 5; // elliptic extra offset
d=fw+r+r; // total diameter
cl=d-r; // magnet bar length
a=360/pn; // segment angle
e=(d+g-eo)/d; // elliptic scale factor
difference() {
union() {
difference() {
union() {
translate([0,0,0]) cylinder(h+ph,d/2,d/2);
translate([0,0,0]) scale([e, 1, 1]) cylinder(h,d/2,d/2);
}
translate([0,0,-1]) cylinder(h+ph+2,d/2-r,d/2-r);
for (i =[0:1:pn-1]) {
pin(a*i);
}
}
translate([-cl/2,-mb/2,0]) cube([cl,mb,h]);
rotate ([0,0,90]) translate([-cl/2,-(mb-mw)/4-d/7,0]) cube([cl,(mb-mw)/2,h]);
rotate ([0,0,90]) translate([-cl/2,-(mb-mw)/4+d/7,0]) cube([cl,(mb-mw)/2,h]);
}
translate([-ml-g/2,-mw/2,-1]) cube([ml,mw,h]);
translate([g/2,-mw/2,-1]) cube([ml,mw,h]);
}
module pin(r) {
translate([0,0,0.01]) rotate([0,0,r]) hull() {
translate([0,0,h]) cylinder(h+ph,0.1,0.1);
translate([-d,0,h]) cylinder(h+ph,0.1,0.1);
rotate ([0,0,a-pa])union() {
translate([0,0,h]) cylinder(h+ph,0.1,0.1);
translate([-d,0,h]) cylinder(h+ph,0.1,0.1);
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
images/pcb_top.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 140 KiB

BIN
images/stir+pcb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

BIN
images/v2_board.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

338
stir.ino
View File

@ -1,68 +1,125 @@
/////////////////////////////////////////////////////////////////////////////////////// Stir Control (mwx'2019)
//////////////////////////////////////////////////////////////////////////////////// Stir Control V2 (mwx'2019)
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#define MS (long)millis()
#define NP 25
#define SX Serial.print
#define SXN Serial.println
String VERSION = "2.1.2";
String VERSION = "1.5.6";
int FANINIT = 0; // initialize fan with high voltage (0/1)
int SPEEDINC = 50; // speed increment (rpm)
int SPEEDINC1 = 20; // speed increment values
int SPEEDINC2 = 50;
int SPEEDINC3 = 100;
int SPEEDSTEP1 = 400; // speed increment steps (increment changes at these values)
int SPEEDSTEP2 = 1000;
int RNDINC = 50; // random value increment (rpm)
int FANMIN = 200; // fan minimum speed (should be a value at which the fan runs safely) (rpm)
int FANMAX = 1600; // fan maximum speed (should be the real maximum value of the fan) (rpm)
int FANMAX = 2500; // fan maximum speed (should be the real maximum value of the fan) (rpm)
int BOFF = 0; // if set boost off will also turn the normal mode off
int BOFF = 0; // if set boost off will also turn the normal mode off (0/1)
int BINC = 1; // BTIME increment (min)
int CINC = 10; // CTIME increment (min)
int RINC = 10; // RTIME increment (sec)
int OINC = 3; // OTIME increment (hour)
long CATCHSTOP = 20000; // fish catch stop period (ms)
int CATCHSTOP = 20; // fish catch stop period (sec)
int PWM0 = 9; // PWM pin for 1. fan
int PWM1 = 10; // PWM pin for 2. fan
int I0 = 2; // interrupt for fan 0 rpm signal (use 2 for Leonardo/ProMicro and 0 for Uno)
int I1 = 3; // interrupt for fan 1 rpm signal (use 3 for Leonardo/ProMicro and 1 for Uno)
int PWM2 = 11; // PWM pin for LCD brightness
int I0 = 0; // interrupt for fan 0 rpm signal (use 2 for Leonardo/ProMicro and 0 for Uno)
int I1 = 1; // interrupt for fan 1 rpm signal (use 3 for Leonardo/ProMicro and 1 for Uno)
int SWAPENC = 1; // swap encoder direction
int CLK = 5; // clk on KY-040 encoder
int CLK = 5; // clk on KY-040 encoder (swap clk and dt to invert direction)
int DT = 6; // dt on KY-040 encoder
int SW = 4; // sw on KY-040 encoder
long RINTERVAL = 5000; // regulation interval (ms)
long RDELAY = 3000; // regulation delay on changes (ms)
int R0 = 7; // voltage select relais 0
int R1 = 8; // voltage select relais 1
int RTHRES = 700; // voltage switch threshold (rpm)
int RINTERVAL = 50; // regulation internval (ds)
int RDELAY = 30; // regulation delay on changes (ds)
int RTOL = 8; // regulation tolerance (rpm)
long SINTERVAL = 2000; // speed measurement interval
int RNDINTERVAL = 300; // randon value range change interval (sec)
int SINTERVAL = 20; // speed measurement internval (ds)
int SAVERAGE = 4; // speed measurement average
int SAVETAG = 1011; // save tag
int SAVETAG = 2017; // save tag
long SAVEDELAY = 10000; // EEPROM save delay (ms)
int RESET = 0; // factory reset, DON'T CHANGE THIS HERE (used from configuration menu)
int LGHT = 5; // LCD brightness
byte LCDB[] = {4,8,16,24,32,64,96,128,192,255}; // LCD brightness steps (10 values, 0=off, 255=max)
byte aright[] = {0x00,0x08,0x0C,0x0E,0x0C,0x08,0x00,0x00}; // LCD character
byte aup[] = {0x04,0x0E,0x1F,0x00,0x00,0x00,0x00,0x00};
byte arnd[] = {0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00};
LiquidCrystal_I2C lcd(0x27,16,2); // LCD display (connect to SDA/SCL)
int v[2],b[2],r[2]={0};double q,rpm[2]={0},xpm[2]={0},xb[2]={0},xv[2]={0},rtime[2]; // speed and regulation
long ac[2]={0},bc[2]={0}; // interrupt rpm counter
long xts,sts,rts,swts,buts,savets,catts[2],stop[2],bts[2],vts[2],ots[2]; // timing
int bdelay,bprocess=0,enclast,encval,M=2,S=0; // button/encoder processing
long xts,sts,rts,swts,buts,savets,catts[2],stop[2],bts[2],vts[2],ots[2],rndts[2]; // timing
int bdelay,bprocess=0,enclast,encval,M=2,S=0,C=0; // button/encoder processing
int F[2],bstate[2]={0},btime[2],cat[2],ctime[2],cstate[2]={0},bclr=0,SAVE=0,LOCK=0; // operating states
int ostate[2]={0},otime[2]={0}; // off timer
char form[8],out[20];String cmd[8];int icmd[8]; // string buffer
int rnd[2]={0},rnval[2]={0};long seed; // random speed
char form[8],out[20]; // string buffer
String CF[NP];int *P[NP],Cinc[NP],Cmin[NP],Cmax[NP]; // configuration menu
int clkorg,dtorg; // encoder direction
void(* resetFunc) (void) = 0;
void setup() { ////////////////////////////////////////////////////////////////////////////////////////// SETUP
Serial.begin(9600); // start serial
lcd.init();lcd.clear();lcd.backlight();lcd.createChar(0,aright);lcd.createChar(1,aup); // initialize lcd
pinMode(PWM0,OUTPUT);pinMode(PWM1,OUTPUT); // set PWM pins
pinMode(CLK,INPUT);pinMode(DT,INPUT);pinMode(SW,INPUT); // set KY-040 pins
int i=0;
P[i]=&LGHT; CF[i]=F("LGHT"); defcon(i, 1, 0, 9 ); i++;
P[i]=&SPEEDINC1; CF[i]=F("SPI1"); defcon(i, 10, 10, 500 ); i++;
P[i]=&SPEEDINC2; CF[i]=F("SPI2"); defcon(i, 10, 10, 500 ); i++;
P[i]=&SPEEDINC3; CF[i]=F("SPI3"); defcon(i, 10, 10, 500 ); i++;
P[i]=&SPEEDSTEP1; CF[i]=F("SPS1"); defcon(i, 50, 100, 2000 ); i++;
P[i]=&SPEEDSTEP2; CF[i]=F("SPS2"); defcon(i, 50, 100, 2000 ); i++;
P[i]=&SWAPENC; CF[i]=F("SWEN"); defcon(i, 1, 0, 1 ); i++;
P[i]=&RNDINC; CF[i]=F("RINC"); defcon(i, 1, 0, 9 ); i++;
P[i]=&CATCHSTOP; CF[i]=F("CSTP"); defcon(i, 10, 0, 1000 ); i++;
P[i]=&FANMIN; CF[i]=F("FMIN"); defcon(i, 50, 100, 1000 ); i++;
P[i]=&FANMAX; CF[i]=F("FMAX"); defcon(i, 50, 500, 4000 ); i++;
P[i]=&FANINIT; CF[i]=F("FINI"); defcon(i, 1, 0, 1 ); i++;
P[i]=&RTHRES; CF[i]=F("RTHR"); defcon(i, 50, 0, 1500 ); i++;
P[i]=&RNDINTERVAL; CF[i]=F("RINT"); defcon(i, 1, 0, 60 ); i++;
P[i]=&BOFF; CF[i]=F("BOFF"); defcon(i, 1, 0, 1 ); i++;
P[i]=&BINC; CF[i]=F("BINC"); defcon(i, 1, 1, 60 ); i++;
P[i]=&CINC; CF[i]=F("CINC"); defcon(i, 1, 1, 60 ); i++;
P[i]=&RINC; CF[i]=F("RINC"); defcon(i, 1, 1, 60 ); i++;
P[i]=&OINC; CF[i]=F("OINC"); defcon(i, 1, 1, 60 ); i++;
P[i]=&RINTERVAL; CF[i]=F("XINT"); defcon(i, 1, 10, 250 ); i++;
P[i]=&RDELAY; CF[i]=F("XDEL"); defcon(i, 1, 0, 100 ); i++;
P[i]=&RTOL; CF[i]=F("XTOL"); defcon(i, 1, 1, 100 ); i++;
P[i]=&SINTERVAL; CF[i]=F("SINT"); defcon(i, 1, 0, 100 ); i++;
P[i]=&SAVERAGE; CF[i]=F("SAVG"); defcon(i, 1, 1, 100 ); i++;
P[i]=&RESET; CF[i]=F("RSET"); defcon(i, 1, 0, 1 ); i++;
lcd.init();lcd.clear();lcd.backlight(); // initialize lcd
lcd.createChar(0,aright);lcd.createChar(1,aup);lcd.createChar(2,arnd); // load lcd characters
pinMode(PWM0,OUTPUT);pinMode(PWM1,OUTPUT);pinMode(PWM2,OUTPUT); // setup PWM pins
pinMode(CLK,INPUT);pinMode(DT,INPUT);pinMode(SW,INPUT); // setup KY-040 pins
digitalWrite(CLK,true);digitalWrite(DT,true);digitalWrite(SW,true); // turn ON pullup resistors
pinMode(R0,OUTPUT);pinMode(R1,OUTPUT); // setup voltage selcet relais pins
attachInterrupt(I0,rpmint0,FALLING); // setup interrupts vor rpm in
attachInterrupt(I1,rpmint1,FALLING);
@ -72,62 +129,45 @@ void setup() { /////////////////////////////////////////////////////////////////
SAVE=0; // load/initialize settings
if (eer(0)!=SAVETAG) {
for (int i=0;i<2;i++) {;v[i]=300;b[i]=700;btime[i]=30;cat[i]=0;ctime[i]=120;rtime[i]=60;F[i]=0;}
for (i=0;i<2;i++) {;v[i]=300;b[i]=700;btime[i]=30;cat[i]=0;ctime[i]=120;rtime[i]=60;F[i]=0;rnval[i]=0;}
seed=0;
eew(0,SAVETAG);save();
} else {
for (int i=0;i<2;i++) {
for (i=0;i<2;i++) {
v[i]=eer(1+i);b[i]=eer(3+i);btime[i]=eer(5+i);cat[i]=eer(7+i);
ctime[i]=eer(9+i);F[i]=eer(11+i);rtime[i]=eer(13+i);
ctime[i]=eer(9+i);F[i]=eer(11+i);rtime[i]=eer(13+i);rnval[i]=eer(15+i);
}
seed=eer(100)+1;eew(100,seed);randomSeed(seed);
for (i=0;i<NP;i++) *P[i]=eer(200+i);
}
clkorg=CLK;dtorg=DT;if (SWAPENC) {;DT=clkorg;CLK=dtorg;} // swap encoder direction
lset();
enclast=digitalRead(CLK); // get encoder state
for (int i=0;i<2;i++) catts[i]=stop[i]=vts[i]=ots[i]=MS;xts=sts=rts=swts=buts=savets=MS; // timer
for (i=0;i<2;i++) catts[i]=stop[i]=vts[i]=ots[i]=rndts[i]=MS;xts=sts=rts=swts=buts=savets=MS; // timer
updatePWM();updatelcd();updatespeed();updatemarker(); // update all
slcd(0,0,5,VERSION); // show version
if (FANINIT) { // setup fans
digitalWrite(R0,LOW);digitalWrite(R1,LOW);delay(3000);digitalWrite(R0,HIGH);digitalWrite(R1,HIGH);
}
}
void loop() { //////////////////////////////////////////////////////////////////////////////////////////// LOOP
if (Serial.available() > 0) { ////////////////////////////////////////////////////////// serial communication
int n=cutcmd(Serial.readString());
int err=1;
int i=cut(icmd[1],0,1);
if (cmd[0]=="info" && n==1) {;err=0;}
if (cmd[0]=="version" && n==1) {;SXN(VERSION);return;}
if (cmd[0]=="save" && n==1) {;save();}
if (cmd[0]=="speed" && n==3) {;v[i]=cut(icmd[2],FANMIN,FANMAX);err=0;}
if (cmd[0]=="bspeed" && n==3) {;b[i]=cut(icmd[2],FANMIN,FANMAX);err=0;}
if (cmd[0]=="btime" && n==3) {;btime[i]=cut(icmd[2],0,60);err=0;}
if (cmd[0]=="ctime" && n==3) {;ctime[i]=cut(icmd[2],60,240);err=0;}
if (cmd[0]=="rtime" && n==3) {;rtime[i]=cut(icmd[2],0,240);err=0;}
if (cmd[0]=="on" && n==2) {;fset(i,1);err=0;}
if (cmd[0]=="off" && n==2) {;fset(i,0);err=0;}
if (cmd[0]=="bon" && n==2) {;bset(i,1);err=0;}
if (cmd[0]=="boff" && n==2) {;bset(i,0);err=0;}
if (cmd[0]=="con" && n==2) {;cat[i]=1;catts[i]=MS;err=0;}
if (cmd[0]=="coff" && n==2) {;cat[i]=0;catts[i]=MS;err=0;}
if (cmd[0]=="otime" && n==3) {;oset(i,icmd[2]);err=0;}
updatelcd();
for (int i=0;i<2;i++) {
SX(F[i]);SX(":");SX((int)(v[i]));SX(":");SX((int)(b[i]));SX(":");SX(rpm[i]);SX(":");
SX(xpm[i]);SX(":");SX(r[i]);SX(":");SX(bstate[i]);SX(":");SX(btime[i]);SX(":");
SX(cat[i]);SX(":");SX(ctime[i]);SX(":");SX(rtime[i]);SX(":");SX(otime[i]);SX(":");
if (bstate[i]) SX((((long)btime[i]*60000)-(MS-(long)bts[i]))/1000+1); else SX(0);SX(":");
if (ostate[i]) SX((((long)otime[i]*3600000)-(MS-(long)ots[i]))/1000+1); else SX(0);SX(":");
}
SX(VERSION);SX(":");SXN(err);
}
if (SAVE>0 && MS-savets>SAVEDELAY) {;save();SAVE=0;savets=MS;} ////////////////////// save settings if needed
if (MS-savets>SAVEDELAY/5) bclr=1;
for (int i=0;i<2;i++) {
if (MS-rndts[i]>((long)RNDINTERVAL*1000)) { ////////////////////////////////////////////////// random timer
rnd[i]=int(random(0,rnval[i]+1)/10)*10;rndts[i]=MS;updatelcd();
}
if (ostate[i] && MS-ots[i]>(long)otime[i]*3600000) { ////////////////////////////////////// check off timer
otime[i]=0;ostate[i]=0;fset(i,0);
}
@ -136,7 +176,7 @@ void loop() { //////////////////////////////////////////////////////////////////
catts[i]=MS;cstate[i]=1;F[i]=0;stop[i]=MS;updatePWM();updatespeed();
}
if (cstate[i] && MS-stop[i]>CATCHSTOP && F[i]==0) { ////////////////////////// stop cat fish and start over
if (cstate[i] && MS-stop[i]>((long)CATCHSTOP*1000) && F[i]==0) { ///////////// stop cat fish and start over
cstate[i]=0;F[i]=1;vts[i]=MS;rts=MS+2000;updatePWM();updatespeed();
}
@ -144,12 +184,12 @@ void loop() { //////////////////////////////////////////////////////////////////
}
if (MS-xts>SINTERVAL) { /////////////////////////////////////////////////////////////////// speed measurement
if (MS-xts>(SINTERVAL*100)) { ///////////////////////////////////////////////////////////// speed measurement
for (int i=0;i<2;i++) xpm[i]=xpm[i]*(SAVERAGE-1)/SAVERAGE+(bc[i]/((MS-xts)/1000.0)*30.0)/SAVERAGE;
updatespeed();xts=MS;bc[0]=0;bc[1]=0;
}
if (MS-rts>RINTERVAL) { //////////////////////////////////////////////////////////////////// speed regulation
if (MS-rts>(RINTERVAL*100)) { ////////////////////////////////////////////////////////////// speed regulation
for (int i=0;i<2;i++) {
rpm[i]=ac[i]/((MS-sts)/1000.0)*30.0;
ac[i]=0;
@ -169,7 +209,7 @@ void loop() { //////////////////////////////////////////////////////////////////
bdelay=0; //////////////////////////////////////////////////////////////////////////////////// process switch
if (!bprocess) {
while (!digitalRead(SW)){
bdelay++;delay(25);bprocess=1;if (bdelay>20) break;
bdelay++;delay(15);bprocess=1;if (bdelay>20) break;
}
}
@ -188,12 +228,20 @@ void loop() { //////////////////////////////////////////////////////////////////
if (bstate[M]==0) bset(M,1); else {;bset(M,0);if (BOFF) fset(M,0);}
bclr=1;
}
if (S==8 && !LOCK) { // exit config mode
M=2;save();updatemarker();
if (SWAPENC) {;DT=clkorg;CLK=dtorg;}
else {;DT=dtorg;CLK=clkorg;}
if (RESET==1) {;RESET=0;eew(0,0);save();resetFunc();}
}
}
save();updatespeed();bdelay=0;
} else if (bdelay>0 && bdelay<20 && !LOCK) { // short button press, switch: menu -> fan 0 -> fan 1
M++;if (M>2) M=0;
M++;
if (S==8 && M==2) M=0;
if (M>2) M=0;
updatemarker();
bdelay=0;
}
@ -205,45 +253,57 @@ void loop() { //////////////////////////////////////////////////////////////////
encval = digitalRead(CLK); ////////////////////////////////////////////////////////////////// process encoder
if (encval != enclast && !LOCK) {
if(!encval){
if (digitalRead(DT) != encval) { // turn encoder clockwise
if (M==2) S++; // scroll menu
if (M==2) S++; // scroll menu
else {
if (S==0) v[M]+=SPEEDINC; // fan 0 speed up
if (S==1) b[M]+=SPEEDINC; // boost 0 speed up
if (S==2) btime[M]++; // boost time 0 up
if (S==3) cat[M]++; // cat 0 on/off
if (S==4) ctime[M]+=CINC; // cat time 0 up
if (S==5) rtime[M]+=RINC; // rise time 0 up
if (S==6) otime[M]+=OINC; // off time 0 up
if (S==0) v[M]=speedinc(v[M],1); // fan speed up
if (S==1) b[M]=speedinc(b[M],1); // boost speed up
if (S==2) btime[M]+=BINC; // boost time up
if (S==3) cat[M]++; // cat on/off
if (S==4) ctime[M]+=CINC; // cat time up
if (S==5) rtime[M]+=RINC; // rise time up
if (S==6) otime[M]+=OINC; // off time up
if (S==7) rnval[M]+=RNDINC; // random value
if (S==8 && M==0) C++; // increase config menu
if (S==8 && M==1) *P[C]=cut(*P[C]+Cinc[C],Cmin[C],Cmax[C]); // increase configuration value
}
} else { // turn encoder counterclockwise
if (M==2) S--; // scroll menu
if (M==2) S--; // scroll menu
else {
if (S==0) v[M]-=SPEEDINC; // fan 0 speed down
if (S==1) b[M]-=SPEEDINC; // boost 0 speed down
if (S==2) btime[M]--; // boost time 0 down
if (S==3) cat[M]--; // cat 0 on/off
if (S==4) ctime[M]-=CINC; // cat time 0 down
if (S==5) rtime[M]-=RINC; // rise time 0 down
if (S==6) otime[M]-=OINC; // off time 0 down
if (S==0) v[M]=speedinc(v[M],0); // fan speed down
if (S==1) b[M]=speedinc(b[M],0); // boost speed down
if (S==2) btime[M]-=BINC; // boost time down
if (S==3) cat[M]--; // cat on/off
if (S==4) ctime[M]-=CINC; // cat time down
if (S==5) rtime[M]-=RINC; // rise time down
if (S==6) otime[M]-=OINC; // off time down
if (S==7) rnval[M]-=RNDINC; // random value
if (S==8 && M==0) C--; // decrease config menu
if (S==8 && M==1) *P[C]=cut(*P[C]-Cinc[C],Cmin[C],Cmax[C]); // decrease configuration value
}
}
for (int i=0;i<2;i++) if (b[i]<v[i]) b[i]=v[i];
if (M!=2) {
if (S<=1) {;updatePWM();rts=MS+RDELAY;} // apply (boost) speed change
if (S==2) btime[M]=cut(btime[M],0,60); // check boost time
if (S==3) {;cat[M]=cut(cat[M],0,1);catts[0]=MS;} // check cat
if (S<=1) {;updatePWM();rts=MS+(RDELAY*100);} // apply (boost) speed change
if (S==2) btime[M]=cut(btime[M],0,99); // check boost time
if (S==3) {;cat[M]=cut(cat[M],0,1);catts[M]=MS;} // check cat
if (S==4) ctime[M]=cut(ctime[M],60,240); // check cat time
if (S==5) rtime[M]=cut(rtime[M],0,240); // check rise time
if (S==6) oset(M,otime[M]); // check off time
if (S==7) {;rnval[M]=cut(rnval[M],0,1000);updatePWM();} // apply random value change
if (S==8 && C==0) lset(); // set LCD brightness
}
if (M==2) S=cut(S,0,6); // check menu mode
C=cut(C,0,NP-1); // check configuration mode
if (M==2) S=cut(S,0,8); // check menu mode
SAVE++;updatelcd();delay(50);
SAVE++;updatelcd();delay(25);
}
}
enclast=encval;
@ -252,6 +312,29 @@ void loop() { //////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////// SUPPORT
void defcon(int n, int inc, int min, int max) { ///////////////////////////////////////////// set config limits
Cinc[n]=inc; Cmin[n]=min; Cmax[n]=max;
}
int speedinc(int s,int mode) { ////////////////////////////////////////////////////// calculate speed increment
if (mode==0) {
if (s<=SPEEDSTEP1) return s-SPEEDINC1;
if (s<=SPEEDSTEP2) return s-SPEEDINC2;
return s-SPEEDINC3;
}
if (mode==1) {
if (s<SPEEDSTEP1) return s+SPEEDINC1;
if (s<SPEEDSTEP2) return s+SPEEDINC2;
return s+SPEEDINC3;
}
return s;
}
void lset() { ////////////////////////////////////////////////////////////////////////////// set LCD brightness
LGHT=cut(LGHT,0,9);
analogWrite(PWM2,LCDB[LGHT]);
}
void oset(int n,int t) { ///////////////////////////////////////////////////////////////// set switch off timer
otime[n]=cut(t,0,99);ots[n]=MS;ostate[n]=otime[n]?1:0;
SAVE++;
@ -259,54 +342,62 @@ void oset(int n,int t) { ///////////////////////////////////////////////////////
void fset(int n,int s) { /////////////////////////////////////////////////////////////// set fan state (on/off)
if (s==1) {
rts=MS+RDELAY;F[n]=1;catts[n]=vts[n]=MS;r[n]=0;updatePWM();
rts=MS+(RDELAY*100);F[n]=1;catts[n]=vts[n]=MS;r[n]=0;
} else {
F[n]=0;bstate[n]=0;
}
updatePWM();
SAVE++;
}
void bset(int n,int s) { ///////////////////////////////////////////////////////////// set boost state (on/off)
if (s==1) {
rts=MS+RDELAY;bstate[n]=1;bts[n]=MS;F[n]=1;vts[n]=MS;
rts=MS+(RDELAY*100);bstate[n]=1;bts[n]=MS;F[n]=1;vts[n]=MS;
} else {
bstate[n]=0;rts=MS+RDELAY;updatePWM();
bstate[n]=0;rts=MS+(RDELAY*100);
}
updatePWM();
SAVE++;
}
void updatelcd() { ///////////////////////////////////////////////////////////////////////////////// update LCD
for (int i=0;i<2;i++) {
if (S==0) {;slcd(1,1,5,"SPEED");ilcd(7+i*5,1,-4,int(v[i]));}
if (S==1) {;slcd(1,1,5,"BOOST");ilcd(7+i*5,1,-4,int(b[i]));}
if (S==2) {;slcd(1,1,5,"BTIME");ilcd(7+i*5,1,-4,int(btime[i]));}
if (S==3) {
slcd(1,1,5,"CATCH");
if (cat[i]==0) slcd( 7+i*5,1,-4,"OFF"); else slcd( 7+i*5,1,-3,"ON");
}
if (S==4) {;slcd(1,1,5,"CTIME");ilcd(7+i*5,1,-4,int(ctime[i]));}
if (S==5) {;slcd(1,1,5,"RTIME");ilcd(7+i*5,1,-4,int(rtime[i]));}
if (S==6) {;slcd(1,1,5,"OTIME");ilcd(7+i*5,1,-4,int(otime[i]));}
}
}
for (int i=0;i<2;i++) {
if (S==0) {;slcd(1,1,5,F("SPEED"));ilcd(7+i*5,1,-4,v[i]);}
if (S==1) {;slcd(1,1,5,F("BOOST"));ilcd(7+i*5,1,-4,int(b[i]));}
if (S==2) {;slcd(1,1,5,F("BTIME"));ilcd(7+i*5,1,-4,int(btime[i]));}
if (S==3) {
slcd(1,1,5,F("CATCH"));
if (cat[i]==0) slcd( 7+i*5,1,-4,F("OFF")); else slcd( 7+i*5,1,-3,F("ON"));
}
if (S==4) {;slcd(1,1,5,F("CTIME"));ilcd(7+i*5,1,-4,int(ctime[i]));}
if (S==5) {;slcd(1,1,5,F("RTIME"));ilcd(7+i*5,1,-4,int(rtime[i]));}
if (S==6) {;slcd(1,1,5,F("OTIME"));ilcd(7+i*5,1,-4,int(otime[i]));}
if (S==7) {;slcd(1,1,5,F("RNVAL"));ilcd(7+i*5,1,-4,int(rnval[i]));}
}
if (S==8) {;slcd(1,1,-5,F("CFG"));slcd(7,1,-4,CF[C]);ilcd(7+5,1,-4,*P[C]);}
}
void updatemarker() { ////////////////////////////////////////////////////////////////////// update menu marker
slcd(0,1,1," ");slcd(6,1,1," ");slcd(11,1,1," ");
slcd(0,1,1,F(" "));slcd(6,1,1,F(" "));slcd(11,1,1,F(" "));
int m[]={6,11,0};if (!LOCK) clcd(m[M],1,0);
}
void updatespeed() { ///////////////////////////////////////////////////////////////////////// update fan speed
if (bclr) slcd(0,0,6," ");
if (bclr) slcd(0,0,6,F(" "));
for (int i=0;i<2;i++) {
slcd(6+i*5,0,1," ");
if (cstate[i]) slcd(7+i*5,0,-4,"CAT");
if (cstate[i]) slcd(7+i*5,0,-4,F("CAT"));
else {
if (F[i]) {
if (bstate[i]) ilcd(1+i*3,0,-2, (((long)btime[i]*60000)-(MS-(long)bts[i]))/1000/60+1);
else if (ostate[i]) ilcd(1+i*3,0,-2, (((long)otime[i]*3600000)-(MS-(long)ots[i]))/1000/60/60+1);
ilcd(7+i*5,0,-4,round(xpm[i]));
if ((!bstate[i] && xv[i]<v[i]) || (bstate[i] && xb[i]<b[i])) clcd(6+i*5,0,1);
} else slcd(7+i*5,0,-4,"OFF");
else {
if (xv[i]>=v[i] && rnval[i]>0 && !bstate[i]) clcd(6+i*5,0,2);
}
} else slcd(7+i*5,0,-4,F("OFF"));
}
}
}
@ -324,11 +415,15 @@ void slcd(int x,int y, int l,String s) { ///////////////////////////////////////
}
void calcramp(int i) { ///////////////////////////////////////////////////////////// calculate speed ramp value
xb[i]=b[i];if (bstate[i]) xb[i]=cut(((b[i]-v[i])/(rtime[i]*1000.0)*(MS-bts[i]))+v[i],v[i],b[i]);
xv[i]=v[i];xv[i]=cut(((v[i]-FANMIN)/(rtime[i]*1000.0)*(MS-vts[i]))+FANMIN,FANMIN,v[i]);
xb[i]=b[i];
int rt=rtime[i]?rtime[i]:1;
if (bstate[i]) xb[i]=cut(((b[i]-v[i])/(rt*1000.0)*(MS-bts[i]))+v[i],v[i],b[i]);
xv[i]=v[i];
xv[i]=cut(((v[i]-FANMIN)/(rt*1000.0)*(MS-vts[i]))+FANMIN,FANMIN,v[i]);
if (rnval[i]>0 && xv[i]>=v[i]) xv[i]=cut(xv[i]+rnd[i],FANMIN,FANMAX);
}
void setPWM(int n,int v) { ///////////////////////////////////////////////////////////////// set value to OCR1x
void setPWM(int n,int v) { /////////////////////////////////////////// set value to OCR1x and states to off pin
if (n==0) OCR1A=v;
if (n==1) OCR1B=v;
}
@ -338,8 +433,14 @@ void updatePWM() { /////////////////////////////////////////////////////////////
v[i]=cut(v[i],FANMIN,FANMAX);
b[i]=cut(b[i],FANMIN,FANMAX);
calcramp(i);
if (!F[i]) setPWM(i,0); else setPWM(i,cut((bstate[i]?xb[i]:xv[i])/(FANMAX/320.0)+r[i],0,320));
if (!F[i]) setPWM(i,0); else setPWM(i,cut((bstate[i]?xb[i]:xv[i])/(FANMAX/320.0)+r[i],1,320));
}
if ((bstate[0]?b[0]:v[0])>=RTHRES) digitalWrite(R0,LOW);
else digitalWrite(R0,HIGH);
if ((bstate[1]?b[1]:v[1])>=RTHRES) digitalWrite(R1,LOW);
else digitalWrite(R1,HIGH);
}
void rpmint0() {;ac[0]++;bc[0]++;} ///////////////////////////////////////////////////////////// rpm interrupts
@ -354,17 +455,10 @@ void eew(int adr, int val) {;EEPROM.write(adr*2,val%256);EEPROM.write(adr*2+1,va
void save() { /////////////////////////////////////////////////////////////////////////////////// save settings
for (int i=0;i<2;i++) {
eew(1+i,v[i]);eew(3+i,b[i]);eew(5+i,btime[i]);eew(7+i,cat[i]);
eew(9+i,ctime[i]);eew(11+i,F[i]);eew(13+i,rtime[i]);
eew(9+i,ctime[i]);eew(11+i,F[i]);eew(13+i,rtime[i]);eew(15+i,rnval[i]);
}
eew(100,seed);
for (int i=0;i<NP;i++) eew(200+i,*P[i]);
}
int cutcmd(String data) { ///////////////////////////////////////////////////////////// get saperated substring
int mi=data.length(),n=0,j=0;
for (int i=0;i<=mi;i++) {
if (data.charAt(i) == ':' || i == mi) {;cmd[n]=data.substring(j,i);j=i+1;n++;}
}
for (int i=1;i<n;i++) icmd[i]=cmd[i].toInt();
return n;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////// END
/////////////////////////////////////////////////////////////////////////////////////////////////////////// END

60
stirctl
View File

@ -1,60 +0,0 @@
#!/usr/bin/perl
###################################################################################### stir controll (mwx'2019)
use Device::SerialPort;
use Time::HiRes qw( usleep );
$dev='/dev/ttyACM0';
my $port = Device::SerialPort->new($dev); ################################################### setup serial port
$port->baudrate(9600);
$port->databits(8);
$port->parity("none");
$port->stopbits(1);
$port->lookfor();
$cmd=join(':',@ARGV);$cmd='info' if ($cmd=~/^\s*$/);
@r=split(':',&scmd($cmd));
print " Left Right\n";
printf("Stirrer On: %6d %6d\n", $r[0],$r[14]);
printf("Speed: %6d %6d\n", $r[1],$r[15]);
printf("Boost Speed: %6d %6d\n", $r[2],$r[16]);
printf("RPM: %6d %6d\n", $r[3],$r[17]);
printf("Average RPM: %6d %6d\n", $r[4],$r[18]);
printf("Regulation: %6d %6d\n", $r[5],$r[19]);
printf("Boost On: %6d %6d\n", $r[6],$r[20]);
printf("Boost Time: %6d %6d\n", $r[7],$r[21]);
printf("Catch On: %6d %6d\n", $r[8],$r[22]);
printf("Catch Time: %6d %6d\n", $r[9],$r[23]);
printf("Rise Time: %6d %6d\n", $r[10],$r[24]);
printf("Off Time: %6d %6d\n", $r[11],$r[25]);
printf("Boost Remain: %6d %6d\n", $r[12],$r[26]);
printf("Off Remain: %6d %6d\n", $r[13],$r[27]);
printf("Error: %d\nVersion: %s\n", $r[29],$r[28]);
sub scmd() { ##################################################################################### send command
my($cmd,$quiet)=@_;
$port->write($cmd);
my $founddata=0;
$msg="";
for ($i=0;$i<1000;$i++) {
$in = $port->lookfor();
$founddata=1 if ($in ne "");
$msg.=$in;
last if ($in eq "" && $founddata);
&usleep(2500);
}
$msg=~s/[\r\n]+//g;
return $msg;
}
########################################################################################################### END