Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

Alles zum Thema Brauanlagen-Selbstbau. Für Steuerung und Automatisierung bitte das Unterforum "Automatisierung" nehmen.
JackFrost
Posting Freak
Posting Freak
Beiträge: 2983
Registriert: Dienstag 15. Mai 2018, 18:10

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#101

Beitrag von JackFrost »

Sieht echt gut aus.

Gruß JackFrost
Meine Hardware:
eManometer
IDS2 ohne CBPi
Magnetrührer
Ss-Brewtech 10 Gal Topf
IDS2 Induktionsplatte
Benutzeravatar
glassart
Posting Freak
Posting Freak
Beiträge: 1703
Registriert: Mittwoch 1. Juli 2015, 11:50
Wohnort: Gunskirchen OÖ

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#102

Beitrag von glassart »

Super Michael ! :thumbsup :thumbsup

lg Herbert
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#103

Beitrag von mwx »

So, jetzt auch tatsächlich im Einsatz und ein Foto vom Innenleben. Als nächstes werde ich weiter an der Software schrauben.

IMG_3090M.jpg
IMG_3101M.jpg
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
glassart
Posting Freak
Posting Freak
Beiträge: 1703
Registriert: Mittwoch 1. Juli 2015, 11:50
Wohnort: Gunskirchen OÖ

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#104

Beitrag von glassart »

und du hast dir einen Displayrahmen gedruckt wie ich sehe :Bigsmile

lg Herbert

Wie verhält sich eigentlich das Einschwingverhalten wenn mit einem großen Fisch und Masse gearbeitet wird ? Sollte vermutlich deutlich schneller einregeln, oder ?
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#105

Beitrag von mwx »

glassart hat geschrieben: Sonntag 10. Februar 2019, 17:59 und du hast dir einen Displayrahmen gedruckt wie ich sehe :Bigsmile
Ja, auf die Idee brachte mich ein gewisser Herbert :) obwohl der Ausschnitt auch so ganz gut geworden ist.

Screenshot 2019-02-09 at 14.33.07.png
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#106

Beitrag von mwx »

glassart hat geschrieben: Sonntag 10. Februar 2019, 17:59 Wie verhält sich eigentlich das Einschwingverhalten wenn mit einem großen Fisch und Masse gearbeitet wird ? Sollte vermutlich deutlich schneller einregeln, oder ?
habe ich noch nicht probiert. Die Regelung habe ich aber inzwischen verbessert.
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
bieratenschreck
Posting Klettermax
Posting Klettermax
Beiträge: 274
Registriert: Donnerstag 16. November 2017, 16:57
Wohnort: Nürnberger Land

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#107

Beitrag von bieratenschreck »

Todschickes Teil, gefällt mir! Danke für Dein Engagement!
Gruß
chr
Gruß
Christian
Benutzeravatar
monsti88
Posting Freak
Posting Freak
Beiträge: 747
Registriert: Mittwoch 12. Oktober 2016, 21:42
Wohnort: Gauting

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#108

Beitrag von monsti88 »

DerDerDasBierBraut hat geschrieben: Schraub mal auf und mach Fotos (mit und ohne Fisch). Das bekommen wir gelöst.
Hab meinen Rührer dann mal aufgeschraubt, aber leider vergessen auch Fotos von den Rührfischen zu machen... :redhead
Folgt dann am kommenden WE.
D0448C17-A828-4080-B69A-C7FF343D7260.jpeg
20l Bottichmaischer mit 25l Thermobehälter und 34l Pfanne :Smile
Benutzeravatar
DerDerDasBierBraut
Posting Freak
Posting Freak
Beiträge: 7890
Registriert: Donnerstag 2. Juni 2016, 20:51
Wohnort: Neustadt-Glewe

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#109

Beitrag von DerDerDasBierBraut »

Reicht schon. Rührfische bis 2cm passen zu dem Rührer.
Falls auch die Kurzen fliegen könntest du drei Sachen versuchen:

1. Die Mutten von den Stehbolzen abschrauben und Scheiben unter den Lüfter legen, damit die Magneten dichter unter die Rührplatte kommen. Falls die Muttern danach nicht mehr passen -> Heißkleber :Bigsmile

2. Mehrere dünne (0,5m), runde, starke (N52) Neodymmagneten kaufen (Durchmesser entsprechend der verbauten Magneten), und die flachen Neodymmagneten auf die vorhandenen Magneten kleben (halten von selbst, ohne Kleber). So kommst du mit jedem Neodymmagneten 0,5mm dichter an die Rührplatte, hast mehr Anziehungskraft und irgendwann passt der Abstand ...

3. Unsere 3D Druck Spezis bitten, dir einen passenden Zentrierring zu drucken, den du anstatt des Metalls auf deinen Lüfter klebst. Damit würden auch längere Fische gut passen (3cm).
"Da braut sich was zusammen ... "
"Oh, Bier ;-) !"
"Nein! Was Böses!"
"Alkoholfreies Bier??? ..."
-----------
Viele Grüße
Jens
Benutzeravatar
monsti88
Posting Freak
Posting Freak
Beiträge: 747
Registriert: Mittwoch 12. Oktober 2016, 21:42
Wohnort: Gauting

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#110

Beitrag von monsti88 »

Super, danke! Die Maßnahmen werden abgearbeitet.

Ginge auch 4. neuen Lüfter kaufen und mit vorhandener Elektronik nutzen? Also nur die zwei Kabel zum Lüfter tauschen? Dann könnte ich den hier im Thread etablierten Lüfter mit Zentrierhilfe nutzen und müsste nur ein neues Gehäuse basteln (war eh zu klein für den 2l Kolben). Mit Elektronik kenne ich mich leider nicht aus, daher wäre es für mich von Vorteil, wenn ich die vorhandene weiter nutzen könnte...
20l Bottichmaischer mit 25l Thermobehälter und 34l Pfanne :Smile
Benutzeravatar
DerDerDasBierBraut
Posting Freak
Posting Freak
Beiträge: 7890
Registriert: Donnerstag 2. Juni 2016, 20:51
Wohnort: Neustadt-Glewe

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#111

Beitrag von DerDerDasBierBraut »

Klar, das geht auch.
"Da braut sich was zusammen ... "
"Oh, Bier ;-) !"
"Nein! Was Böses!"
"Alkoholfreies Bier??? ..."
-----------
Viele Grüße
Jens
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#112

Beitrag von mwx »

Ich hab noch ein bisschen weitergebastelt und herausgekommen ist ein Smart-Rührer .. ich kann den jetzt per App steuern :Bigsmile

IMG_20190211_132926M.jpg
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
daleipi
Posting Freak
Posting Freak
Beiträge: 500
Registriert: Samstag 9. September 2017, 13:08
Wohnort: Ö - GU Süd

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#113

Beitrag von daleipi »

Tolle Sachen baut ihr!

ich werde die Tage mal meine Kiste mit alten PC-Sachen (füllt sich seit den späten 80ern...) durchsuchen um auch was zu bauen.

weiß jemand wo ich Rührstäbe ohne 20€ Mindestbestellwert und Versand nach Österreich erwerben kann?

amaz.n ist viel zu teuer...https://www.amazon.de/dp/B01AW7ME7C/ref ... 88823&sr=1

LG
stefan
Benutzeravatar
Frudel
Posting Freak
Posting Freak
Beiträge: 1251
Registriert: Donnerstag 28. April 2016, 22:12

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#114

Beitrag von Frudel »

Klasse Teil , bin begeistert!

Musste nachfragen , wieviel der Versand nach Osterlitsch kostet , bei Ebä gibt es einige , die die Magneten anbieten.

https://www.ebay.de/itm/5-X-POWER-NEODY ... 9#shpCntId
Viele Menschen benutzen Informationen und Fakten wie ein Betrunkener einen Laternenpfahl :
Vor allem zur Stütze ihres Standpunktes und weniger zum Beleuchten eines Sachverhaltes.
daleipi
Posting Freak
Posting Freak
Beiträge: 500
Registriert: Samstag 9. September 2017, 13:08
Wohnort: Ö - GU Süd

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#115

Beitrag von daleipi »

Frudel hat geschrieben: Montag 11. Februar 2019, 14:10 Klasse Teil , bin begeistert!

Musste nachfragen , wieviel der Versand nach Osterlitsch kostet , bei Ebä gibt es einige , die die Magneten anbieten.

https://www.ebay.de/itm/5-X-POWER-NEODY ... 9#shpCntId
Magnete hab ich. Danke.

Die RÜHRstäbe oder-fische brauch ich noch.

EDIT: hab mir grad da mal 3 Stück 30x7mm bestellt: https://www.ebay.de/itm/Magnetruhrstabc ... GTR=1#shId

sonst gibt es noch die klar erkennbaren Angebote aus China auf ebay.
JackFrost
Posting Freak
Posting Freak
Beiträge: 2983
Registriert: Dienstag 15. Mai 2018, 18:10

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#116

Beitrag von JackFrost »

Ich hab am Wochenende das Gehäuse vorbereitet. Da meine Möglichkeiten zur Bearbeitung von Holz, Kunststoff und Metall nicht so gut sind, sind die Schlitze für die Stecker und das Display nicht so gut geworden.
Mein Ätzgerät ist leider noch nicht eingetroffen, daher hab ich den Reset von Display per Quick&Dirty an nem freien Pin gelötet.
Heute sollten noch die Duo LEDs kommen, dann kann der Zustand auch von der „Ferne“ gesehen werden.
Es ist geplant rot, grün und grün blinkend zu verwenden. Für gelb hab ich noch keine Idee.
Heute Abend kommen ein paar Bilder. Mit dem Holzgehäuse kann ich bei weitem nicht mithalten.
Meine Smart-Funktionen werden sich auf Automatik und Fernsteurung über USB/RS232 TTL beschränken. Als nächstes muss ja ne Gärsteuerung her und da gibt’s dann nen ARM Cortex M mit Kaskade 😀 für Hutschienenmontage.

Gruß JackFrost
Meine Hardware:
eManometer
IDS2 ohne CBPi
Magnetrührer
Ss-Brewtech 10 Gal Topf
IDS2 Induktionsplatte
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#117

Beitrag von mwx »

beryll hat geschrieben: Montag 11. Februar 2019, 14:49 Magst Du einen Anleitung für den geneigten Nachbauer irgendwann mal ins Wiki oder diesen Thread hier einstellen? Also, ich würde mich darüber freuen :-)
Ja, das kann ich gerne machen. Allerdings wird das immer ein Bastelprojekt bleiben. Wer das nachbauen will sollte also schon halbwegs Sattelfest im Umgang mit Arduino und Raspberry Pi sein. Ich helfe da gerne so gut ich kann das ist aber per Ferndiagnose oft schwierig.

JackFrost hat geschrieben: Montag 11. Februar 2019, 16:41 Da meine Möglichkeiten zur Bearbeitung von Holz, Kunststoff und Metall nicht so gut sind ... Mit dem Holzgehäuse kann ich bei weitem nicht mithalten.
Meine Smart-Funktionen werden sich auf Automatik und Fernsteurung über USB/RS232 TTL beschränken.
Jack, ich habe auch nicht so gute Möglichkeiten. So schwierig ist das nicht. Das Holz habe ich fertig zugeschnitten bestellt, die Glasscheibe auch. Etwas fummelig ist das rechteckige Loch (habe das mit eine Minifräse gemacht, geht aber auch sicher mit Laubsäge oder Dremel. Den 3D gedruckten Rahmen stelle ich gerne zur Verfügung). Für alles andere reicht ein Akkuschrauber.

Die Smart Funktion mit App ist natürlich Spielerei. Den Raspberry Pi habe ich hauptsächlich eingebaut weil ich nicht mehr an den USB Stecker vom Arduino ran komme. Jetzt kann ich neue Software vom Raspberry Pi (via SSH) auf den Arduino spielen.

Gruß, Michael
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
JackFrost
Posting Freak
Posting Freak
Beiträge: 2983
Registriert: Dienstag 15. Mai 2018, 18:10

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#118

Beitrag von JackFrost »

Die LEDs sind eigebaut.
So sieht die Steuerung eingebaut in mein Gehäuse aus :
IMG_1806.JPG
Die Geschwindigkeit wird nun über einen gleitenden Mittelwert geglättet. Wenn die Zeit im Profil abgelaufen ist, dann blinkt die entsprechende LED mit 2 Hz grün.

Ich hab immer mal wieder Sprünge bei der gemessenen Geschwindigkeit. Da muss ich noch den Fehler noch finden.

Die nächste Stufe wird das GUI in die Bedienung über den Drehencoder.

Anbei noch ein Video https://youtu.be/siCe7xjCs0o

Gruß JackFrost
Meine Hardware:
eManometer
IDS2 ohne CBPi
Magnetrührer
Ss-Brewtech 10 Gal Topf
IDS2 Induktionsplatte
Benutzeravatar
murby81
Posting Senior
Posting Senior
Beiträge: 410
Registriert: Montag 8. Oktober 2018, 08:33
Wohnort: Mittelfranken

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#119

Beitrag von murby81 »

Hallo Zusammen,

ich bräucht mal eure Hilfe.

Und zwar hab ich mir auch einen Magnetrührer gebastelt. Nichts besonderes, soll einfach nur den Zweck erfüllen.

Ich hab nen 120mm Gehäuselüfter in eine 150mm ISO Abzweigdose rein. Magnet von einer Festplatte auf den Lüfter geklebt. Habe auf eine Steuerung verzichtet, da ich keine da hatte. Sonst hatte ich alle Sachen da und musste nichts kaufen. Wenn ich den Rührer jetzt anschalte, haut es mir immer den Rührfisch gleich nach außen im Erlenmeyer, so dass er sich nicht dreht.

Liegt es an der fehlenden Steuerung? Lüfter hat 1350 U/Min, ist das zuviel? Hab schon 5V und 12V getestet. Leider immer das selbe Ergebnis. Oder doch ein anderes Problem? Magnet zu groß oder falsch angebracht? (Mittig am Lüfterrad angebracht)

Besten Dank für eure Hilfe.

Gruß

Stefan
JackFrost
Posting Freak
Posting Freak
Beiträge: 2983
Registriert: Dienstag 15. Mai 2018, 18:10

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#120

Beitrag von JackFrost »

Poste bitte mal ein Bild von dem Lüfter mit montiertem Magneten. Hast du versucht beide Magneten von der Platte zu verwenden ? Einen mit N nach oben den anderen mit S ?

Gruß JackFrost
Meine Hardware:
eManometer
IDS2 ohne CBPi
Magnetrührer
Ss-Brewtech 10 Gal Topf
IDS2 Induktionsplatte
Benutzeravatar
murby81
Posting Senior
Posting Senior
Beiträge: 410
Registriert: Montag 8. Oktober 2018, 08:33
Wohnort: Mittelfranken

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#121

Beitrag von murby81 »

Bitteschön
Dateianhänge
IMG_20190212_204114.jpg
Benutzeravatar
DerDerDasBierBraut
Posting Freak
Posting Freak
Beiträge: 7890
Registriert: Donnerstag 2. Juni 2016, 20:51
Wohnort: Neustadt-Glewe

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#122

Beitrag von DerDerDasBierBraut »

murby81 hat geschrieben: Dienstag 12. Februar 2019, 20:14 Liegt es an der fehlenden Steuerung? Lüfter hat 1350 U/Min, ist das zuviel? Hab schon 5V und 12V getestet. Leider immer das selbe Ergebnis. Oder doch ein anderes Problem? Magnet zu groß oder falsch angebracht? (Mittig am Lüfterrad angebracht)
Mit einem Magneten wedelt der Rührfisch wie ein Fuchsschwanz. Das kann nicht funktionieren!
Schroll nach oben. Hier sind Problem, Ursache und Lösung erklärt. : https://hobbybrauer.de/forum/viewtopic. ... 75#p268175
"Da braut sich was zusammen ... "
"Oh, Bier ;-) !"
"Nein! Was Böses!"
"Alkoholfreies Bier??? ..."
-----------
Viele Grüße
Jens
Benutzeravatar
murby81
Posting Senior
Posting Senior
Beiträge: 410
Registriert: Montag 8. Oktober 2018, 08:33
Wohnort: Mittelfranken

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#123

Beitrag von murby81 »

Ah OK, danke. Also war der HDD Magnet nicht optimal. Dann such ich mal das Haus nach zwei kleineren ab.
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#124

Beitrag von mwx »

Es geht voran, ich habe jetzt alle Funktionen eingebaut. Also Boost und Fische fangen. Das ganze hat jetzt ein Menu in dem man die verschiedenen Sachen einstellen kann. Alles ist immer noch mit einem einzigen Knopf einstellbar .. das gefällt mir sehr gut:

Alle Einstellungen werden gespeichert und sind nach Stromausfall wieder da. Alle Einstellungen kann man unabhängig für jeden Rührer machen.

Das Menu hat 5 Punkte, durch einfaches drücken kann man zwischen Menu, Rührer 1 und Rührer 2 wechselen.

Geschwindigkeit einstellen
a.jpg

Boost aktivieren und einstellen (drehen zum Geschwindigkeit einstellen, lang drücken zum starten). Das Sternchen zeigt an das der Boost Modus für den Rührer aktiv ist
b.jpg

Boost Zeit einstellen (in Minuten)
c.jpg

Catch aktivieren. CAT zeigt an das der Rührer grade Fische fängt.
d.jpg

Catch intervall einstellen (in Minuten)
e.jpg

Die Sourcen dazu poste ich in ein paar Tagen (reifen lassen).

Gruß, Michael
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
glassart
Posting Freak
Posting Freak
Beiträge: 1703
Registriert: Mittwoch 1. Juli 2015, 11:50
Wohnort: Gunskirchen OÖ

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#125

Beitrag von glassart »

jetzt fehlt "nur" noch die Heizung und das 1.3 OLED ( ich drucke gerade OLED-Einbaurahmen für 2,3,4 -fach OLED´s :Bigsmile )

Super da freue ich mich schon auf das Ende der Reifezeit :thumbsup

lg Herbert
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#126

Beitrag von mwx »

Hier wie versprochen die Sourcen zu meiner Lüftersteuerung. Die Kommentare sollten ausreichen um den Arduino richtig anzuschließen. Das ganze ist angepasst an einen Arduino Leonardo oder einen Pro Micro. Ich verwende die BeQuiet Lüfter mit 1000 Umdrehungen. Der Drehschalter ist ein KY-040 und das Display ein 1602 LCD. Für andere Komponenten muss der Quelltext eventuell angepasst werden.


Schaltplan:

https://easyeda.com/micwes/stir

Schematic_stir_Sheet-1_20190216092729.png

Quelltext:

Code: Alles auswählen

/////////////////////////////////////////////////////////////////////////////// Stir Control (mwx'2019, v1.2.1)
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>

#define SX Serial.print 
#define SXN Serial.println
#define MS (long)millis()

int SPEEDINC      = 50;                                                                      // speed increment

int FANMIN        = 200;                                                                   // fan minimum speed
int FANMAX        = 1000;                                                                  // fan maximum speed

int RINTERVAL     = 3000;                                                                // regulation interval 
int RDELAY        = 2000;                                                        // regulation delay on changes

int CATCHSTOP     = 20000;                                                                 // catch stop period

int PWM0          = 9;                                                                    // PWM pin for 1. fan
int PWM1          = 10;                                                                   // PWM pin for 2. fan
                                      
int I0            = 2;                                                   // interrupt pin for 1. fan rpm signal
int I1            = 3;                                                   // interrupt pin for 2. fan rpm signal
                                  
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 SAVETAG       = 1004;                                                                           // save tag 

LiquidCrystal_I2C lcd(0x27,16,2);                                           // LCD display (connect to SDA/SCL)

int v0,b0,r0,v1,b1,r1,r,fanstate0,fanstate1;                                            // speed and regulation
long rpmcount0,rpmcount1;                                                                        // rpm counter
double rpm0,rpm1;                                                                                        // rpm

long speedts,dt,rts,swts,bts,ox,savets,catchts0,catchts1,stop0,stop1,b0ts,b1ts;                       // timing
int bdelay,bprocess,enclast,encval,swmode;                                                 // button processing
char form[8],out[32],M[8];String str;                                                          // string buffer
int OK,SAVE,LOCK,bstate0,bstate1,btime0,btime1,catch0,catch1,ctime0,ctime1,mode;
 
void setup() { ////////////////////////////////////////////////////////////////////////////////////////// SETUP
  rpmcount0=0;rpmcount1=0;rpm0=0;rpm1=0;bprocess=0;speedts=0;r0=0;r1=0;swmode=2;

  Serial.begin(9600);                                                                           // start serial
  
  lcd.init();lcd.backlight();lcd.clear();                                                     // initialize lcd

  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)  // non-inverted PWM on ch. A
         | _BV(COM1B1)  // same on ch; B
         | _BV(WGM11);  // mode 10: ph. correct PWM, TOP=ICR1
  TCCR1B = _BV(WGM13)   // ditto
         | _BV(CS10);   // prescaler=1
  ICR1   = 320;         // TOP=320

  SAVE=0;                                                                           // load/initialize settings
  if (eer(0)!=SAVETAG) {
    v0=300;v1=300;b0=700;b1=700;btime0=30;btime1=30;catch0=0;catch1=0;ctime0=120;ctime1=120;
      eew(0,SAVETAG);
      save();
  } else {
    v0=eer(1);v1=eer(2);b0=eer(3);b1=eer(4);btime0=eer(5);btime1=eer(6);
    catch0=eer(7);catch1=eer(8);ctime0=eer(9);ctime1=eer(10);
  }

  pinMode(PWM0,OUTPUT);pinMode(PWM1,OUTPUT);                                                   // set pin modes
  pinMode(CLK,INPUT);pinMode(DT,INPUT);pinMode(SW,INPUT);

  enclast=digitalRead(CLK);                                                                // get encoder state

  fanstate0=0;fanstate1=0;OCR1A=0;OCR1B=0;                                                     // turn fans off

  rts=MS;swts=MS;bts=MS;savets=MS;catchts0=MS;catchts1=MS;stop0=MS;stop1=MS;                       // set timer

  lcd.clear();                                                                  // clear display, start running

  bstate0=0;bstate1=0;mode=0;updatelcd();updatespeed();updatemarker();LOCK=0;             // set initial states
}


void loop() { //////////////////////////////////////////////////////////////////////////////////////////// LOOP

  if (SAVE>0 && MS-savets>60000) {;save();SAVE=0;savets=MS;} ////////////////////////// save settings if needed
  
  if (catch0 && MS-catchts0>(long)ctime0*60000) { ////////////////////////////////////// check catch fish state
    catchts0=MS;stop0=MS+CATCHSTOP;
    updatePWM();
  }
  if (catch1 && MS-catchts1>(long)ctime1*60000) {
    catchts1=MS;stop1=MS+CATCHSTOP;
    updatePWM();
  }

  if (bstate0 && MS-b0ts>(long)btime0*60000) {;bstate0=0;updatelcd();} ////////////////////// check boost state
  if (bstate1 && MS-b1ts>(long)btime0*60000) {;bstate1=0;updatelcd();}

  if (Serial.available() > 0) { ////////////////////////////////////////////////////////// serial communication
    str=Serial.readString();OK=0;

    if (str=="info") {;serinfo();OK=1;}                                                                 // info
    
    if (str.substring(0,5)=="speed") {                                                   // speed <fan0> <fan1>
      v0=sstr(str,':',1).toInt();
      v1=sstr(str,':',2).toInt();
      updatePWM();r0=0;r1=0;rts=MS+RDELAY;
      SAVE++;OK=1;updatelcd();serinfo();
    }

    if (str.substring(0,6)=="bspeed") {                                                 // bspeed <fan0> <fan1>
      b0=sstr(str,':',1).toInt();
      b1=sstr(str,':',2).toInt();
      updatePWM();r0=0;r1=0;rts=MS+RDELAY;
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }
    
    if (str.substring(0,2)=="on") {                                         // on <fan0> <fan1> (value: 0 or 1)
      if (sstr(str,':',1).toInt()==1) {;fanstate0=1;r0=0;} else fanstate0=0;
      if (sstr(str,':',2).toInt()==1) {;fanstate1=1;r1=0;} else fanstate1=0;
      updatePWM();rts=MS+RDELAY;
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }

    if (str.substring(0,5)=="boost") {                                   // boost <fan0> <fan1> (value: 0 or 1)
      if (sstr(str,':',1).toInt()==1) {;rts=MS+RDELAY;bstate0=1;b0ts=MS;} else {;bstate0=0;}
      if (sstr(str,':',2).toInt()==1) {;rts=MS+RDELAY;bstate1=1;b1ts=MS;} else {;bstate1=0;}
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }

    if (str.substring(0,5)=="catch") {                                   // catch <fan0> <fan1> (value: 0 or 1)
      if (sstr(str,':',1).toInt()==1) {;catch0=1;catchts0=MS;} else {;catch0=0;}
      if (sstr(str,':',2).toInt()==1) {;catch1=1;catchts1=MS;} else {;catch1=0;}
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }
    
    if (str.substring(0,5)=="btime") {                                     // btime <fan0> <fan1> (value: 0-60)
      btime0=sstr(str,':',1).toInt();if (btime0<0) btime0=0;if (btime0>60) btime0=60;
      btime1=sstr(str,':',2).toInt();if (btime1<0) btime1=0;if (btime1>60) btime1=60;
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }
    
    if (str.substring(0,5)=="ctime") {                                   // ctime <fan0> <fan1> (value: 60-240)
      ctime0=sstr(str,':',1).toInt();if (ctime0<60) ctime0=60;if (ctime0>240) ctime0=240;
      ctime1=sstr(str,':',2).toInt();if (ctime1<60) ctime1=60;if (ctime1>240) ctime1=240;
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }

    if (!OK) SXN("ERROR");
  }

  if (MS-rts>RINTERVAL) { ////////////////////////////////////////////////////////////////////////// regulation
    
    rpm0=rpmcount0/2/((MS-speedts)/1000.0)*60.0;
    rpm1=rpmcount1/2/((MS-speedts)/1000.0)*60.0;

    speedts=MS;rpmcount0=0;rpmcount1=0;

    if (abs(v0-rpm0)>8) {
      ox=1;if (abs(v0-rpm0)>20) ox=3;if (abs(v0-rpm0)>50) ox=5;
      if (bstate0) r=b0; else r=v0;
      if (r>rpm0) {;r0+=ox;if (r0>40) r0=40;}
      if (r<rpm0) {;r0-=ox;if (r0<-40) r0=-40;}
    }

    if (abs(v1-rpm1)>8) {
      ox=1;if (abs(v1-rpm1)>20) ox=3;if (abs(v1-rpm1)>50) ox=5;
      if (bstate1) r=b1; else r=v1;
      if (r>rpm1) {;r1+=ox;if (r1>40) r1=40;}
      if (r<rpm1) {;r1-=ox;if (r1<-40) r1=-40;}
    }
    
    if (!fanstate0) r0=0;
    if (!fanstate1) r1=0;
        
    updatePWM();updatespeed();rts=MS;
  }

  bdelay=0; //////////////////////////////////////////////////////////////////////////////////// process switch
  if (!bprocess) {
    while (!digitalRead(SW)){
      bdelay++;
      delay(25);
      bprocess=1;
      if (bdelay>20) break;
    }
  }
  
  if (bdelay>0 && MS-bts>100) {                                                            // long button press
    if (bdelay>20) {
      
      if (swmode==0 && mode==0 && !LOCK) {                                                      // fan 0 on/off
        if (fanstate0==0) {;rts=MS+RDELAY;fanstate0=1;r0=0;updatePWM();}
         else {;fanstate0=0;}
        updatespeed();
      }
      if (swmode==1 && mode==0 && !LOCK) {                                                      // fan 1 on/off
        if (fanstate1==0) {;rts=MS+RDELAY;fanstate1=1;r1=0;updatePWM();}
        else {;fanstate1=0;}
        updatespeed();
      }

      if (swmode==0 && mode==1 && !LOCK) {                                                    // boost 0 on/off
        if (bstate0==0) {
          rts=MS+RDELAY;bstate0=1;b0ts=MS;updatePWM();
        }  else {;bstate0=0;}
        updatespeed();
      }
      if (swmode==1 && mode==1 && !LOCK) {                                                    // boost 1 on/off
        if (bstate1==0) {
          rts=MS+RDELAY;bstate1=1;b1ts=MS;updatePWM();
        } else {;bstate1=0;}
        updatespeed();
      }

      if (swmode==2) {                                                                           // lock/unlock
        if (LOCK==0) LOCK=1;
        else LOCK=0;
        updatemarker();
      }
      
      bdelay=0;
      
    } else if (bdelay>0 && bdelay<20 && !LOCK) {           // short button press: switch menu -> fan 0 -> fan 1
      swmode++;if (swmode>2) swmode=0;
      updatemarker();
      bdelay=0;
    }
    
    bts=MS;
  }
  if (digitalRead(SW)) bprocess=0;

  encval = digitalRead(CLK); ////////////////////////////////////////////////////////////////// process encoder
  if (encval != enclast && !LOCK) {
    if(!encval){
            
      if (digitalRead(DT) != encval) {                                                                    // cw
        if (swmode==0 && mode==0) v0+=SPEEDINC;  // fan 0 speed up
        if (swmode==1 && mode==0) v1+=SPEEDINC;  // fan 1 speed up
        if (swmode==0 && mode==1) b0+=SPEEDINC;  // boost 0 speed up
        if (swmode==1 && mode==1) b1+=SPEEDINC;  // boost 1 speed up
        if (swmode==0 && mode==2) btime0++;      // boost time 0 up
        if (swmode==1 && mode==2) btime1++;      // boost time 1 up
        if (swmode==0 && mode==3) catch0++;      // catch 0 on/off
        if (swmode==1 && mode==3) catch1++;      // catch 1 on/off
        if (swmode==0 && mode==4) ctime0+=10;    // catch time 0 up
        if (swmode==1 && mode==4) ctime1+=10;    // catch time 1 up
        if (swmode==2) mode++;
      } else {                                                                                           // ccw
        if (swmode==0 && mode==0) v0-=SPEEDINC;  // fan 0 speed down
        if (swmode==1 && mode==0) v1-=SPEEDINC;  // fan 1 speed down
        if (swmode==0 && mode==1) b0-=SPEEDINC;  // boost 0 speed down
        if (swmode==1 && mode==1) b1-=SPEEDINC;  // boost 1 speed down
        if (swmode==0 && mode==2) btime0--;      // boost time 0 down
        if (swmode==1 && mode==2) btime1--;      // boost time 1 down
        if (swmode==0 && mode==3) catch0--;      // catch 0 on/off
        if (swmode==1 && mode==3) catch1--;      // catch 1 on/off
        if (swmode==0 && mode==4) ctime0-=10;    // catch time 0 down
        if (swmode==1 && mode==4) ctime1-=10;    // catch time 1 down
        if (swmode==2) mode--;
      }
    
      if (swmode==0 && mode==0) {;updatePWM();r0=0;rts=MS+RDELAY;}                      // apply speed change 0
      if (swmode==1 && mode==0) {;updatePWM();r1=0;rts=MS+RDELAY;}                      // apply speed change 1
      if (swmode==0 && mode==1) {;updatePWM();r0=0;rts=MS+RDELAY;}                // apply boost speed change 0
      if (swmode==1 && mode==1) {;updatePWM();r1=0;rts=MS+RDELAY;}                // apply boost speed change 1
      
      if (swmode==0 && mode==2) {;if (btime0<0) btime0=0;if (btime0>60) btime0=60;}       // check boost time 0
      if (swmode==1 && mode==2) {;if (btime1<0) btime1=0;if (btime1>60) btime1=60;}       // check boost time 1
      
      if (swmode==0 && mode==3) {;if (catch0<0) catch0=1;if (catch0>1) catch0=0;catchts0=MS;}  // check catch 0
      if (swmode==1 && mode==3) {;if (catch1<0) catch1=0;if (catch1>1) catch1=0;catchts1=MS;}  // check catch 1
      
      if (swmode==0 && mode==4) {;if (ctime0<60) ctime0=60;if (ctime0>240) ctime0=240;}   // check boost time 0
      if (swmode==1 && mode==4) {;if (ctime1<60) ctime1=60;if (ctime1>240) ctime1=240;}   // check boost time 1

      if (swmode==2) {;if (mode<0) mode=4;if (mode>4) mode=0;}                               // check menu mode
      
      SAVE++;updatelcd();delay(50);
    } 
  }
  enclast=encval;
  
}


/////////////////////////////////////////////////////////////////////////////////////////////////////// SUPPORT

void updatelcd() { ///////////////////////////////////////////////////////////////////////////////// update LCD
  if (mode==0) {
    slcd(1,1,5,"SPEED");
    ilcd(7,1,-4,int(v0));
    ilcd(12,1,-4,int(v1));
  }
  if (mode==1) {
    slcd(1,1,5,"BOOST");
    ilcd(7,1,-4,int(b0));
    ilcd(12,1,-4,int(b1));
  }
  if (mode==2) {
    slcd(1,1,5,"BTIME");
    ilcd(7,1,-4,int(btime0));ilcd(12,1,-4,int(btime1));
  }
  if (mode==3) {
    slcd(1,1,5,"CATCH");
    if (catch0==0) slcd(7,1,-4,"OFF");
    else slcd(7,1,-3,"ON");
    if (catch1==0) slcd(12,1,-4,"OFF");
    else slcd(12,1,-3,"ON");
  }
  if (mode==4) {
    slcd(1,1,5,"CTIME");
    ilcd(7,1,-4,int(ctime0));ilcd(12,1,-4,int(ctime1));
  }
}  
  
void updatemarker() { /////////////////////////////////////////////////////////////////// update current marker
  slcd(0,1,1," ");
  slcd(6,1,1," ");
  slcd(11,1,1," ");
  if (!LOCK) {
    if (swmode==0) slcd(6,1,1,">");
    if (swmode==1) slcd(11,1,1,">");
    if (swmode==2) slcd(0,1,1,">");
  }
}

void updatespeed() { ///////////////////////////////////////////////////////////////////////// update fan speed

  slcd(1,0,5,"     ");
  if (fanstate0) {
    if (MS<stop0) {
      slcd(7,0,-4,"CAT");
    } else {
      if (bstate0) {
        ilcd(1,0,2, (((long)btime0*60000)-(MS-(long)b0ts))/1000/60+1);
      } else slcd(7,0,1," ");
      ilcd(7,0,-4,round(rpm0/5.0)*5);
    }
  }
  else slcd(7,0,-4,"OFF");
  
  if (fanstate1) {
    if (MS<stop1) {
      slcd(12,0,-4,"CAT");
    } else {
      if (bstate1) {
        ilcd(4,0,2, (((long)btime1*60000)-(MS-(long)b1ts))/1000/60+1);
      } else slcd(12,0,1," ");
      ilcd(12,0,-4,round(rpm1/5.0)*5);
    }
  }
  else slcd(12,0,-4,"OFF");
}

void serinfo() { /////////////////////////////////////////////////////////////////////////// serial info output 
  SX(fanstate0);SX(":");SX((int)(v0));SX(":");SX((int)(b0));SX(":");
  SX(fanstate1);SX(":");SX((int)(v1));SX(":");SX((int)(b1));SX(":");
  SX(rpm0);SX(":");SX(rpm1);SX(":");SX(r0);SX(":");SX(r1);SX(":");
  SX(bstate0);SX(":");SX(bstate1);SX(":");SX(btime0);SX(":");SX(btime1);SX(":");
  SX(catch0);SX(":");SX(catch1);SX(":");SX(ctime0);SX(":");SX(ctime1);SXN("");
}

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 updatePWM() { ///////////////////////////////////////////////////////////////////// update PWM (fan speed)
  if (v0<FANMIN) v0=FANMIN;if (v0>FANMAX) v0=FANMAX;
  if (v1<FANMIN) v1=FANMIN;if (v1>FANMAX) v1=FANMAX;
  if (b0<FANMIN) b0=FANMIN;if (b0>FANMAX) b0=FANMAX;
  if (b1<FANMIN) b1=FANMIN;if (b1>FANMAX) b1=FANMAX;
  
  double v;
  
  if (fanstate0) {
    if (MS<stop0) {
      OCR1A=0;
    } else {
      if (bstate0) {
        v=b0/(FANMAX/320.0)+r0;if (v<0) v=0;if (v>320) v=320;
        OCR1A=v;
      } else {
        v=v0/(FANMAX/320.0)+r0;if (v<0) v=0;if (v>320) v=320;
        OCR1A=v;
      }
    }
  } else OCR1A=0;
  
  if (fanstate1) {
    if (MS<stop1) {
      OCR1B=0;
    } else {
      if (bstate1) {
        v=b1/(FANMAX/320.0)+r1;if (v<0) v=0;if (v>320) v=320;
        OCR1B=v; 
      } else {
        v=v1/(FANMAX/320.0)+r1;if (v<0) v=0;if (v>320) v=320;
        OCR1B=v;
      }
    } 
  } else  OCR1B=0;
} 

void rpmint0() {;rpmcount0++;} ///////////////////////////////////////////////////////////////// rpm interrupts
void rpmint1() {;rpmcount1++;}

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
  eew(1,v0);eew(2,v1);eew(3,b0);eew(4,b1);eew(5,btime0);eew(6,btime1);
  eew(7,catch0);eew(8,catch1);eew(9,ctime0);eew(10,ctime1);
}

String sstr(String data, char separator, int index) { ///////////////////////////////// get seperated substring
  int found=0;
  int si[]={0,-1};
  int mi=data.length()-1;

  for (int i=0; i<=mi && found<=index; i++) {
    if (data.charAt(i) == separator || i == mi) {
      found++;si[0]=si[1]+1;si[1]=(i==mi) ? i+1 : i;
    }
  }
  return found > index ? data.substring(si[0], si[1]) : "";
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////// END

Funktionsübersicht:
  • Kurz drücken: wechseln zwischen Menu, Rührer1 und Rührer2
  • Drehen wenn Menu ausgewählt ist: wechseln zwischen den Menu Punkten (SPEED, BOOST, BTIME, CATCH, CTIME)
  • Lange drücken wenn Menu ausgewählt ist: Alle Funktionen sperren (entsperren ebenfalls durch langes drücken)
  • Wenn ein Rührer aus gewählt ist:
    • SPEED: drehen stellt Geschwindigkeit ein, lange drücken schaltet Rührer ein bzw. aus.
    • BOOST: drehen stellt Boost Geschwindigkeit ein, lange drücken aktiviert/deaktiviert die Boost Funktion (Laufzeit wird im Display angezeigt).
    • BTIME: drehen stellt die Boost Zeit in Minuten ein
    • CATCH: drehen aktiviert/deaktiviert die Fischfang Funktion
    • CTIME: drehen stellt den Interwall in Minuten für die Fishfang Funktion ein

Display Anzeigen:

Unten Links: Menu
Unten Mitte/Rechts: Zeigt je nach gewähltem Menupunkt die eingestellten Werte für die Rührer an.
Oben Mitte/Rechts: Zeigt die aktuelle Drehzahl der Rührer an (oder 'OFF' oder 'CAT' (Fischfang))
Oben Links: zeigt die noch verbleibende Zeit der Boostfunktion an.
Zuletzt geändert von mwx am Montag 18. Februar 2019, 07:28, insgesamt 4-mal geändert.
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#127

Beitrag von mwx »

Schaltplan hinzugefügt
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
JackFrost
Posting Freak
Posting Freak
Beiträge: 2983
Registriert: Dienstag 15. Mai 2018, 18:10

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#128

Beitrag von JackFrost »

Ich hab meine Steuerung nun so fertig , das der Standardautomatikmodus, der Handmodus und das verstellen eines Profiles für jeweils die linke und rechte Seite geht.

Im Menu können nun das Profil für die linke und rechte Seite temporär geändert werden. Wenn im Automatikmodus gestoppt wird, bleibt die verstrichene Zeit erhalten. Erst mit einem Reset des geladenen Porfiles wird es auf die aktuellen Werte gestellt.

Aktuell läuft der Magnetrüher mit der langsamen Geschwindigkeit weiter wenn die Gesamtezeit verstrichen ist.

Ich hatte noch eine Störeintrahlung bei der Drehzahlmessung, daher musst ich mit der Hand ein paar Kondensatoren einlöten, das werde ich bei der Rev. 2 beheben.
Die gemessene Drehzahl wird über einen gleitenden Durchschnitt mit 16 Werten geglättet.

Ich kann derzeit Drehzahlen von 400UpM bis maximale Drehzahl regeln. Aus dem Stand sind Drehzahlen < 400 UpM schwierig, da muss ich an der Regelung noch ein paar Sachen verbessern.

USB, Fernsteuerung und der Bootloader sind noch nicht fertig.

Morgen werde ich mal den "Betatest" mit einer W164 machen. Für meine größeren Gefässe werde ich mir noch ein 15V Netzteil besorgen.

Hier ist noch ein Link zu einem Video in dem man die Menus usw sieht https://youtu.be/QRJ7w1K40rU


Gruß JackFrost
Meine Hardware:
eManometer
IDS2 ohne CBPi
Magnetrührer
Ss-Brewtech 10 Gal Topf
IDS2 Induktionsplatte
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#129

Beitrag von mwx »

Ich habe die Software oben geupdatet. Sie läßt sich nun sehr einfach für beliebige Lüfter anpassen.
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
flensdorfer
Posting Freak
Posting Freak
Beiträge: 694
Registriert: Freitag 5. Februar 2016, 09:26
Wohnort: Flensburg

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#130

Beitrag von flensdorfer »

Günstige Bezugsquelle für die Magnete? magnet-shop.net nimmt den Warenwert nochmal als Versandkosten... Oder hat jemand ein paar 20x10x5 rumliegen?
Gruß, Arne

Anfänger in der 20l-Klasse
Benutzeravatar
norb
Posting Junior
Posting Junior
Beiträge: 40
Registriert: Montag 11. Juli 2016, 21:16
Wohnort: Hannover

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#131

Beitrag von norb »

Für alle, die auch kleinere Lüfter verwenden, hier noch die angepasste Version von Michaels Magnethalter.
Neben dem Durchmesser (fw), habe ich auch Zeile 30 angepasst. Zur Dokumentation habe ich den Originalcode als Kommentar stehen gelassen.

Da der Drucker vom Arbeitskollegen nicht ordentlich kallibriert war, muss der Durchmesser eventuell noch minimal verkleinert werden. Bei mir sitzt das Teil ordentlich auf dem Lüfter, aber die Vertiefungen für die Magnete waren um über 0,5mm zu schmal. Da musste ich nachschleifen. Da ich selber keinen 3D-Drucker habe, kann ich das aktuell nicht selber machen.

Magnethalter Pure Wings 2 PWM 80 mm.zip
(718 Bytes) 77-mal heruntergeladen
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#132

Beitrag von mwx »

Kann den Beitrag oben nicht mehr ändern, also hier das nächste Update mit nur kleinen Verbesserungen (danke@Herbert).

Noch ein Hinweis für die die einen Arduino UNO verwenden möchten: Der hat auf Pin 0 und 1 keine Interrupts sondern nur auf Pin 2 und 3 also bitte dort anschließen. Im Quelltext müssen dann die Interrupts noch auf 0 und 1 geändert werden. Das ist verwirrend weil genau umgekehrt :)

Gruß, Michael

Code: Alles auswählen

/////////////////////////////////////////////////////////////////////////////// Stir Control (mwx'2019, v1.2.4)
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>

#define SX Serial.print 
#define SXN Serial.println
#define MS (long)millis()

int SPEEDINC      = 50;                                                                      // speed increment

int FANMIN        = 200;                                                                   // fan minimum speed
int FANMAX        = 1000;                                                                  // fan maximum speed

int RINTERVAL     = 3000;                                                                // regulation interval 
int RDELAY        = 2000;                                                        // regulation delay on changes

int CATCHSTOP     = 20000;                                                                 // catch stop period

int PWM0          = 9;                                                                    // PWM pin for 1. fan
int PWM1          = 10;                                                                   // PWM pin for 2. fan
                                      
int I0            = 2;                                                       // interrupt for 1. fan rpm signal
int I1            = 3;                                                       // interrupt for 2. fan rpm signal
                                  
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 SAVETAG       = 1004;                                                                           // save tag 

LiquidCrystal_I2C lcd(0x27,16,2);                                           // LCD display (connect to SDA/SCL)

int v0,b0,r0,v1,b1,r1,r,fanstate0,fanstate1;                                            // speed and regulation
long rpmcount0,rpmcount1;                                                                        // rpm counter
double rpm0,rpm1;                                                                                        // rpm

long speedts,dt,rts,swts,bts,ox,savets,catchts0,catchts1,stop0,stop1,b0ts,b1ts;                       // timing
int bdelay,bprocess,enclast,encval,swmode;                                                 // button processing
char form[8],out[32],M[8];String str;                                                          // string buffer
int OK,SAVE,LOCK,bstate0,bstate1,btime0,btime1,catch0,catch1,ctime0,ctime1,mode;
 
 
void setup() { ////////////////////////////////////////////////////////////////////////////////////////// SETUP
  rpmcount0=0;rpmcount1=0;rpm0=0;rpm1=0;bprocess=0;speedts=0;r0=0;r1=0;swmode=2;

  Serial.begin(9600);                                                                           // start serial
  
  lcd.init();lcd.backlight();lcd.clear();                                                     // initialize lcd

  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)  // non-inverted PWM on ch. A
         | _BV(COM1B1)  // same on ch; B
         | _BV(WGM11);  // mode 10: ph. correct PWM, TOP=ICR1
  TCCR1B = _BV(WGM13)   // ditto
         | _BV(CS10);   // prescaler=1
  ICR1   = 320;         // TOP=320

  SAVE=0;                                                                           // load/initialize settings
  if (eer(0)!=SAVETAG) {
    v0=300;v1=300;b0=700;b1=700;btime0=30;btime1=30;catch0=0;catch1=0;ctime0=120;ctime1=120;
      eew(0,SAVETAG);
      save();
  } else {
    v0=eer(1);v1=eer(2);b0=eer(3);b1=eer(4);btime0=eer(5);btime1=eer(6);
    catch0=eer(7);catch1=eer(8);ctime0=eer(9);ctime1=eer(10);
  }

  pinMode(PWM0,OUTPUT);pinMode(PWM1,OUTPUT);                                                   // set pin modes
  pinMode(CLK,INPUT);pinMode(DT,INPUT);pinMode(SW,INPUT);

  enclast=digitalRead(CLK);                                                                // get encoder state

  fanstate0=0;fanstate1=0;OCR1A=0;OCR1B=0;                                                     // turn fans off

  rts=MS;swts=MS;bts=MS;savets=MS;catchts0=MS;catchts1=MS;stop0=MS;stop1=MS;                       // set timer

  bstate0=0;bstate1=0;mode=0;updatelcd();updatespeed();updatemarker();LOCK=0;             // set initial states
}


void loop() { //////////////////////////////////////////////////////////////////////////////////////////// LOOP

  if (SAVE>0 && MS-savets>60000) {;save();SAVE=0;savets=MS;} ////////////////////////// save settings if needed
  
  if (catch0 && MS-catchts0>(long)ctime0*60000) { ////////////////////////////////////// check catch fish state
    catchts0=MS;stop0=MS+CATCHSTOP;
    updatePWM();
  }
  if (catch1 && MS-catchts1>(long)ctime1*60000) {
    catchts1=MS;stop1=MS+CATCHSTOP;
    updatePWM();
  }

  if (bstate0 && MS-b0ts>(long)btime0*60000) {;bstate0=0;mode=0;updatelcd();} /////////////// check boost state
  if (bstate1 && MS-b1ts>(long)btime1*60000) {;bstate1=0;mode=0;updatelcd();}

  if (Serial.available() > 0) { ////////////////////////////////////////////////////////// serial communication
    str=Serial.readString();OK=0;

    if (str=="info") {;serinfo();OK=1;}                                                                 // info
    
    if (str.substring(0,5)=="speed") {                                                   // speed <fan0> <fan1>
      v0=sstr(str,':',1).toInt();
      v1=sstr(str,':',2).toInt();
      updatePWM();r0=0;r1=0;rts=MS+RDELAY;
      SAVE++;OK=1;updatelcd();serinfo();
    }

    if (str.substring(0,6)=="bspeed") {                                                 // bspeed <fan0> <fan1>
      b0=sstr(str,':',1).toInt();
      b1=sstr(str,':',2).toInt();
      updatePWM();r0=0;r1=0;rts=MS+RDELAY;
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }
    
    if (str.substring(0,2)=="on") {                                         // on <fan0> <fan1> (value: 0 or 1)
      if (sstr(str,':',1).toInt()==1) {;fanstate0=1;r0=0;} else fanstate0=0;
      if (sstr(str,':',2).toInt()==1) {;fanstate1=1;r1=0;} else fanstate1=0;
      updatePWM();rts=MS+RDELAY;
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }

    if (str.substring(0,5)=="boost") {                                   // boost <fan0> <fan1> (value: 0 or 1)
      if (sstr(str,':',1).toInt()==1) {;rts=MS+RDELAY;bstate0=1;b0ts=MS;} else {;bstate0=0;}
      if (sstr(str,':',2).toInt()==1) {;rts=MS+RDELAY;bstate1=1;b1ts=MS;} else {;bstate1=0;}
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }

    if (str.substring(0,5)=="catch") {                                   // catch <fan0> <fan1> (value: 0 or 1)
      if (sstr(str,':',1).toInt()==1) {;catch0=1;catchts0=MS;} else {;catch0=0;}
      if (sstr(str,':',2).toInt()==1) {;catch1=1;catchts1=MS;} else {;catch1=0;}
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }
    
    if (str.substring(0,5)=="btime") {                                     // btime <fan0> <fan1> (value: 0-60)
      btime0=sstr(str,':',1).toInt();if (btime0<0) btime0=0;if (btime0>60) btime0=60;
      btime1=sstr(str,':',2).toInt();if (btime1<0) btime1=0;if (btime1>60) btime1=60;
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }
    
    if (str.substring(0,5)=="ctime") {                                   // ctime <fan0> <fan1> (value: 60-240)
      ctime0=sstr(str,':',1).toInt();if (ctime0<60) ctime0=60;if (ctime0>240) ctime0=240;
      ctime1=sstr(str,':',2).toInt();if (ctime1<60) ctime1=60;if (ctime1>240) ctime1=240;
      SAVE++;OK=1;updatelcd();updatespeed();serinfo();
    }

    if (!OK) SXN("ERROR");
  }

  if (MS-rts>RINTERVAL) { ////////////////////////////////////////////////////////////////////////// regulation
    
    rpm0=rpmcount0/2/((MS-speedts)/1000.0)*60.0;
    rpm1=rpmcount1/2/((MS-speedts)/1000.0)*60.0;

    speedts=MS;rpmcount0=0;rpmcount1=0;

    if (abs(v0-rpm0)>8) {
      ox=1;if (abs(v0-rpm0)>20) ox=3;if (abs(v0-rpm0)>50) ox=5;
      if (bstate0) r=b0; else r=v0;
      if (r>rpm0) {;r0+=ox;if (r0>40) r0=40;}
      if (r<rpm0) {;r0-=ox;if (r0<-40) r0=-40;}
    }

    if (abs(v1-rpm1)>8) {
      ox=1;if (abs(v1-rpm1)>20) ox=3;if (abs(v1-rpm1)>50) ox=5;
      if (bstate1) r=b1; else r=v1;
      if (r>rpm1) {;r1+=ox;if (r1>40) r1=40;}
      if (r<rpm1) {;r1-=ox;if (r1<-40) r1=-40;}
    }
    
    if (!fanstate0) r0=0;
    if (!fanstate1) r1=0;
        
    updatePWM();updatespeed();rts=MS;
  }

  bdelay=0; //////////////////////////////////////////////////////////////////////////////////// process switch
  if (!bprocess) {
    while (!digitalRead(SW)){
      bdelay++;
      delay(25);
      bprocess=1;
      if (bdelay>20) break;
    }
  }
  
  if (bdelay>0 && MS-bts>100) {                                                            // long button press
    if (bdelay>20) {
      
      if (swmode==0 && mode==0 && !LOCK) {                                                      // fan 0 on/off
        if (fanstate0==0) {;rts=MS+RDELAY;fanstate0=1;r0=0;updatePWM();}
        else {;fanstate0=0;}
        updatespeed();
      }
      if (swmode==1 && mode==0 && !LOCK) {                                                      // fan 1 on/off
        if (fanstate1==0) {;rts=MS+RDELAY;fanstate1=1;r1=0;updatePWM();}
        else {;fanstate1=0;}
        updatespeed();
      }

      if (swmode==0 && mode==1 && !LOCK) {                                                    // boost 0 on/off
        if (bstate0==0) {
          rts=MS+RDELAY;bstate0=1;b0ts=MS;fanstate0=1;r0=0;updatePWM();
        } else {;bstate0=0;}
        updatespeed();
      }
      if (swmode==1 && mode==1 && !LOCK) {                                                    // boost 1 on/off
        if (bstate1==0) {
          rts=MS+RDELAY;bstate1=1;b1ts=MS;fanstate1=1;r1=0;updatePWM();
        } else {;bstate1=0;}
        updatespeed();
      }

      if (swmode==2) {                                                                           // lock/unlock
        if (LOCK==0) LOCK=1;
        else LOCK=0;
        updatemarker();
      }
      
      bdelay=0;
      
    } else if (bdelay>0 && bdelay<20 && !LOCK) {           // short button press: switch menu -> fan 0 -> fan 1
      swmode++;if (swmode>2) swmode=0;
      updatemarker();
      bdelay=0;
    }
    
    bts=MS;
  }
  if (digitalRead(SW)) bprocess=0;

  encval = digitalRead(CLK); ////////////////////////////////////////////////////////////////// process encoder
  if (encval != enclast && !LOCK) {
    if(!encval){
            
      if (digitalRead(DT) != encval) {                                                                    // cw
        if (swmode==0 && mode==0) v0+=SPEEDINC;  // fan 0 speed up
        if (swmode==1 && mode==0) v1+=SPEEDINC;  // fan 1 speed up
        if (swmode==0 && mode==1) b0+=SPEEDINC;  // boost 0 speed up
        if (swmode==1 && mode==1) b1+=SPEEDINC;  // boost 1 speed up
        if (swmode==0 && mode==2) btime0++;      // boost time 0 up
        if (swmode==1 && mode==2) btime1++;      // boost time 1 up
        if (swmode==0 && mode==3) catch0++;      // catch 0 on/off
        if (swmode==1 && mode==3) catch1++;      // catch 1 on/off
        if (swmode==0 && mode==4) ctime0+=10;    // catch time 0 up
        if (swmode==1 && mode==4) ctime1+=10;    // catch time 1 up
        if (swmode==2) mode++;
      } else {                                                                                           // ccw
        if (swmode==0 && mode==0) v0-=SPEEDINC;  // fan 0 speed down
        if (swmode==1 && mode==0) v1-=SPEEDINC;  // fan 1 speed down
        if (swmode==0 && mode==1) b0-=SPEEDINC;  // boost 0 speed down
        if (swmode==1 && mode==1) b1-=SPEEDINC;  // boost 1 speed down
        if (swmode==0 && mode==2) btime0--;      // boost time 0 down
        if (swmode==1 && mode==2) btime1--;      // boost time 1 down
        if (swmode==0 && mode==3) catch0--;      // catch 0 on/off
        if (swmode==1 && mode==3) catch1--;      // catch 1 on/off
        if (swmode==0 && mode==4) ctime0-=10;    // catch time 0 down
        if (swmode==1 && mode==4) ctime1-=10;    // catch time 1 down
        if (swmode==2) mode--;
      }
    
      if (swmode==0 && mode==0) {;updatePWM();r0=0;rts=MS+RDELAY;}                      // apply speed change 0
      if (swmode==1 && mode==0) {;updatePWM();r1=0;rts=MS+RDELAY;}                      // apply speed change 1
      if (swmode==0 && mode==1) {;updatePWM();r0=0;rts=MS+RDELAY;}                // apply boost speed change 0
      if (swmode==1 && mode==1) {;updatePWM();r1=0;rts=MS+RDELAY;}                // apply boost speed change 1
      
      if (swmode==0 && mode==2) {;if (btime0<0) btime0=0;if (btime0>60) btime0=60;}       // check boost time 0
      if (swmode==1 && mode==2) {;if (btime1<0) btime1=0;if (btime1>60) btime1=60;}       // check boost time 1
      
      if (swmode==0 && mode==3) {;if (catch0<0) catch0=1;if (catch0>1) catch0=0;catchts0=MS;}  // check catch 0
      if (swmode==1 && mode==3) {;if (catch1<0) catch1=0;if (catch1>1) catch1=0;catchts1=MS;}  // check catch 1
      
      if (swmode==0 && mode==4) {;if (ctime0<60) ctime0=60;if (ctime0>240) ctime0=240;}   // check boost time 0
      if (swmode==1 && mode==4) {;if (ctime1<60) ctime1=60;if (ctime1>240) ctime1=240;}   // check boost time 1

      if (swmode==2) {;if (mode<0) mode=4;if (mode>4) mode=0;}                               // check menu mode
      
      SAVE++;updatelcd();delay(50);
    } 
  }
  enclast=encval;
  
}


/////////////////////////////////////////////////////////////////////////////////////////////////////// SUPPORT

void updatelcd() { ///////////////////////////////////////////////////////////////////////////////// update LCD
  if (mode==0) {
    slcd(1,1,5,"SPEED");
    ilcd(7,1,-4,int(v0));
    ilcd(12,1,-4,int(v1));
  }
  if (mode==1) {
    slcd(1,1,5,"BOOST");
    ilcd(7,1,-4,int(b0));
    ilcd(12,1,-4,int(b1));
  }
  if (mode==2) {
    slcd(1,1,5,"BTIME");
    ilcd(7,1,-4,int(btime0));ilcd(12,1,-4,int(btime1));
  }
  if (mode==3) {
    slcd(1,1,5,"CATCH");
    if (catch0==0) slcd(7,1,-4,"OFF");
    else slcd(7,1,-3,"ON");
    if (catch1==0) slcd(12,1,-4,"OFF");
    else slcd(12,1,-3,"ON");
  }
  if (mode==4) {
    slcd(1,1,5,"CTIME");
    ilcd(7,1,-4,int(ctime0));ilcd(12,1,-4,int(ctime1));
  }
}  
  
void updatemarker() { /////////////////////////////////////////////////////////////////// update current marker
  slcd(0,1,1," ");
  slcd(6,1,1," ");
  slcd(11,1,1," ");
  if (!LOCK) {
    if (swmode==0) slcd(6,1,1,">");
    if (swmode==1) slcd(11,1,1,">");
    if (swmode==2) slcd(0,1,1,">");
  }
}

void updatespeed() { ///////////////////////////////////////////////////////////////////////// update fan speed

  slcd(1,0,5,"     ");
  if (fanstate0) {
    if (MS<stop0) {
      slcd(7,0,-4,"CAT");
    } else {
      if (bstate0) {
        ilcd(1,0,2, (((long)btime0*60000)-(MS-(long)b0ts))/1000/60+1);
      } else slcd(7,0,1," ");
      ilcd(7,0,-4,round(rpm0/5.0)*5);
    }
  }
  else slcd(7,0,-4,"OFF");
  
  if (fanstate1) {
    if (MS<stop1) {
      slcd(12,0,-4,"CAT");
    } else {
      if (bstate1) {
        ilcd(4,0,2, (((long)btime1*60000)-(MS-(long)b1ts))/1000/60+1);
      } else slcd(12,0,1," ");
      ilcd(12,0,-4,round(rpm1/5.0)*5);
    }
  }
  else slcd(12,0,-4,"OFF");
}

void serinfo() { /////////////////////////////////////////////////////////////////////////// serial info output 
  SX(fanstate0);SX(":");SX((int)(v0));SX(":");SX((int)(b0));SX(":");
  SX(fanstate1);SX(":");SX((int)(v1));SX(":");SX((int)(b1));SX(":");
  SX(rpm0);SX(":");SX(rpm1);SX(":");SX(r0);SX(":");SX(r1);SX(":");
  SX(bstate0);SX(":");SX(bstate1);SX(":");SX(btime0);SX(":");SX(btime1);SX(":");
  SX(catch0);SX(":");SX(catch1);SX(":");SX(ctime0);SX(":");SX(ctime1);SXN("");
}

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 updatePWM() { ///////////////////////////////////////////////////////////////////// update PWM (fan speed)
  if (v0<FANMIN) v0=FANMIN;if (v0>FANMAX) v0=FANMAX;
  if (v1<FANMIN) v1=FANMIN;if (v1>FANMAX) v1=FANMAX;
  if (b0<FANMIN) b0=FANMIN;if (b0>FANMAX) b0=FANMAX;
  if (b1<FANMIN) b1=FANMIN;if (b1>FANMAX) b1=FANMAX;
  
  double v;
  
  if (fanstate0) {
    if (MS<stop0) {
      OCR1A=0;
    } else {
      if (bstate0) {
        v=b0/(FANMAX/320.0)+r0;if (v<0) v=0;if (v>320) v=320;
        OCR1A=v;
      } else {
        v=v0/(FANMAX/320.0)+r0;if (v<0) v=0;if (v>320) v=320;
        OCR1A=v;
      }
    }
  } else OCR1A=0;
  
  if (fanstate1) {
    if (MS<stop1) {
      OCR1B=0;
    } else {
      if (bstate1) {
        v=b1/(FANMAX/320.0)+r1;if (v<0) v=0;if (v>320) v=320;
        OCR1B=v; 
      } else {
        v=v1/(FANMAX/320.0)+r1;if (v<0) v=0;if (v>320) v=320;
        OCR1B=v;
      }
    } 
  } else  OCR1B=0;
} 

void rpmint0() {;rpmcount0++;} ///////////////////////////////////////////////////////////////// rpm interrupts
void rpmint1() {;rpmcount1++;}

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
  eew(1,v0);eew(2,v1);eew(3,b0);eew(4,b1);eew(5,btime0);eew(6,btime1);
  eew(7,catch0);eew(8,catch1);eew(9,ctime0);eew(10,ctime1);
}

String sstr(String data, char separator, int index) { ///////////////////////////////// get saperated substring
  int found=0;
  int si[]={0,-1};
  int mi=data.length()-1;

  for (int i=0; i<=mi && found<=index; i++) {
    if (data.charAt(i) == separator || i == mi) {
      found++;si[0]=si[1]+1;si[1]=(i==mi) ? i+1 : i;
    }
  }
  return found > index ? data.substring(si[0], si[1]) : "";
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////// END
Zuletzt geändert von mwx am Dienstag 19. Februar 2019, 18:09, insgesamt 3-mal geändert.
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
glassart
Posting Freak
Posting Freak
Beiträge: 1703
Registriert: Mittwoch 1. Juli 2015, 11:50
Wohnort: Gunskirchen OÖ

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#133

Beitrag von glassart »

Super Michael, läuft perfekt :thumbsup

Danke für deine Mühe

lg Herbert
Benutzeravatar
DerDerDasBierBraut
Posting Freak
Posting Freak
Beiträge: 7890
Registriert: Donnerstag 2. Juni 2016, 20:51
Wohnort: Neustadt-Glewe

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#134

Beitrag von DerDerDasBierBraut »

Ist auf dem Wemos auch was zu beachten?
Davon habe ich noch sehr viele hier. Wenn es geht würde ich lieber einen davon verwenden anstatt einen Uno zusätzlich zu kaufen.
"Da braut sich was zusammen ... "
"Oh, Bier ;-) !"
"Nein! Was Böses!"
"Alkoholfreies Bier??? ..."
-----------
Viele Grüße
Jens
Benutzeravatar
norb
Posting Junior
Posting Junior
Beiträge: 40
Registriert: Montag 11. Juli 2016, 21:16
Wohnort: Hannover

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#135

Beitrag von norb »

DerDerDasBierBraut hat geschrieben: Dienstag 19. Februar 2019, 13:42 Ist auf dem Wemos auch was zu beachten?
Davon habe ich noch sehr viele hier. Wenn es geht würde ich lieber einen davon verwenden anstatt einen Uno zusätzlich zu kaufen.
Sind das ESP8266 Boards (z.B. D1 Mini)? Soweit ich mich erinnere und die Doku richtig verstanden habe, können die leider nur PWM mit maximal 1 kHz.
Benutzeravatar
flensdorfer
Posting Freak
Posting Freak
Beiträge: 694
Registriert: Freitag 5. Februar 2016, 09:26
Wohnort: Flensburg

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#136

Beitrag von flensdorfer »

mwx hat geschrieben: Dienstag 19. Februar 2019, 12:46 Noch ein Hinweis für die die einen Arduino UNO verwenden möchten: Der hat auf Pin 0 und 1 keine Interrupts sondern nur auf Pin 2 und 3 also bitte dort anschließen. Im Quelltext müssen dann die Interrupts noch auf 0 und 1 geändert werden. Das ist verwirrend weil genau umgekehrt :)
also so für Uno?
[code
int I0 = 0; // interrupt for 1. fan rpm signal
int I1 = 1; // interrupt for 2. fan rpm signal
[/code]
Gruß, Arne

Anfänger in der 20l-Klasse
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#137

Beitrag von mwx »

norb hat geschrieben: Dienstag 19. Februar 2019, 14:07 Sind das ESP8266 Boards (z.B. D1 Mini)? So wie ich die Doku verstanden habe, können die leider nur PWM mit maximal 1 kHz.
Ok, dann geht es nicht. Wenn Du einen UNO nimmst hast Du auch den Vorteil das Du den direkt mit 12V füttern kannst. Du brauchst dann keinen zusätzlichen Step-Down oder ähnliches.
Zuletzt geändert von mwx am Dienstag 19. Februar 2019, 14:21, insgesamt 1-mal geändert.
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#138

Beitrag von mwx »

flensdorfer hat geschrieben: Dienstag 19. Februar 2019, 14:19 also so für Uno?
[code
int I0 = 0; // interrupt for 1. fan rpm signal
int I1 = 1; // interrupt for 2. fan rpm signal
[/code]
ja genau so.
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
glassart
Posting Freak
Posting Freak
Beiträge: 1703
Registriert: Mittwoch 1. Juli 2015, 11:50
Wohnort: Gunskirchen OÖ

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#139

Beitrag von glassart »

einen Diplay/Encoder-Einbaurahmen gibt es auch dazu :Bigsmile
P1090731_Bildgröße ändern.JPG
P1090732_Bildgröße ändern.JPG
lg Herbert
Benutzeravatar
flensdorfer
Posting Freak
Posting Freak
Beiträge: 694
Registriert: Freitag 5. Februar 2016, 09:26
Wohnort: Flensburg

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#140

Beitrag von flensdorfer »

Macht es u.U. mehr sinn, den 120er zu nehmen? Der dreht bis 2200rpm, während der 140er "nur" bis 1600rpm geht. Oder bekommt man dann die Magnete nicht vernünftig untergebracht?.
Gruß, Arne

Anfänger in der 20l-Klasse
Benutzeravatar
glassart
Posting Freak
Posting Freak
Beiträge: 1703
Registriert: Mittwoch 1. Juli 2015, 11:50
Wohnort: Gunskirchen OÖ

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#141

Beitrag von glassart »

ich habe 2 120er laufen

lg Herbert
Benutzeravatar
mwx
Posting Freak
Posting Freak
Beiträge: 789
Registriert: Mittwoch 11. Oktober 2017, 07:37
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#142

Beitrag von mwx »

glassart hat geschrieben: Dienstag 19. Februar 2019, 14:38 einen Diplay/Encoder-Einbaurahmen gibt es auch dazu :Bigsmile
Schick. Du mußt aber jetzt ein relativ hohes Gehäuse bauen wenn die beiden Teile übereinander sind.
Gruß, Michael

Gerührt und nicht geschüttelt: Magnetrührer Controller
Benutzeravatar
glassart
Posting Freak
Posting Freak
Beiträge: 1703
Registriert: Mittwoch 1. Juli 2015, 11:50
Wohnort: Gunskirchen OÖ

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#143

Beitrag von glassart »

ich mache die Front schräg -ca. 45° dann sieht man besser drauf.
Könnte den Encoder antürlich auch li oder re positionieren.
Benutzeravatar
flensdorfer
Posting Freak
Posting Freak
Beiträge: 694
Registriert: Freitag 5. Februar 2016, 09:26
Wohnort: Flensburg

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#144

Beitrag von flensdorfer »

Herbert, hast Du die Aufnahme für die 120er anpassen müssen oder passen die aus der stl-Datei sowohl auf die 120er als auch auf die 140er SilentWings3?
Gruß, Arne

Anfänger in der 20l-Klasse
Benutzeravatar
glassart
Posting Freak
Posting Freak
Beiträge: 1703
Registriert: Mittwoch 1. Juli 2015, 11:50
Wohnort: Gunskirchen OÖ

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#145

Beitrag von glassart »

Arne ich hab mir selbst welche konstruiert die auf meine 120 er passen -ob die für die 80 er auch gehen kann ich nicht sagen.
Ich habe 3 Möglichkeiten die Magnete zu positionieren und bei mir passen sie so genau dass ich die Halter gar nicht festkleben muss ( fast eine Presspassung :Smile )
daleipi
Posting Freak
Posting Freak
Beiträge: 500
Registriert: Samstag 9. September 2017, 13:08
Wohnort: Ö - GU Süd

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#146

Beitrag von daleipi »

flensdorfer hat geschrieben: Dienstag 19. Februar 2019, 10:45 Günstige Bezugsquelle für die Magnete? magnet-shop.net nimmt den Warenwert nochmal als Versandkosten... Oder hat jemand ein paar 20x10x5 rumliegen?
ein Link von Frudel:https://www.ebay.de/itm/5-X-POWER-NEODY ... 9#shpCntId

ich hab meine von da: https://www.magnetmax.de/Neodym-Quaderm ... g::66.html
daleipi
Posting Freak
Posting Freak
Beiträge: 500
Registriert: Samstag 9. September 2017, 13:08
Wohnort: Ö - GU Süd

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#147

Beitrag von daleipi »

flensdorfer hat geschrieben: Dienstag 19. Februar 2019, 14:43 Macht es u.U. mehr sinn, den 120er zu nehmen? Der dreht bis 2200rpm, während der 140er "nur" bis 1600rpm geht. Oder bekommt man dann die Magnete nicht vernünftig untergebracht?.
bis zu welcher Drehzahl werden die denn in der Praxis tatsächlich eingesetzt?

es ist mir schon klar daß das auf das Gefäß und die Füllmenge ankommt. Wäre trotzdem interessant...

LG
stefan
JackFrost
Posting Freak
Posting Freak
Beiträge: 2983
Registriert: Dienstag 15. Mai 2018, 18:10

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#148

Beitrag von JackFrost »

Ich hab bei nem 30er Rührgisch mit 220ml im 250ml Erlenmeyrkolben 1300 bis 1400 UpM gebraucht.
140 mm Lüfter haben mehr Drehmoment, ist nem größeren Abstand der Magnete kommt man mit nem 50er Rührfisch leichter in größeren Gefäßen zu recht.

Gruß JackFrost
Meine Hardware:
eManometer
IDS2 ohne CBPi
Magnetrührer
Ss-Brewtech 10 Gal Topf
IDS2 Induktionsplatte
Benutzeravatar
flensdorfer
Posting Freak
Posting Freak
Beiträge: 694
Registriert: Freitag 5. Februar 2016, 09:26
Wohnort: Flensburg

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#149

Beitrag von flensdorfer »

daleipi hat geschrieben: Dienstag 19. Februar 2019, 18:36
flensdorfer hat geschrieben: Dienstag 19. Februar 2019, 10:45 Günstige Bezugsquelle für die Magnete?
ein Link von Frudel:https://www.ebay.de/itm/5-X-POWER-NEODY ... 9#shpCntId
der ebay-Link war gut, mir wurde noch ein 5€ Gutschein von ebay angezeigt. Habe mir dann gleich mal welche bestellt. :thumbup
Gruß, Arne

Anfänger in der 20l-Klasse
HubertBräu
Posting Freak
Posting Freak
Beiträge: 1463
Registriert: Montag 27. März 2017, 11:56
Wohnort: Berlin

Re: Der Magnetrührer-Thread (DIY, Infos, Bilder und mehr)

#150

Beitrag von HubertBräu »

daleipi hat geschrieben: Dienstag 19. Februar 2019, 18:36
flensdorfer hat geschrieben: Dienstag 19. Februar 2019, 10:45 Günstige Bezugsquelle für die Magnete? magnet-shop.net nimmt den Warenwert nochmal als Versandkosten... Oder hat jemand ein paar 20x10x5 rumliegen?
ein Link von Frudel:https://www.ebay.de/itm/5-X-POWER-NEODY ... 9#shpCntId

ich hab meine von da: https://www.magnetmax.de/Neodym-Quaderm ... g::66.html
Ich habe hier bestellt.
Antworten