Posts mit dem Label Diverses aus mir werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Diverses aus mir werden angezeigt. Alle Posts anzeigen

Samstag, 10. Februar 2024

Tool Lagerverwaltung (Teil 7) Projekt stand

Im Januar hatte ich den Blog Post geschrieben, in dem ich das Problem mit der Resource aus andere Assembly gelöst hatte. Die Lösung war peinlich einfach gewesen, aber ich denke, das vielleicht die Information den einen oder anderen weiterhelfen kann.

Aber kommen wir zu dem Tool für Lagerverwaltung, das auf Grund erhöhten Aufwand bei meiner Arbeit, die ich bei meinem Kunden aktuell habe. Ein Thema, über das ich in meinem Zukünftigen Buch schreiben werde, wenn ich genug Erfahrungen aus den Projekten zusammengetragen und Humorvoll ausgearbeitet habe.

 

Aber kommen wir zu dem eigentlich Thema für heute. Wo stehe ich gerade mit dem Projekt?

 

Benötigt

  • Github
  • Visual Studio 2022
  • .NET 7 (oder höher)

 

Zusammenfassen

Was sind meine nächsten Ziele, damit ich das Tool weiter entwickeln kann und welche Funktionen kommen in das Codexzier Application Framework.

 

Aktueller Stand

  • Die Solution mit mehrere Projekten Inhalten ist da.
  • Das UI Projekt selbst ist noch in WPF. Beim letzten mal wurde nur das Codexzier Application Framework für .NET MAUI angelegt.
  • In den Issues habe ich nur die eine Aufgabe Konzept ausschreiben.
  • Das Konzept selbst steht noch nicht im Wiki und muss noch als eigenes Kapitel abgelegt werden.
  • Eine Wiki in Github anlegen für das Tool ist auch schon angelegt. Das andere Wiki war für das Codexzier Application Framework für WPF und eine neue Ausführung mit .NET MAUI ist offen.

 

Wo fange ich an?

Eigentlich worauf ich Lust habe, aber ich kann nicht alles auf einmal erledigen. Also Entwickle ich die Grundfunktionalitäten, die ich allgemein brauche und die ebenfalls für das Tool relevant sind, aber auch für meine anderen Pojekte, über die ich auch offen habe.

 

Ich brauche allgemein

  • Die Projekte in der Solution aktualisieren nach .NET 8
  • Eine Druckfunktion
  • Style anlegen für Datagrid

 

Kleine Schritte

Zeitlich bin ich viel eingebunden. Wer ist das nicht, wenn man Beruflich mehr als 40 Stunden arbeitet und darüber noch eine Familie hat, mit der man gerne Zeit verbringt. Eigentlich kann ich die Privaten Projekte lassen und auch das schreiben eines Blogpost lassen. Dennoch müssen wir hin und wieder Dinge erlernen und ich lerne durch Probieren und darüber schreiben.

Samstag, 14. September 2013

Tippe die Lampe an

HitLamp01

Letztes Jahr habe ich zu dem Sensor BMA020 bereits ein Code Beispiel für den Arduino gepostet. Nun dachte ich, da der so rum liegt, kann man den vielleicht auch mal für etwas verwenden. Also kam mir die Idee eine Lampe einzuschalten, in dem man gegen sie tippt oder leicht schlägt.

Schaltung_HitLamp_bearbeitet-1
Im späteren Verlauf stellte ich fest, dass einige Widerstände zu groß berechnet wurden. Die Abweichungen kommen durch die LED, die eigentlich für 12V ausgelegt sind und ich sie aber mit 9V betreibe. (Für den ATMega fehlt auf dem Bild der Quarz, PIN9 und PIN10)

Zunächst skizzierte ich mir meine Schaltung und berechnete anhand des Schaltbildes die Widerstände. Dann sammelte ich meine benötigten Komponenten zusammen und steckte sie auf meinem Breadboard, um zu sehen ob meine Überlegung richtig ist.

image
Versuchsaufbau der Schaltung

Natürlich funktioniert die Schaltung nicht ohne einen Programmcode und daher musste ich mir zunächst etwas überlegen. Zum Beispiel wie ich aus den drei Achsen einen Wert berechne und wie hoch die Abweichung sein muss, um eine Bewegung als Tippen wahrzunehmen. Die Formel für den Gravitationsvektor half nicht sonderlich weiter. Am Ende kam ich auf ein simples Zusammenrechnen, wie es im Programmcode zu sehen ist.

gravitySum = axisX / 3 + axisY / 3 + axisZ / 3;

Dies habe ich mir auf den Serial Monitor ausgeben lassen und tippte solange gegen meinen Arduino mit dem Sensor, bis ich einen passenden Wert ermittelt hatte.

image
Nach dem gegentippen bekam ich einen Wert von mehr als 9000 (echt Zwinkerndes Smiley)

Dann übernahm ich den Wert in die Bedingung für das Einschalten oder Ausschalten. Nun musste das Ganze noch auf eine Platine gelötet werden und das möglichst im kleinsten Raum und mit den LEDs, die ich dafür verwenden möchte. Als Hülle habe ich einen Teil von einer Plastikflasche verwendet.

image
Die LED Fläche zerlegt. Diese LED Lampe kommt aus einem IKEA Lampen Set.
image
Hier schneide ich den Flaschenhals auseinander. Mit einer Halterung brachte ich den Teil des Flaschenhalses in Rotation und bekam durch diese Methode einen sauberen Schnitt mit dem Cutter Messer.
image
Anschließend noch in einer stylischen Farbe lackieren…
image
Die fertige Schaltung einsetzen und die LED Flächen ankleben.

Am Ende noch den fertigen Programmcode auf den ATMega326 bringen.

#include <Wire.h>

// I²C Adresse vom Beschleunigungssensor
#define AccelerometerAddress 0x38

// Byte Array in dem die Ergebnisse gespeichert werden
byte data[6];
// Ruft die XYZ Achsen Beschleunigung ab oder legt sie fest.
int axisX;
int axisY;
int axisZ;

// Beim Einschalten muss der Sensor Kalibriert werden.
// Der Sensor sollte sich in dem Moment nicht bewegen.

int axisX_offset;
int axisY_offset;
int axisZ_offset;

// Wird nach dem Kalibrieren auf False gesetzt.
boolean isFirstTime = true;

// Die Beschleunigung wird zusammengerechnet,
// durch 3 geteilt und dieser Variable gespeichert.
double gravitySum;

// Zeigt den maximalen berechneten Wert aus 'gravitySum'
int maxValue = 0;

// Ruft ab, ob die Lampen eingeschaltet
// oder ausgeschaltet werden.
boolean isHitting = false;

// An welchem Pin soll die LED
// ein oder ausgeschaltet werden.

int ledPin = 12;

void setup()
{
  // Die serielle Verbindung wird nur zum Ermitteln
  // des 'gravitySum' benötigt.
  Serial.begin(57600);
  // LED Pin zuweisen
  pinMode(ledPin, OUTPUT);
  // I²C Verbindung starten
  Wire.begin();
  // LED Pin zunächst ausschalten.
  digitalWrite(ledPin, LOW);
}

void loop()
{
  // Liest die Sensor Beschleunigungsdaten ein.
  readAcceleration();
 
  // per Byte Shifting den 10Bit Wert zusammenfügen
  axisX = (data[0] >> 1) | data[1] << 8;
  axisY = (data[2] >> 1) | data[3] << 8;
  axisZ = (data[4] >> 1) | data[5] << 8;
 
  // Wenn dies der erste Durchlauf ist
  // dann wird das Offset gesetzt.

  if(isFirstTime)
  {
    axisX_offset = axisX;
    axisY_offset = axisY;
    axisZ_offset = axisZ;
    isFirstTime = false;
  }
  else
  {
    // Abweichung runterrechnen
    axisX = axisX - axisX_offset;
    axisY = axisY - axisY_offset;
    axisZ = axisZ - axisZ_offset;
  }
 
  // Keine Gravitationsberechnung, nur einfaches
  // Zusammenrechnen, um einen Wert später zu erhalten
  // der nur bei Bewegung gemessen wurde.

  if(axisX < 0){ axisX = axisX * -1; }
  if(axisY < 0){ axisY = axisY * -1; }
  if(axisZ < 0){ axisZ = axisZ * -1; }

  gravitySum = axisX / 3 + axisY / 3 + axisZ / 3;
 
  // Ergebnisse ausgeben
  Serial.print("Axis X: ");
  Serial.print(axisX, DEC);
  Serial.print("\tAxis Y: ");
  Serial.print(axisY, DEC);
  Serial.print("\tAxis Z: ");
  Serial.print(axisZ, DEC);
 
  Serial.print("\tGravity: ");
  Serial.print((int)gravitySum, DEC);
 
 
// Der 'maxValue' zeigt den höchsten
  // berechneten Wert aus 'gravitySum'

  if(gravitySum > maxValue)
  {
    maxValue = gravitySum;
  }
 
 
// Maximalen Wert wiedergeben,
  // der später als Schwellwert verwendet werden kann
  Serial.print("\tMax Value: ");
  Serial.println(maxValue, DEC);
 
 
// Wenn der maxValue ermittelt wurde
  // kann der Wert zum Vergleich eingesetzt werden.
  // So soll erst ein Schaltvorgang gesetzt werden,
  // wenn der Schwellwert (hier 9000) erreicht wurde.
  if(gravitySum > 9000)
  {
    // Zustand ändern
    isHitting = !isHitting;
   
   // Einschalten, wenn die Lampe aus ist
    if(isHitting)
    {
      digitalWrite(ledPin, HIGH);
      Serial.println("AN");
    }
   
else
    {
      digitalWrite(ledPin, LOW);
      Serial.println("AUS");
    }
   
   
// Verzögerung zum Ausschwingen,
    // damit nicht gleich die Lampe
    // wieder ausgeschaltet wird.
    delay(1500);
  }
 
  delay(100);
}

// Liest den Beschleunigungssensor ein und schreibt das Ergebnis in ein Byte Array.
void readAcceleration()
{
  Wire.beginTransmission(AccelerometerAddress);
  Wire.write(0x02);
  Wire.endTransmission();
  Wire.requestFrom(AccelerometerAddress, 6);

  for(int i = 0; i < 6; i++)
  {
    data[i] = Wire.read();
  }
}

Mit einem 9V Block Akku lässt sich dies leider nicht lange betreiben, da die LEDs zusammen 1W Leistung verbrauchen. Ein 9V Block ist spätestens nach einer halben Stunde leer. Besser eignet sich hier ein Netzteil (oder eine Batterie mit mehr Kapazität). Hier noch ein kurzer Zusammenschnitt als Video.

Was vielleicht von Interesse sein könnte, sind die verwendeten Bauteile. Alternativ kann nach Bedarf das Aussehen bestimmt werden. Zwinkerndes Smiley

Materialliste:

  • 1 x Arduino Duemilanove (Geht auch mit anderen)
  • 1 x Beschleunigungssensor BMA020
  • 1 x Spannungsregler LM317
  • 1 x Quarz 16Mhz
  • Widerstände: 1 x 47 Ohm, 1 x 4,7kOhm, 1 x 10Ohm, 2 x 2,2kOhm
  • Transistoren: 1 x BC177A (PNP), 3 x BC547B (NPN)
  • 1x Potentiometer 500Ohm
  • 1x Streifenplatine
  • 1 x DIODER (Name des IKEA Produktes mit den LED Flächen)
  • 1 x Breadboard
  • 1 x Platine
  • 1 x 9V Block
  • eine Menge Kabel
  • 1 x Kunststoff Flasche

Samstag, 21. Juli 2012

So weit draußen

image
Kein UMTS. Mit dem Mobiltelefon sieht das auch nicht besser aus.

Es gibt Teile in Deutschland, die soweit von den Städten (oder von mir aus auch von der Zivilisation) entfernt sind, da würde es mich nicht wundern unbekannte Ureinwohner zu finden.
Wie jedes Jahr besuche ich meinen Vater am Geburtstag. Wer kein Auto zur Verfügung hat, der fährt mit der Bahn. Und hierbei bin ich immer wieder überrascht, was man heutzutage alles als "Bahnhof" bezeichnen darf. Zwar ist es in meiner Stadt auch eher dürftig, dennoch ist es ein Bahnhof mit Bahnsteig, Automaten, einem Kiosk der nicht in Betrieb ist und überbedachtem Fahrradstand. Auf der Strecke von Uelzen nach Gifhorn scheinen sich Bahnhöfe anders zu definieren. Einige davon scheinen nur einen Automaten zu haben, andere Bahnhöfe scheinen in einer Geisterstadt zu liegen. Zumindest sehe ich noch Menschen an den Bahnhöfen aussteigen und vereinzelt sieht man auch mal ein Fahrzeug.
Am Ziel angekommen, als ich endlich die Stadt Gifhorn erreichte, kam auch der Empfang wieder.

Ameisen Simulation und andere Dinge

Wer lange sich schon mit C# beschäftig, hat sicherlich schon mal was von AntMe gelesen oder gehört. Diese Idee hatte ich aufgegriffen und mi...