Compare commits

...

97 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
53 changed files with 45008 additions and 40869 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.

186
README.md
View File

@ -1,14 +1,61 @@
# Dual magnetic stir controller # Dual magnetic stir controller V2
## Overview ## 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"> <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> </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 ## Overview of Functions
@ -25,8 +72,15 @@ All functions are controlled by the KY-040 encoder:
* **CTIME**: turn changes the interval in minutes for the fish catching 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) * **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) * **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**: * **Other menu options**:
* **BRGHT**: LCD brightness * **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: ## Display Indicators:
@ -37,91 +91,39 @@ All functions are controlled by the KY-040 encoder:
## Settings (in stir.ino) ## Settings (in stir.ino)
|Value|Description| |Value|Config|Description|
|:----|:----------| |:----------------|:-----|:----------|
|`SPEEDINC`|increment of speed values when turning the encoder| |`LGHT` |`LGHT`|LCD display brightness|
|`FANMIN`|fan minimum speed (should be a value at which the fan runs safely) (rpm)| |`SPEEDINC1` |`SPI1`|increment of speed values when turning the encoder (1. range)|
|`FANMAX`|maximum speed of the fan (it is important that this is the real maximum value of the fan) (rpm)| |`SPEEDINC2` |`SPI2`|increment of speed values when turning the encoder (2. range)|
|`BOFF`|if set boost off will also turn the normal mode off| |`SPEEDINC3` |`SPI3`|increment of speed values when turning the encoder (3. range)|
|`BINC`|boost time increment (min)| |`SPEEDSTEP1` |`SPS1`|speed increment steps (increment changes at these values, separates range 1 and 2)|
|`CINC`|catch time increment (min)| |`SPEEDSTEP2` |`SPS2`|speed increment steps (increment changes at these values, separates range 2 and 3))|
|`RINC`|rise time increment (sec)| |`FANMIN` |`FMIN`|fan minimum speed (should be a value at which the fan runs safely) (rpm)|
|`OINC`|off timer increment (hour)| |`FANMAX` |`FMAX`|fan maximum speed (it's important that this is the real maximum value of the fan) (rpm)|
|`CATCHSTOP`|stop interval for stir fish catch function (ms)| |`FANINIT` |`FINI`|set fans to high voltage for 3 sec at boot (0/1)|
|`PWM0`, `PWM1`|PWM output pins for fan speed| |`BOFF` |`BOFF`|if set boost off will also turn the normal mode off (0/1)|
|`PWM2`|PWM output pin for LCD brightness control| |`BINC` |`BINC`|boost time increment (min)|
|`I0`, `I1`|interrupts for rpm measurement (2 and 3 for Leonardo and ProMicro / 0 and 1 for Uno)| |`CINC` |`CINC`|catch time increment (min)|
|`CLK`, `DT`, `SW`|pins for KY-040 encoder| |`RINC` |`RINC`|rise time increment (sec)|
|`OFF0`, `OFF1`|these pins will be set if the fan is off| |`OINC` |`OINC`|off timer increment (hour)|
|`OFFSTATE`|off state (LOW/HIGH)| |`RNDINC` |`RINC`|randon value increment (rpm)|
|`RINTERVAL`|regulation interval (ms)| |`CATCHSTOP` |`CSTP`|stop interval for stir fish catch function (ms)|
|`RDELAY`|extra regulation delay when value changes (ms)| |`PWM0`, `PWM1` | |PWM output pins for fan speed|
|`RTOL`|regulation tolerance (rpm)| |`PWM2` | |PWM output pin for LCD brightness control|
|`SINTERVAL`|speed measurement interval (ms)| |`I0`, `I1` | |interrupts for rpm measurement (0/1 for Uno/Nano, 2/3 for Leonardo/ProMicro)|
|`SAVERAGE`|speed measurement average| |`SWAPENC` |`SWEN`|switch KY-040 encoder direxction (0/1)|
|`SAVETAG`|parameter save identifier| |`CLK`, `DT`, `SW`| |pins for KY-040 encoder|
|`SAVEDELAY`|delay in seconds before parameter will be saved to EEPROM| |`R0`, `R0` | |voltage select relais pin|
|`LCDB`|LCD brightness steps (10 values, 0=off, 255=max)| |`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
CAD files for 3D printed magnet holder. Compatible for magnets with size 20x10x5 mm and CAD files for 3D printed magnet moun. Compatible for magnets with size 20x10x5 mm and
*be quiet! Silent Wings 3 140 mm* fans. *be quiet! Silent Wings 3 120/140 mm* fans.
<p align="center"> <p align="center">
<img src="https://github.com/micworg/stir/blob/master/images/magnetmount.jpg" width=500> <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

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

340
stir.ino
View File

@ -1,78 +1,125 @@
/////////////////////////////////////////////////////////////////////////////////////// Stir Control (mwx'2019) //////////////////////////////////////////////////////////////////////////////////// Stir Control V2 (mwx'2019)
#include <EEPROM.h> #include <EEPROM.h>
#include <LiquidCrystal_I2C.h> #include <LiquidCrystal_I2C.h>
#define MS (long)millis() #define MS (long)millis()
#define NP 25
#define SX Serial.print String VERSION = "2.1.2";
#define SXN Serial.println
String VERSION = "1.6.0"; 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 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 BINC = 1; // BTIME increment (min)
int CINC = 10; // CTIME increment (min) int CINC = 10; // CTIME increment (min)
int RINC = 10; // RTIME increment (sec) int RINC = 10; // RTIME increment (sec)
int OINC = 3; // OTIME increment (hour) 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 PWM0 = 9; // PWM pin for 1. fan
int PWM1 = 10; // PWM pin for 2. fan int PWM1 = 10; // PWM pin for 2. fan
int PWM2 = 11; // PWM pin for LCD brightness 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 I0 = 0; // 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 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 DT = 6; // dt on KY-040 encoder
int SW = 4; // sw on KY-040 encoder int SW = 4; // sw on KY-040 encoder
int OFF0 = 7; // off state pin 1. fan int R0 = 7; // voltage select relais 0
int OFF1 = 8; // off state pin 2. fan int R1 = 8; // voltage select relais 1
int OFFSTATE = LOW; // off state (LOW/HIGH) int RTHRES = 700; // voltage switch threshold (rpm)
long RINTERVAL = 5000; // regulation interval (ms) int RINTERVAL = 50; // regulation internval (ds)
long RDELAY = 3000; // regulation delay on changes (ms) int RDELAY = 30; // regulation delay on changes (ds)
int RTOL = 8; // regulation tolerance (rpm) 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 SAVERAGE = 4; // speed measurement average
int SAVETAG = 1012; // save tag int SAVETAG = 2017; // save tag
long SAVEDELAY = 10000; // EEPROM save delay (ms) 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 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 aright[] = {0x00,0x08,0x0C,0x0E,0x0C,0x08,0x00,0x00}; // LCD character
byte aup[] = {0x04,0x0E,0x1F,0x00,0x00,0x00,0x00,0x00}; 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) 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 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 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 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 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 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 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 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 void setup() { ////////////////////////////////////////////////////////////////////////////////////////// SETUP
Serial.begin(9600); // start serial
lcd.init();lcd.clear();lcd.backlight();lcd.createChar(0,aright);lcd.createChar(1,aup); // initialize lcd 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(PWM0,OUTPUT);pinMode(PWM1,OUTPUT);pinMode(PWM2,OUTPUT); // setup PWM pins
pinMode(CLK,INPUT);pinMode(DT,INPUT);pinMode(SW,INPUT); // setup KY-040 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 digitalWrite(CLK,true);digitalWrite(DT,true);digitalWrite(SW,true); // turn ON pullup resistors
pinMode(OFF0,OUTPUT);pinMode(OFF1,OUTPUT); // setup off state pins pinMode(R0,OUTPUT);pinMode(R1,OUTPUT); // setup voltage selcet relais pins
attachInterrupt(I0,rpmint0,FALLING); // setup interrupts vor rpm in attachInterrupt(I0,rpmint0,FALLING); // setup interrupts vor rpm in
attachInterrupt(I1,rpmint1,FALLING); attachInterrupt(I1,rpmint1,FALLING);
@ -82,66 +129,45 @@ void setup() { /////////////////////////////////////////////////////////////////
SAVE=0; // load/initialize settings SAVE=0; // load/initialize settings
if (eer(0)!=SAVETAG) { 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;}
brght=5; seed=0;
eew(0,SAVETAG);save(); eew(0,SAVETAG);save();
} else { } 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); 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);
} }
brght=eer(15); 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(); lset();
enclast=digitalRead(CLK); // get encoder state 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 updatePWM();updatelcd();updatespeed();updatemarker(); // update all
slcd(0,0,5,VERSION); // show version 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 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 (SAVE>0 && MS-savets>SAVEDELAY) {;save();SAVE=0;savets=MS;} ////////////////////// save settings if needed
if (MS-savets>SAVEDELAY/5) bclr=1; if (MS-savets>SAVEDELAY/5) bclr=1;
for (int i=0;i<2;i++) { 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 if (ostate[i] && MS-ots[i]>(long)otime[i]*3600000) { ////////////////////////////////////// check off timer
otime[i]=0;ostate[i]=0;fset(i,0); otime[i]=0;ostate[i]=0;fset(i,0);
} }
@ -150,7 +176,7 @@ void loop() { //////////////////////////////////////////////////////////////////
catts[i]=MS;cstate[i]=1;F[i]=0;stop[i]=MS;updatePWM();updatespeed(); 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(); cstate[i]=0;F[i]=1;vts[i]=MS;rts=MS+2000;updatePWM();updatespeed();
} }
@ -158,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; 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; 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++) { for (int i=0;i<2;i++) {
rpm[i]=ac[i]/((MS-sts)/1000.0)*30.0; rpm[i]=ac[i]/((MS-sts)/1000.0)*30.0;
ac[i]=0; ac[i]=0;
@ -183,7 +209,7 @@ void loop() { //////////////////////////////////////////////////////////////////
bdelay=0; //////////////////////////////////////////////////////////////////////////////////// process switch bdelay=0; //////////////////////////////////////////////////////////////////////////////////// process switch
if (!bprocess) { if (!bprocess) {
while (!digitalRead(SW)){ while (!digitalRead(SW)){
bdelay++;delay(25);bprocess=1;if (bdelay>20) break; bdelay++;delay(15);bprocess=1;if (bdelay>20) break;
} }
} }
@ -202,12 +228,20 @@ void loop() { //////////////////////////////////////////////////////////////////
if (bstate[M]==0) bset(M,1); else {;bset(M,0);if (BOFF) fset(M,0);} if (bstate[M]==0) bset(M,1); else {;bset(M,0);if (BOFF) fset(M,0);}
bclr=1; 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; save();updatespeed();bdelay=0;
} else if (bdelay>0 && bdelay<20 && !LOCK) { // short button press, switch: menu -> fan 0 -> fan 1 } else if (bdelay>0 && bdelay<20 && !LOCK) { // short button press, switch: menu -> fan 0 -> fan 1
M++;if (S==7 && M==1) M=2;if (M>2) M=0; M++;
if (S==8 && M==2) M=0;
if (M>2) M=0;
updatemarker(); updatemarker();
bdelay=0; bdelay=0;
} }
@ -219,48 +253,57 @@ void loop() { //////////////////////////////////////////////////////////////////
encval = digitalRead(CLK); ////////////////////////////////////////////////////////////////// process encoder encval = digitalRead(CLK); ////////////////////////////////////////////////////////////////// process encoder
if (encval != enclast && !LOCK) { if (encval != enclast && !LOCK) {
if(!encval){ if(!encval){
if (digitalRead(DT) != encval) { // turn encoder clockwise if (digitalRead(DT) != encval) { // turn encoder clockwise
if (M==2) S++; // scroll menu if (M==2) S++; // scroll menu
else { else {
if (S==0) v[M]+=SPEEDINC; // fan speed up if (S==0) v[M]=speedinc(v[M],1); // fan speed up
if (S==1) b[M]+=SPEEDINC; // boost 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==2) btime[M]+=BINC; // boost time up
if (S==3) cat[M]++; // cat on/off if (S==3) cat[M]++; // cat on/off
if (S==4) ctime[M]+=CINC; // cat time up if (S==4) ctime[M]+=CINC; // cat time up
if (S==5) rtime[M]+=RINC; // rise time up if (S==5) rtime[M]+=RINC; // rise time up
if (S==6) otime[M]+=OINC; // off time up if (S==6) otime[M]+=OINC; // off time up
if (S==7) brght++; // increase LCD brightness 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 } else { // turn encoder counterclockwise
if (M==2) S--; // scroll menu if (M==2) S--; // scroll menu
else { else {
if (S==0) v[M]-=SPEEDINC; // fan speed down if (S==0) v[M]=speedinc(v[M],0); // fan speed down
if (S==1) b[M]-=SPEEDINC; // boost 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==2) btime[M]-=BINC; // boost time down
if (S==3) cat[M]--; // cat on/off if (S==3) cat[M]--; // cat on/off
if (S==4) ctime[M]-=CINC; // cat time down if (S==4) ctime[M]-=CINC; // cat time down
if (S==5) rtime[M]-=RINC; // rise time down if (S==5) rtime[M]-=RINC; // rise time down
if (S==6) otime[M]-=OINC; // off time down if (S==6) otime[M]-=OINC; // off time down
if (S==7) brght--; // decrease LCD brightness 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]; for (int i=0;i<2;i++) if (b[i]<v[i]) b[i]=v[i];
if (M!=2) { if (M!=2) {
if (S<=1) {;updatePWM();rts=MS+RDELAY;} // apply (boost) speed change 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==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==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==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==5) rtime[M]=cut(rtime[M],0,240); // check rise time
if (S==6) oset(M,otime[M]); // check off time if (S==6) oset(M,otime[M]); // check off time
if (S==7) lset(); // set LCD brightness 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,7); // 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; enclast=encval;
@ -269,9 +312,27 @@ void loop() { //////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////// SUPPORT /////////////////////////////////////////////////////////////////////////////////////////////////////// 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 void lset() { ////////////////////////////////////////////////////////////////////////////// set LCD brightness
brght=cut(brght,0,9); LGHT=cut(LGHT,0,9);
analogWrite(PWM2,LCDB[brght]); analogWrite(PWM2,LCDB[LGHT]);
} }
void oset(int n,int t) { ///////////////////////////////////////////////////////////////// set switch off timer void oset(int n,int t) { ///////////////////////////////////////////////////////////////// set switch off timer
@ -281,7 +342,7 @@ void oset(int n,int t) { ///////////////////////////////////////////////////////
void fset(int n,int s) { /////////////////////////////////////////////////////////////// set fan state (on/off) void fset(int n,int s) { /////////////////////////////////////////////////////////////// set fan state (on/off)
if (s==1) { if (s==1) {
rts=MS+RDELAY;F[n]=1;catts[n]=vts[n]=MS;r[n]=0; rts=MS+(RDELAY*100);F[n]=1;catts[n]=vts[n]=MS;r[n]=0;
} else { } else {
F[n]=0;bstate[n]=0; F[n]=0;bstate[n]=0;
} }
@ -291,47 +352,52 @@ void fset(int n,int s) { ///////////////////////////////////////////////////////
void bset(int n,int s) { ///////////////////////////////////////////////////////////// set boost state (on/off) void bset(int n,int s) { ///////////////////////////////////////////////////////////// set boost state (on/off)
if (s==1) { 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 { } else {
bstate[n]=0;rts=MS+RDELAY; bstate[n]=0;rts=MS+(RDELAY*100);
} }
updatePWM(); updatePWM();
SAVE++; SAVE++;
} }
void updatelcd() { ///////////////////////////////////////////////////////////////////////////////// update LCD 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]));}
}
if (S==7) {;slcd(1,1,5,"BRGHT");ilcd(7,1,-4,brght);slcd(7+5,1,-4," ");}
}
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 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); int m[]={6,11,0};if (!LOCK) clcd(m[M],1,0);
} }
void updatespeed() { ///////////////////////////////////////////////////////////////////////// update fan speed 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++) { for (int i=0;i<2;i++) {
slcd(6+i*5,0,1," "); 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 { else {
if (F[i]) { if (F[i]) {
if (bstate[i]) ilcd(1+i*3,0,-2, (((long)btime[i]*60000)-(MS-(long)bts[i]))/1000/60+1); 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); 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])); 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); 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"));
} }
} }
} }
@ -349,21 +415,17 @@ void slcd(int x,int y, int l,String s) { ///////////////////////////////////////
} }
void calcramp(int i) { ///////////////////////////////////////////////////////////// calculate speed ramp value 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]); xb[i]=b[i];
xv[i]=v[i];xv[i]=cut(((v[i]-FANMIN)/(rtime[i]*1000.0)*(MS-vts[i]))+FANMIN,FANMIN,v[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 void setPWM(int n,int v) { /////////////////////////////////////////// set value to OCR1x and states to off pin
if (n==0) { if (n==0) OCR1A=v;
OCR1A=v; if (n==1) OCR1B=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) void updatePWM() { ////////////////////////////////////////////////////////////// update PWM output (fan speed)
@ -371,8 +433,14 @@ void updatePWM() { /////////////////////////////////////////////////////////////
v[i]=cut(v[i],FANMIN,FANMAX); v[i]=cut(v[i],FANMIN,FANMAX);
b[i]=cut(b[i],FANMIN,FANMAX); b[i]=cut(b[i],FANMIN,FANMAX);
calcramp(i); 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 void rpmint0() {;ac[0]++;bc[0]++;} ///////////////////////////////////////////////////////////// rpm interrupts
@ -387,18 +455,10 @@ void eew(int adr, int val) {;EEPROM.write(adr*2,val%256);EEPROM.write(adr*2+1,va
void save() { /////////////////////////////////////////////////////////////////////////////////// save settings void save() { /////////////////////////////////////////////////////////////////////////////////// save settings
for (int i=0;i<2;i++) { 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(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(15,brght); eew(100,seed);
for (int i=0;i<NP;i++) eew(200+i,*P[i]);
} }
int cutcmd(String data) { ///////////////////////////////////////////////////////////// get saperated substring /////////////////////////////////////////////////////////////////////////////////////////////////////////// END
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

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