Frage zu adxl335

Hey Leute :slight_smile:

Bin recht neu in der Szene und hab mir erst einmal zwei Bücher zum Thema Arduino bestellt. Da mir diese bei meinem Projekt jedoch nicht weiterhelfen frage ich hier einmal.

Ich habe den Sensor "adxl335" ausgelesen und Ausgänge geschalten...funktioniert 1A!!!

Da ich bei meinem Projekt, mit dem Sensor, ab einer gewissen Neigung Ausgänge schalten will, die Anbringung des Sensors jedoch nicht immer gleich ist....

würde ich eine Nullung, Rücksetzung oder sowas in der Art nach dem "Einschalten" des Sensors benötigen.

Ist sowas programmiertechnisch,oder mit dem adxl überhaupt, möglich? Also eine Nullsetzung nach Start des Programmablaufes.

Fals die Frage schonmal aufgekommen ist, lese ich mir gerne den Bericht durch...habe jedoch nichts auf die schnelle gefunden.
Aber dafür ist ein Forum ja auch da :slight_smile:

Für jede Hilfestellung bin ich dankbar!!!

glg

Michael

Ist sowas programmiertechnisch,oder mit dem adxl überhaupt, möglich?

Programmtechnisch ja, direkt am adxl nein (wie soll das gehen können?).

Das Problem bei programmtechnisch ist, dass du wissen musst, was du genau willst.

Reicht es, anzunehmen dass die Lage während des Einschaltens definitionsgemäß "waagerecht" ist?
Brauchst du einen Kalibrier-Modus, dessen Ergebnis übers Ausschalten erhalten bleibt?
Willst du den Sensor nicht lieber doch "richtig" einbauen ? :slight_smile:

Und, wo wir schon beim Fragen sind:
Kennst du den adxl345 ?

Hey, und vielen dank schon einmal für die Antwort und die Hoffnung das es geht :wink:

Ja der Sensor ist immer gleich aufgestellt, es schwankt nur um ein paar Grad.

Ich gebe mal ein zum Beispiel... :cold_sweat:

Ich mache den Sensor an einer Stange fest,welche mit der Hand ins Erdreich reingesteckt wird.

Da man, nach entfernen, niemals die Stange komplett gleich und "gerade" wieder erneut ins Erdreich stecken kann, wird mir der Sensor verfälschte Schaltmechanismen ausgeben.

daher hätte ich gerne das er liest wie er zurzeit steht, das danach null setzt und danach mit dem Standartprogramm weitermacht!

also ......

analogRead(Y);

danach nullsetzen...wie keine ahnung...

und dan wieder

if(Y<120)
digitalWrite(LED,HIGH);
else
digitalWrite(LED,LOW);

zb....

glg

Michael

Da man, nach entfernen, niemals die Stange komplett gleich und "gerade" wieder erneut ins Erdreich stecken kann, wird mir der Sensor verfälschte Schaltmechanismen ausgeben.

Baue einen Knopf an.
Wenn der Gedrückt wird, einen drei dimensionalen Kalibrierwert speichern.

Der Rest ist einfache Mathematik, eine dreidimensionale Vektor Transformation.

Das klingt nach: Bein Start wird die Lage als "gerade" definiert ( X Y Z merken )
Im Betrieb wird laufend hiermit verglichen und ggfls die Abweichung angezeigt.

Als "Kalibrier-Taster" ( nach dem Reinstecken ) kann der Reset Knopf verwendet werden, wenn da sonst nichts im Projekt ist, was du nicht erzählt hast.

Als X und Y wirst du übrigens waagerecht ca. 1.5 V messen, und 1.2 oder 1.8 wenn um 90° gekippt.
Versprich dir also nicht allzu viel oder miss auch die Z-Achse und mach richtige Geometrie mit dem Beschleunigungs-Vektor.

Was passiert wenn deine Referenz-Spannung (ca. 5V ?) nicht konstant ist ?
Hast du ein adxl335-Modul mit integriertem Spannungswandler und kannst du diese 3V als Referenz verwenden? :wink:

combie:
Der Rest ist einfache Mathematik, eine dreidimensionale Vektor Transformation.

Danke auch dir für die Anteilnahme an meinem Problem :slight_smile:
Jedoch versteh ich das nicht wirklich als einfache Mathematik...gibts vl wo einen Denkanstoß?

michael_x:
Das klingt nach: Bein Start wird die Lage als "gerade" definiert ( X Y Z merken )
Im Betrieb wird laufend hiermit verglichen und ggfls die Abweichung angezeigt.

Ja genau so solls funktionieren!!!

Nur weiß, bzw verstehe ich nicht wie ich das machen soll...wie gesagt bin noch anfänger...

also spannungswandler seh ich keinen...hab den hier ...

er zeigt ja beim auslesen werte um 200-400 an. Könnte man die nicht hernehmen um bei zb einer Änderung von +40 auszulösen...nachdem er auf nullgestellt hat?

glg

Michael

gibts vl wo einen Denkanstoß?

combie:
gibts vl wo einen Denkanstoß?

alles klar also werd ich das nie schaffen....hut ab wen du das verstehst...sry aber für mich sieht einfache mathematik anders aus :wink:

combie versucht, aus dir einen besseren ( schlaueren ) Menschen zu machen.
Mein Ansatz ist eher, probieren wie weit man mit einfachsten Mitteln kommt.


Dein Modul hat zwar einen Spannungsregler drauf, gibt aber die geregelten 3V nicht raus.

Wenn du dich nur ein bisschen mit deinem Sensor beschäftigst (ausprobieren und Datenblatt suchen/lesen), merkst du, dass 0 kein erwartbares Ergebnis ist. Und statt Vektorrechnung reicht für deine Ansprüche evtl. auch, die Veränderungen in x und y zu bestimmen die du als Grenzen festlegen willst.

Einfach mal einen Testsketch, der dir laufend ( alle 200 ms ) die Ergebnisse (Abweichung vom Startwert) auf Serial anzeigt.

Interessant ist auch, wie stark die Änderungen sind, wenn sich nichts tut :wink:

michael_x:
combie versucht, aus dir einen besseren ( schlaueren ) Menschen zu machen.
Mein Ansatz ist eher, probieren wie weit man mit einfachsten Mitteln kommt.


Dein Modul hat zwar einen Spannungsregler drauf, gibt aber die geregelten 3V nicht raus.

Wenn du dich nur ein bisschen mit deinem Sensor beschäftigst (ausprobieren und Datenblatt suchen/lesen), merkst du, dass 0 kein erwartbares Ergebnis ist. Und statt Vektorrechnung reicht für deine Ansprüche evtl. auch, die Veränderungen in x und y zu bestimmen die du als Grenzen festlegen willst.

Einfach mal einen Testsketch, der dir laufend ( alle 200 ms ) die Ergebnisse (Abweichung vom Startwert) auf Serial anzeigt.

Interessant ist auch, wie stark die Änderungen sind, wenn sich nichts tut :wink:

Supa danke mal für deine Mitarbeit und deine Recherchen...ganz Toll :slight_smile:

Mir gehts ja im Endeffekt eh nur um die Änderungen.

Er misst jetzt zb X = 355 wenn er bei mir am klemmbrett liegt!
Jetzt gebe ich ihm zb den Befehl...

if(X>360)
digitalWrite(LED,HIGH);
.....usw

Nur wenn ich ihn jetzt zb leicht schräg hinlege, das er 361 schon von haus aus hat, leuchtet die diode ja dauerhaft obwohl es keine änderung im winkel gegeben hat, und um die Änderung gehts mir im endeffekt ja...vl sitz ich auch nur schon zu lange vorm PC weil ichs nicht versteh wie das gehn soll :wink:

Wenn er immer gleich liegt isses ja eh easy die Grenzwerte festzulegen.

glg

Dann bestimme im Setup die x- und y-Werte uns merke sie Dir in den globalen Variablen xStart und yStart.

Im loop bestimmst Du dann

xDiff = X - xStart;
yDiff = Y - yStart;
if (xDiff > 360) tu was
oder wenn die Richtung egal ist:
if (abs(xDiff) > 360) tu was

Wer hat denn den Editor vom Forum so versaut?

Gruß Tommy

michael_x:
combie versucht, aus dir einen besseren ( schlaueren ) Menschen zu machen.

Nöö...
Das muss jeder in Eigenleistung erbringen.

Ich zeige einen Weg auf, wie man mit den Dingern umgehen kann.

Wenn es einfacher geht, von mir aus...
Meinen Segen ihr habt.

Tommy56:
Dann bestimme im Setup die x- und y-Werte uns merke sie Dir in den globalen Variablen xStart und yStart.

Im loop bestimmst Du dann

xDiff = X - xStart;

yDiff = Y - yStart;
if (xDiff > 360) tu was
oder wenn die Richtung egal ist:
if (abs(xDiff) > 360) tu was




Wer hat denn den Editor vom Forum so versaut?

Gruß Tommy

hab jetzt folgendes geschrieben, wo er mir aber nur 0 ausgiebt und es sich nichts bei neigungsänderung ändert...vl siehst du den fehler ja gleich :wink:

int LED = 13;
int X = A0;
int xStart = X;
int xDiff =0;

void setup() {

analogRead(X);

Serial.begin(9600);
}

void loop() {

xDiff = (X - xStart);

if (abs(xDiff) > 20)

digitalWrite(LED,HIGH);
else
digitalWrite(LED,LOW);

Serial.print(xDiff);
Serial.println();
}

glg michael

Setze Deinen Code bitte in Codetags (</> oben links im Forumseditor).
Dann lies Dir noch mal langsam den Text von mir durch, der vor dem Code steht und setze das um, was da drin steht.

Gruß Tommy

Tommy56:
Setze Deinen Code bitte in Codetags (</> oben links im Forumseditor).
Dann lies Dir noch mal langsam den Text von mir durch, der vor dem Code steht und setze das um, was da drin steht.

Gruß Tommy

Sry aber versteh bzw finde nicht was du meinst?

Beides nicht?

Wenn Du auf Reply klickst, hast Du über Deiner Texteingabe einige Symbole. Links steht </>. Das setzt Codetags. Ansonsten lies die ausführlichere Anleitung.

Gruß Tommy

So ganz grob solltest du schon verstehen, was du geschrieben hast.
C oder C++ Grundlagen, eben.

Ich ergänze mal nur ein paar Kommentare, keine Korrektur.

// Meine Pinbelegung (Konstanten)
int LED = 13; 
int X = A0;

// Meine Variablen  ( sollten in den Funktionen setup und loop geändert werden )  
int xStart = X;
int xDiff =0;


void setup() {
 analogRead(X);   // Einlesen von Pin X, aber nichts damit machen
 Serial.begin(9600);
}


void loop() {
   xDiff = (X - xStart);  // weil xStart = X initialisiert wurde, wird xDiff auf 0 gesetzt

   if (abs(xDiff) > 20)
     digitalWrite(LED,HIGH);
   else
      digitalWrite(LED,LOW);

   Serial.print(xDiff);    // Ausgabe 0, wie gewünscht
   Serial.println();
} // Ende, loop wird neu gestartet
  • Wie wird das erste Einlesen vom Pin X in der Variable xStart abgelegt?
  • Wo sollte das regelmäßige Einlesen von Pin X stattfinden und was soll damit gemacht werden?
  • Wie erreicht man, dass nicht schneller geschrieben wird als man mitlesen kann und das Modul bewegen kann?

Tommy56:
Wenn Du auf Reply klickst, hast Du über Deiner Texteingabe einige Symbole. Links steht </>...

In den Forum Einstellungen kann man sich die Werkzeugleiste auch im 'Quick Reply' aktivieren. <- Das sollte Standardmäßig so sein.

Zu den Einstellungen kommt ihr zB.: Alerts -> Settings.

lg dony

Hey Leute

So nach paar Tagen der Abstinenz, Arbeiten,Sport und um die Hirnleistung anzukurbeln habe ich es mit euren Anleitungen sowohl geschafft mein Problem zu lösen, als auch noch eine Abschaltung auf der Y Achse einzubauen!

Da fehlt mir noch die Selbsthaltung, also wenn y 1 mal auslöst das das ganze teil stillsteht(auch wenn y nicht mehr auslöst) bis zu einem reset des ganzen!
Vl wer ne Idee?

Aber danke mal dafür!!!

Jetzt hätte ich noch eine allgemeine Frage....Gebt mir bescheid fals ich hierzu besser einen neuen Thread aufmachen sollte...

Das ganze Projekt schaltet zurzeit eine Led.(Wie im folgenden Code ersichtlich!)

Jetzt möchte ich das ganze noch erweitern. Und zwar mit Funk.

Mein System besteht aus 3 Beschleunigungssensoren an 3 verschiedenen Stellen im Garten. Jeder wurde gleich programmiert, also das Programm auf einen Attiny oder so.

Jetzt sollen die 3 gesondert voneinander, also kodiert oder so, ihren Zustand(High oder Low) an einen Empfänger senden. Alles Batteriebetrieben.

Da reichen die billigen 433mhz teile ja nicht aus da man diese nicht kodieren bzw jedem einzelnen ne andere Adresse geben kann oder? also wenn 1 sendet, weiß der Empfänger nicht welcher das war oder?

Wegen der Reichweite fällt das 2,4ghz netz ja schoinmal weg. Auch muss ich ja keine riesigen Datenmengen senden...

Könnt ihr mir:

  • gute funkteile empfehlen?
  • Reichweite so um die 100m
  • relativ günstig
  • so klein wie möglich
  • keine Stromfresser

Schönen Tag noch :wink:

btw hier noch mein Code:

int LED=13;
int X=A0;
int xStart=0;
int Y=A1;
int xDiff=0;

void setup() {
  
xStart=analogRead(X);
Serial.begin(9600);
pinMode(LED,OUTPUT);
}

void loop() {
 
xDiff=(analogRead(X) - xStart);
delay(50);

if ((abs(xDiff)>5)&&(analogRead(Y)>290&&analogRead(Y)<370))
digitalWrite (LED,HIGH);
else
digitalWrite(LED,LOW);
Serial.print(analogRead(Y));
delay(50);
Serial.print(xDiff);
Serial.println();
}

Da reichen die billigen 433mhz teile ja nicht aus da man diese nicht kodieren bzw jedem einzelnen ne andere Adresse geben kann oder? also wenn 1 sendet, weiß der Empfänger nicht welcher das war oder?

Funkwellen habe nie und nimmer was mit Adressierung zu tun. Dazu sind sie nicht in der Lage.
Die Adressierung ist immer Teil des Protokolls.