Ende am Licht des Tunnels

verdammt es war doch nur ein Zug…

Ne Quatsch aber manchmal kommt man halt weiter und es ergeben sich gute Punkte wenn man sein Konzept überdenkt. Dies habe ich die letzten Tage gemacht und auch darüber wie es weiter gehen soll mit den Platinen…
Ergbniss: Wir scheißen einfach auf alles was uns Kummer macht und bauen zusammen was wirklich wichtig ist. Arbeiten in einem am nächsten Projekt und vereinfachen alles.

Das Resultat ist ein Mix aus MiniControl und TFT, unter dem geplanten Namen MiniTFT.

Ich habe also alles von den jetztigen Prototypen genommen was funktioniert (Uhr, LED Dimmung, TFT) und das dazu genommen was eh funktioniert (Düngersteuerung, Lüftersteuerung) und das weg gelassen was nicht Funktioniert (USB). Ich konnte zwar nur 5 Düngepumpen unterbringen vom Platz, daafür ist aber ein Updaten der Software über USB, Wifi oder Bluetooth möglich, jeweils mit Programmieradapter. Wie ich das löse weis ich zwar noch nicht, aber ich weis das es geht…

MiniTFT1284

Außerdem habe ich dann direkt mal ein paar kleine Gedanken gemacht um ein mögliches Userinterface:

IMG_20150121_221549

Erste Zeile ist die Uhrzeit, dann haben wir 15 Felder wo man die Helligkeit der LED’s sieht und bei klick auch direkt den Tagesablauf dieser einstellen kann.
Unten sind die 5 Düngerpumpen mit Füllstand. Klicken um Zeiten oder Füllmenge an zu passen.
Die Temp wird rechts angezeigt und eingestellt indem man drauf Klickt.
Die freie Fläche denke ich dann an 4 Icons: Manuelles Licht, Manuelles Düngen, Zeit/Datum Einstellen und Speichern der Einstellungen in EEPROM.

Sehr schlicht, aber alles drin was man braucht. Das beste ist aber: Im Februar kann ich dazu hoffentlich auch ein Update geben.

 

 

Der Frust des Prototypings

Heute möchte ich mal wieder ein wenig Frust ablassen oder besser gesagt, Ich lass euch ein wenig an meinem Frust der letzten Tage teilhaben.

Zuerst einmal aber die gute Nachricht: Mein Weihnachtsgeschenk ist da, zumindest zum Teil. Da Ich die Sam3 Platinen nochmal umgeändert habe sind diese noch nicht bei mir. Dafür sind aber 3 andere Platinen zu mir gekommen und diese funktionieren teils sehr gut.
Direkt von anfang an und Fehlerfrei sind die neuen KSQ Platinen. Sie sind zwar ein klein wenig teurer als die alten, dafür ist es aber nun sehr einfach den Strom (die mA) mit dem Poti ein zu stellen. Auf jeden Fall sehr komfortabel und gut einsetzbar. Ich werde das Layout zwar nochmal bisschen überarbeiten wahrscheinlich aber dann werden diese auf jeden Fall die Nachfolger der jetzigen KSQ werden.

2015-01-19 19.17.55

Als 2tes sind neue Platinen mit Atmega328p gekommen und der Frust fängt an: Da ich noch nie mit dem USB Serial Connector gearbeitet habe und die Datenblätter zum Zeitpunkt des designs nur in Chinesisch vorlagen habe ich da etwas faalsch interpretiert (und gegoogelt) und schon funktionieren diese nicht… Dafür konnte ich aber erfolgreich die Atmega328p programmieren und erste Tests mit dem Minicontroller Sketch und OLED waren auch erfolgreich. Ich bin mir noch nicht sicher was ich mit der Erkenntnis mache, aber ich denke das der Minicontroller eine gute Chance hat in der nächsten Version mit MCU direkt bestückt zu sein. Am schwerssten wird es aber werden auch die Dosiersteuerung auf diesen Kleinen Platinen unter zu bringen, wenn auch noch gute Stecker für LED und Pumpen mit dran sollen. Wir werden sehen…

2015-01-19 19.18.09

Als letztes kommen wir dann zu meiner Frustplatine: Die MiniTFT! Diese hat bei mir grade sehr hohe Prio da ich sie für mein Meerwasser Nano brauche. Doch, ich setze hier nicht nur zum ersten mal den CH340T ein, ich experimentiere auch mit dem Atmega1284p und einem SPI TFT Touch Display mit 2,4″. Das alles ist keine gute Kombi, ich muss es aber zum laufen bekommen und alle Fehler beseitigen um diese Platinen „richtig“ zu bestellen. Daher wird an dieser Platine gebastelt bis sie funktioniert was grade sehr lustig aussieht:
2 Kabel an Chip gelötet, 100nf Kerko mit verlötet, Resonator gegen Quarz getauscht mit 2 Kerkos, etliche Libaries und Hardware configs getestet… Seit mittlerweile einer Woche sitze ich jeden Tag dran und suche Fehler, studiere Schaltpläne und Datenblätter und immer noch funktioniert es nicht.
Was soll ich sagen? Es frustet, aber ich hoffe das es irgendwann funktioniert und ich die Platine entdlich benutzen kann.

2015-01-19 19.18.26 2015-01-19 20.19.38

Alea iacta est

oder besser, Sie rollen noch… Es ist aber eine Entscheidung gefallen was die Problematik der zu wenigen Pins des Due/Mega angeht:
Ich hab kurzerhand eine neue Variante des Arduino Due geschrieben für die Arduino IDE. Somit Kollidieren meine Hacks nicht mit den Orginal Dateien und ein anderer Due kann ohne gefahr die gleiche IDE benutzen.

AG-Variant

Nun zu den Fehlenden Ports und evt Einschränkungen:
Schauen wir uns erstmal an wie die Platine nun aussieht

AquaGrowSam3a

Wie wir sehen ist auf der Linken Seite sowie Rechts neben „Erase“ ein neuer Steckplatz hinzu gekommen der mit AG1-22 durchnummeriert ist. Dies sind auch die neuen Ports/Benennungen in der Arduino IDE. Hinter AG1-AG9 und AG11 verstecken sich die Analogen Ports des Due (A2-A11). Diese können also ganz normal verwendet werden. AG10 und AG12-22 sind neue Pins die NICHT auf dem Due vorhanden sind. Mein Plan ist es AG1-AG4 für Futter und Nachfüll Automatik, AG9 Wasserstandssensor, AG5-AG8 Transistoren, und AG11 als freien Sensoren Pin zu verwenden. AG17-AG22 wird für Steckdosen reserviert, AG13-AG16 ist reserviert für weitere Sensoren die evt irgendwann kommen. Somit ist der Aufbau mit eigenen Controllern im Funktionsumfang gleich (Da statt Relays auch Funk genutzt werden kann um Verbraucher wie Heizung zu steuern), der Vorteil der Platine ist lediglich das es bequemer und einfacher ist alles an zu schließen und bei vielem (Pumpen, TFT, Temperatur, BNC Sensoren) keine extra Komponenten und Kabel gekauft/gelötet werden müssen (abgesehen von Steckern/Pins/headern).

Da Ich die Platine für faule wie mich entwickelt habe aber trotzdem die möglichkeit offen halten will dies mit eigenen Bauteilen zu realisieren hoffe Ich das dies später so klappt wie ich mir das vorstelle. Der Anreiz sich später einmal die Platine zu holen sollte (mMn) nicht der sein das es sonst nicht möglich wäre um zu setzen. Das wäre Boykott des DIY Gedanken der hinter allen meinen Projekten steht. Doch nur mit diesem Schritt kann ich, so denke Ich eine DIY Lösung präsentieren die vom Umfang es mit GHL, IKS und anderen auf nehmen kann UND von dehnen bedient werden kann die weder Technisches KnowHow noch einen überfüllten Geldbeutel haben.

Neuer Bugfix und experimenteller Code

soooo,
ich starte das neue Jahr nochmal mit nem Update: Es ist aufgefallen das bei bestimmten Zeiteinstellungen in der Dimmung der Controller sich verrechnet. Somit kommt ein PWM Wert von 4097 zu stande was natürlich nicht geht. Man sieht es bei der Lampe dass eine Sekunde vor 100% die Lampe kurz aus geht. Beheben des Problems ist sehr einfach:
in der Datei Licht ino muss sehr weit unten eine Bedingung eingefügt werden die diesen Rechenfehler abfängt:

if(pwm<=0){ pwm=0; }else if (pwm>4095){
pwm=4095;
}

Das ganze sieht dann so aus:

.............
f= dimTime/(Max-Min); // 1800/2800=0,64
p = pastSeconds/f; // 1616 / 0,64=2525
pwm=Min+p;
if(pwm<=0){ pwm=0; }else if (pwm>4095){
pwm=4095;
}
return pwm; // Im Nofall ausschalten...
}

Ich habe die IDE bereits geändert und beispiele auf den neusten stand gebracht.

Weiterhin habe Ich mich auch dem Problem angenommen was Dirk gepostet hatte mit den Weniger Schaltzeiten. Hierfür ist die Dimmung nen bisschen gravierender Umgeschrieben wurden und daher experimentel. Ich kann es z.z. leider nicht live testen, daher poste ich den Code einfach mal als Beta wenn es jemand ausprobieren möchte:
Die gesamte Funktion PWM_Licht einfach überschreiben!

int PWM_Licht(int lightIndex){

long Max,Min,pwm=4095;
float dimTime,f,p;
float pastSeconds;
uint32_t Start,Ende;
byte oMin,oMax;

if(light_channels[lightIndex][0].time < rtc.daystamp){ Start = light_channels[lightIndex][LIGHT_VALUES-1].time; Ende = light_channels[lightIndex][0].time; oMin = light_channels[lightIndex][LIGHT_VALUES-1].level; oMax = light_channels[lightIndex][0].level; pastSeconds = get_ts(24,0,0)-Start+rtc.daystamp+0.5; dimTime = get_ts(24,0,0) - Start + Ende+0.5; } else if(light_channels[lightIndex][LIGHT_VALUES-1].time < rtc.daystamp ){ Start = light_channels[lightIndex][LIGHT_VALUES-1].time; Ende = light_channels[lightIndex][0].time; oMin = light_channels[lightIndex][LIGHT_VALUES-1].level; oMax = light_channels[lightIndex][0].level; pastSeconds = rtc.daystamp-Start+0.5; dimTime= get_ts(24,0,0) - Start + Ende+0.5; } else { int curIndex=0; for(byte n=0;n4095){
pwm=4095;
}
return pwm;
}

Schönen start ins Jahr wünsche ich!