Show Posts
Pages: 1 ... 68 69 [70] 71 72 ... 203
1036  International / Deutsch / Re: Lichtsteuerung Mischtechnik teils zeitverzögert on: January 17, 2014, 08:53:29 am
Hallo jurs, schon mal ausprobiert wie toll der avr-gcc Compiler ist ?

Ne, da bin ich ein Gewohnheitstier.
Aber schön, wenn der Compiler die überflüssigerweise deklarierte Variable dann selbst wieder weg optimieren kann.
1037  International / Deutsch / Re: Eigene IDE / API Bedienfenster Kommunikation selbst schreiben on: January 17, 2014, 08:34:46 am
Interessant. Jedes gerade angewählte Zeichen, oder definiert man Eingabe-Bereiche (Buttons) ?

Ich habe gerade noch mal die Mausunterstützung bei Putty gecheckt, und dabei dieses Standardverhalten festgestellt:

Markieren beliebiger Texte im Terminalfenster (auch mehrere Zeilen): Linke Maustaste drücken, ziehen, loslassen
Markieren eines Wortes im Terminalfenster: Doppelklicken auf das Wort

Gesendet wird dann immer mit der rechten Maustaste, und zwar jeweils der im Terminalfenster markierte Text.

[ smile ]Eine PC-GUI als Putty Terminal Programm auf Arduino zu schreiben ist aber doch eher was für Sportler / Masochisten, oder ? [ / smile ]

Oder für Leute, die einen PC nicht so gut programmieren können und wenigstens PC-seitig ein garantiert funktionierendes Programm laufen haben wollen, so dass sie sich schwerpunktmäßig auf das Programmieren der Arduino-Seite konzentrieren können.
 smiley-wink
1038  International / Deutsch / Re: Eigene IDE / API Bedienfenster Kommunikation selbst schreiben on: January 17, 2014, 07:39:14 am
Quote
Drückst einen Button im Fenster

Ich glaube nicht, dass VT100 Terminals mit Touchscreen weit verbreitet sind smiley-wink

Nein VT100 Terminals hatten einen Bildschirm und eine Tastatur, aber keine Maus und schon gar keinen Touchscreen.

VT100 Emulationen müssen daher im allgemeinen per Tastatur bedient werden. Bei einer Android-App als Terminalemulation gerne auch die eingeblendete Bildschirm-Tastatur.

Teilweise kann man aber die Bedienung per Klicken mit der Maus" hinbekommen. Es gibt nämlich Terminalprogramme, die z.B. wenn man den Mauszeiger auf ein Zeichen am Bildschirm stellt und dann klickt, jeweils das Zeichen unter dem Mauszeiger senden, so als ob man ihn mit der Tastatur eingegeben hätte. D.h. wenn man sich z.B. ein durchnumeriertes Menü mit den Ziffern 1 bis 9 erstellt, könnte man es so machen, dass beim Mausklick die Auswahlziffer 1 bis 9 gesendet wird. Das ist aber nicht Standard für Terminalprogramme und die Verfügbarkeit eines solchen Features hängt vom verwendeten Terminalprogramm ab. Das Terminal xterm unter Linux sollte es beispielsweise so mit der Maus handeln. Und unter Windows kann es Putty mit der Maus.
1039  International / Deutsch / Re: Eigene IDE / API Bedienfenster Kommunikation selbst schreiben on: January 17, 2014, 07:19:42 am
Ich brauche eine IDE oder Bibliothek mit der ich Daten Empfangen oder senden kann.
Drückst einen Button im Fenster und am Board geht eine led an. So zum Beispiel war es gedacht.

Falls nur ein Textmodus benötigt wird, das ist seit den siebziger Jahren des letzten Jahrhunderts Standard. Nennt sich "VT100" Terminal und ist heute als "Terminalprogramm" auf jeder Rechnerplattform als Standardsoftware verfügbar.

Die graphischen Gestaltungsmöglichkeiten im Textmodus sind zwar nicht gerade berauschend, aber bunt und in Farbe geht dabei auch, wie ich hier schon mal mit einem Beispiel-Screenshot einer Bedienoberfläche gezeigt habe:
http://forum.arduino.cc/index.php?topic=147715.msg1111624#msg1111624

Die im Screenshot gezeigte Benutzeroberfläche wird dargestellt auf einem Windows-PC mit dem Terminalprogramm "Putty" und von einem Arduino in Form von "VT100-Steuercodes" über die serielle Schnittstelle gesendet.

Terminalprogramme zur Darstellung von VT100 sind bis heute gängiger Standard, gibt's für Windows kostenlos und gehören zu jeder Linux-Distribution standardmäßig dazu.
1040  International / Deutsch / Re: Lichtsteuerung Mischtechnik teils zeitverzögert on: January 17, 2014, 06:37:45 am
Hm, ich hab gestern noch ein bißchen probiert und versucht mit der Analyse aus anderen Bsp.: herauszufinden wie ich einen blickkanal und einen fadekanal schreiben kann. Dabei hab ich mir das Blinkexampel und das Fadexample rausgesucht.

Das sind zwei Beispiele, wie sie für die zur Arduino-Software mitgelieferten Programmbeispiele typisch sind: Sie zeigen, wie irgendwas geht, sind aber vom Prinzip her total unbrauchbar für irgendwelche praktischen Zwecke. Die Beispiel sind voll der Griff ins Klo.

Die Unbrauchbarkeit dieser Beispiele kommt von der verwendeten "delay()" Funktion. Delay-Aufrufe blockieren die gesamte Programmausführung für eine bestimmte Zeit. Das mag für einige wenige nicht-interaktive Programme tatsächlich praktikabel sein, aber für Programme, die entweder
- interaktiv bedienbar sein sollen oder
- verschiedene Hardware nahezu "gleichzeitig" ansteuern sollen
ist "delay" eine Funktion, die nicht verwendet werden darf. Interaktive Programme, und Programme die Dinge gleichzeitig tun sollen, dürfen in der Programmausführung nicht blockiert werden, sondern müssen im "kooperativen Multitasking" laufen.

muß ich die leds als int angeben oder als const int???

Hardware-Pins im Programm, die sich zur Programmlaufzeit nicht ändern, definiere ich immer per #define Makro, z.B.:

#define LEDPIN 13

Im Gegensatz zu einer Variablendeklaration mit "int" oder "const int" belegt das Makro keinen RAM-Speicherplatz. Ein define-Makro funktioniert so, dass vor der eigentlichen Kompilierung ein "Präprozessor" unsichtbar im Hintergrund ein Suchen und Ersetzen über den Quelltext laufen läßt. Dabei würde dann überall wo "LEDPIN" steht, tatsächlich "13" im Quelltext eingesetzt werden und das Programm erst danach kompiliert. Der bearbeitete Quelltext ändert sich dabei nicht.

Als Merkhilfe, dass ein Ausdruck ein Makro und keine Variable ist, bietet es sich an, Makros immer groß zu schreiben. Denn wenn man sich irgendwo vertippt, etwa beim Makro, können sonst im merkwürdige und kaum erklärbare Fehler beim Kompilieren auftreten, wenn man nicht weiß, dass es sich um ein Makro handelt, das man dann überprüfen müßte.

Und im setup als output deklarieren denke ich mal.

Ausgänge, die per "digitalWrite" geschaltet werden sollen, müssen vorher auf OUTPUT gesetzt werden.
Bei Ausgängen, die per "analogWrite" auf eine PWM-Ausgabe geschaltet werden sollen, ist das aber nicht erforderlich.

Nur hab ich es nicht hinbekommen wo der fadekanal hingehört; setup oder loop.

muß ich dem selber einen Namen geben und dann den Inhalt in Klammern setzen, so dass er dann immer wieder abgerufen werden kann???)

Arduino-Sketche sind C++ Programme. Du müßtest Dir mal dringend ein paar Grundkenntnisse der Programmierung aneignen.

Programme bestehen aus Funktionen, die aufgerufen werden. Es gibt im Sprachumfang sowohl "eingebaute" Funktionen, die schon vorhanden sind und die Du direkt verwenden kannst, so wie "pinMode" oder "digitalWrite". Aber Du kannst auch Funktionen selber schreiben, dazu wird eine Funktion nach diesem Schema "deklariert":

Code:
rückgabewert Funktionsname(parameterliste)
{
}

Wenn eine Funktion keinen Rückgabewert zurückliefern braucht, heißt der Rückgabewert "void", das steht für "nichts". Die Parameterliste ist eine Liste von Variablendeklarationen, die an die Funktion übergeben werden sollen. Und im Anweisungsblock zwischen den geschweiften Klammern stehen die auszuführenden Befehle.

Es gibt zwei Funktionen, die jeder Arduino Sketch haben muß (setup und loop) und beliebig viele eigene Funktionen kannst Du selber schreiben und aufrufen.

Funktionen dienen zur Strukturierung eines Programms.

Du kannst natürlich auch 500 Zeilen Progrmamcode nur in die "loop" schreiben. Sinnvoller ist es aber, ein Programm in kleinere Funktionsblöcke aufzuteilen, die jede für sich eine ganz kleine Einzelaufgabe übernehmen, z.B. in 25 Funktionen zu je 20 Zeilen.

Für Deinen Anwendungsfall hatte ich Dir eine Struktur mit den beiden selbst zu schreibenden Funktionen blinkKanal und fadeKanal vorgeschlagen. Die müssen natürlich geschrieben werden und sie dürfen kein "delay" enthalten. Sonst wird das Programm ja wieder zeitweise blockiert, und kann in der Zeit nichts anderes tun. Ganz oben hatte ich Dir einen Link gepostet auf ein von mir gepostetes Beispielprogramm, das gleichzeitig ein Blinken (an einer LED) und ein Pulsieren (Hin- und Herbewegen eines Servos) realisiert. Das hilft Dir nicht bei der Realisierung Deiner beiden Funktionen zum Blinken und Pulsieren?
1041  International / Deutsch / Re: Kommastelle filtern, eigenartiges Verhalten on: January 17, 2014, 05:37:22 am
Und, nochmal: Mit Ganzzahlarithmetik funktioniert die Formel nicht!
Je größer dein Filterfaktor wird, um so größer wird der Fehler!

Auch mit Integer-Zahlen funktioniert die exponentielle Glättung.

Man hat beim Rechnen mit Integern allerdings keine "Rohdaten" als Gleitkommazahlen mit Werten wie
15,00
24,50
16,25
etc., sondern man hat ganze Zahlen der entsprechenden Genauigkeit wie
1500
2450
1625

Abgesehen davon, dass solche am Ende bereits auf 25/.25 gerundeten Zahlen offenbar gar keine "Rohdaten" sind, sondern bereits "verarbeitete" Daten oder sogar bereits "gerundete Daten". Und man rundet keine gerundeten Daten nochmals. Aber davon abgesehen:

Die exponentielle Glättung mit Integer-Zahlen funktioniert auch. Nur muß dann eben mit einer Stelle Genauigkeit mehr gerechnet werden als man am Ende darstellen möchte. D.h. wenn man die oben beispielhaft genannten "Rohdaten" als Integer-Werte mit exponentieller Glättung verarbeiten wollte, würde man quasi "Milli-Rohdatenwerte" in der exponentiellen Glättung verarbeiten, also:
15000
24500
16250

Es gibt keinen mathematischen Hinderungsgrund, das Verfahren der exponentiellen Glättung nicht auch mit Ganzzahlen (jnt, long, signed oder unsigned je nach Wertebereich der Rohdaten) anzuwenden.

Kaum verzichtet werden kann auf Gleitkommazahlen nur, wenn trigonometrische oder logarithmische Berechnungen anzustellen sind. Ansonsten ist die Wahl, ob mit Gleitkommazahlen oder Ganzzahlen gerechnet wird, ganz eine Entscheidung nach persönlicher Vorliebe, akzeptablem Speicherverbrauch des Programms und der Laufzeit, die die Berechnungen benötigen dürfen.
1042  International / Deutsch / Re: Fehler bei Arduino Mini V05 Programmierung on: January 16, 2014, 02:46:23 pm
ganz egal wie ich TX und RX verbinde, es gibt immer eine Fehlermeldung

ich habe auch eine Programmierung mit dem Uno Board versucht, wie in verschiednen Anleitungen beschrieben, ebenso ohne Erfolg

Ich habe nochmal mit diesem Bild verglichen:
http://arduino.cc/en/uploads/Guide/ArduinoMiniUSBSerialLite.jpg

Offenbar wird hier RX mit TX und umgekehrt verbunden. Das sollte so wie abgebildet dann richtig sein.

Aber warum hast Du den Kondensator für das Auto-Reset nicht verbaut, sondern direkt eine Verkabelung ohne Kondensator gezogen?

Nimm mal die "Ext Reset" Verkabelung weg von Deiner Schaltung und probiere nochmal den manuellen Reset wie oben beschrieben! Dabei muß der Finger wirklich blitzartig (innerhalb ca. 0,5s) vom Reset-Knopf genommen werden, sobald im Fenster "Upload..." angezeigt wird.

Wenn Du den Auto-Reset später anschließt, dann mit dem dafür vorgesehenen Kondensator.
1043  International / Deutsch / Re: HEX File --> EXE ??? on: January 16, 2014, 12:55:19 pm
gibte es eigentlich eine Möglichkeit, ein HEX File in eine EXE "umzuverpacken", damit auch "Dummis" ein späteres Firmwareupdate vornehmen können?

Nein, aber wenn es "Dummies mit Windows" sind, bekommen sie es vielleicht auf die Reihe, das HEX-File mit dem Xloader neu zu flashen:
http://russemotto.com/xloader/

Linux-Anwender sind sowieso Kummer gewohnt, die müssen dann halt mit dem AVRDude flashen.
1044  International / Deutsch / Re: Kommastelle filtern, eigenartiges Verhalten on: January 16, 2014, 09:19:03 am
@ jurs: Ich glaube wir kommen zum Pudels Kern. Dann wäre allerdings die Beschreibung zur Serial.print Ausgabe nicht ganz vollständig. Die habe ich nämlich mehrfach durchgelesen.
Dort steht für Zahlenbasis nur die Auswahl BIN, OCT, DEC und HEX.

// From "c:\program files\arduino\hardware\cores\arduino\print.h"
#define DEC 10
#define HEX 16
#define OCT 8
#define BIN 2

DEC, HEX, OCT, BIN, das sind nur vordefinierte Zahlenwerte.

"Die Beschreibung" ist bei "Open Source Software" eben im Zweifelsfall immer der Quellcode.
 smiley-wink

Warum dann aber aus der x.24 mit mehr Kommastellen x.23999 wird bleibt auch ein Geheimnis. Oder?

Nö, die Rundungsfehler bei der Verwendung von Gleitkommazahlen sind systembedingt. Wenn Du diese entstehenden Rundungsfehler nicht begriffen hast, hast Du Gleitkommazahlen insgesamt noch nicht verstanden.

Aber tröste Dich, das geht selbst Profis so. Der vom wirtschaftlichen Schaden her größte Fall, dass Profis sich mit Gleitkommazahlen verhauen haben, ist im Jahr 1994 aufgedeckt worden, mehr als ein Jahr nach Markteinführung des Pentium-Prozessors, bei dem der Fehler im Hardware-Layout fest eingebrannt war:
http://de.wikipedia.org/wiki/Pentium-FDIV-Bug

Gleitkommazahlen können in der Verwendung tricky sein.
Falls möglich, verzichtet man besser darauf.

Ich kann z.B. eine Temperatur in Zehntelgrad auch gleich ganzzahlig in Zehntelgrad im Programm rechnen. Oder eine Spannung mit drei Nachkommastellen in Millivolt ganzzahlig rechnen. Dann brauche ich im ganzen Programm keine einzige Gleitkommazahl. Und wenn eine Angabe in Millivolt für die "menschengerechte" Anzeige trotzdem wie eine Gleitkommazahl dargestellt werden soll, kann man das mit einfacher Modulo-Arithmetik hinbekommen - wieder ohne Gleitkommarechnung. RAM-speichersparend, blitzschnell und ohne Rundungsfehler.
1045  International / Deutsch / Re: Arduino als Verbrauchsmesser an der Steckdose on: January 16, 2014, 08:18:05 am
Bei deinem Ansatz frag ich mich, wie würde denn so eine Gerätemodifikation aussehen?

Das hängt natürlich vom Gerät ab.

Was z.B. bei einer Lampe oder einem Elektro-Heizlüfter mit loser Anschlußschnur funktionieren würde:
Du schaltest das Gerät am Geräteschalter auf EIN und blockierst diesen Schalter, z.B. durch Umwickeln mit Klebeband. Dann nimmst Du eine schaltbare Steckdosenleiste, steckst in diese die Geräte-Anschlußschnur und das Steckernetzteil ein, und in der Folge wird dann am Schalter der Steckdosenleiste immer beides zusammen ein- und ausgeschaltet, das Gerät (Lampe, Heizlüfter) genauso wie das Steckernetzteil.


1046  International / Deutsch / Re: Arduino als Verbrauchsmesser an der Steckdose on: January 16, 2014, 07:31:54 am
Eventuell habt ihr mir ein paar Tips wie ich mein problem (so ganz theoretisch) smart lösen könnte.

Du kannst Dein mit Netzspannung betriebenes Gerät so modifizieren, dass jedesmal beim Einschalten gleichzeitig ein stabilisiertes 5V-Netzteil mit Strom versorgt wird.

Gerät ist ausgeschaltet ==> Netzteil führt keine Spannung
Gerät ist eingeschaltet ==> Netzteil stellt 5V am Ausgang bereit

Diese 5V kannst Du an einem Arduino-Eingang auswerten.

Wenn ein Wifi-Shield den Kostenrahmen sprengt und die nächste LAN-Steckdose zu weit weg ist, kann man Arduinos auch mit einem normalen Ethernet-Shield und einem Wifi-Pocketrouter netzwerkfähig machen, z.B.:
http://www.amazon.de/TP-Link-TL-WR702N-Nano-Router-%C3%9Cbertragungsgeschwindigkeit-frustfreie/dp/B006PYGWG6
(Betriebsmodus "Client", um das kabelgebundene Ethernet-Shield in ein WLAN zu integrieren)

So ein Gerät hätte dann auch den Vorteil, für andere Zwecke weiter verwendbar zu sein, falls man es nicht so spannend findet, sich über das Internet anzuschauen, ob die Zeitschaltuhr zuhause im Aquarium das Licht gerade an- oder ausgeschaltet hat. Z.B. könnte man einen modernen internetfähigen LCD-Fernseher mit LAN-Buchse oder Festplattenrecorder mit LAN-Buchse damit auch ins WLAN bringen, ohne vom Fernsehhersteller ggf. als Sonderzubehör angebotene WLAN-Sticks kaufen zu müssen.
1047  International / Deutsch / Re: SeriellRead Variablen aus Zeichen und Zahlen on: January 16, 2014, 07:07:38 am
      for (int thisPin = 12; thisPin < 6; thisPin++) {
        pinMode(thisPin, OUTPUT);

Wenn ein Programm nix machen soll, braucht man auch nix hinschreiben.

Deine mit diesen Bedingungen programmierte Schleife wird null mal ausgeführt, weil 12 schon von Anfang an nicht kleiner als 6 ist, also die Bedingung "12<6" schon beim ersten Vergleich fehlschlägt.

Wie wäre es, wenn Du Dich erst einmal mit den Grundlagen der Programmiersprache vertraut machst statt gleich mit einem Kentnisstand von Null einen String-Parser für die serielle Schnittstelle programmieren zu wollen?
1048  International / Deutsch / Re: Datenlogger Temperatur auf Sd Karte on: January 16, 2014, 05:23:04 am
Und wo liegt noch mein Fehler beim Zusammenstellen für das auf SD Karte schreiben?

Ein Arduino UNO hat keinen SD-Kartenschacht auf dem Board.

Welche Hardware hast Du bei Deinem UNO als "SD-Karte" angeschlossen?
1049  International / Deutsch / Re: Kommastelle filtern, eigenartiges Verhalten on: January 16, 2014, 04:50:32 am
Ja, dass ist genau das was ich bebobachtet habe. Gibt man ohne Kommastellen aus stimmt es, gibt man mit Kommastellen an, stimmt es nicht mehr.

Es stimmt alles.

Die Funktion print/println hat verschiedene Aufruf-Interfaces je nach Art der übergebenen Variablen:

Serial.print(float, int) ==> gibt eine Gleitkommazahl aus, int steht für die Anzahl der Nachkommastellen
Serial.print(int, int) ==> gibt eine Ganzzahl aus, das zweite int steht für die Zahlenbasis bei der Ausgabe

Vielleicht sind Dir die folgenden Aufrufe bekannt:
Serial.print(int, BIN) für die Ausgabe als Binärzahl, das ist gleichbedeutend mit
Serial.print(int, 2)
Ausgegeben wird eine Ganzzahl zur Basis 2.

Oder Serial.print(int, HEX) für die Ausgabe als Hexadezimalzahl, gleichbedeutend mit
Serial.print(int, 16)

Die zweite Ganzzahl steht für die Zahlenbasis bei der Konvertierung für die Ausgabe.
Serial.print(int, 4) gibt also einen Zahlenwert zur Basis 4 aus
In der so ausgegebenen Zahl kommen nur die Ziffern 0, 1, 2, und 3 vor.
Das ist einfach eine Ausgabe in einem umgerechneten Zahlensystem.
Und zwar umgerechnet in ein wenig gebräuchliches Zahlensystem.

Für die Ausgabe im Dezimalsystem kannst Du statt Serial.print(int) auch verwenden:
Serial.print(int, 10)
Dann erfolgt die Ausgabe der Ganzzahl dezimal zur Basis 10.
1050  International / Deutsch / Re: Frage zum Programmierstil on: January 16, 2014, 04:36:11 am
Der Code wird ja dadurch nicht einfacher.  smiley-confuse

Bravo, Du hast gerade eines der Grundprinzipien bei der Programmoptimierung gefunden!

digitalRead und digitalWrite sind relativ "langsame" Funktionen, jede braucht so ca. (hab die Zahl nicht im Kopf) 60 bis 70 Taktzyklen zur Ausführung.

Mit digitalWrite(pin4,(digitalRead(pin3)) werden nun jedesmal sowohl digitalRead als auch digitalWrite aufgerufen, obwohl digitalWrite fast nie ausgeführt werden muß, wenn der Pinstatus schon vorher korrekt gesetzt ist. Durch die Vermeidung der meisten Aufrufe von digitalWrite kannst Du durch einen einfachen Vergleich mit einer Variablen (schnell) die meisten Aufrufe von digitalWrite (langsam) vermeiden. Das Programm wird dadurch schneller, aber dadurch wird der Code des Programms größer.

Für die Optimierung von Programmen gilt (in vielen Fällen) entweder:
- kleine Programmgröße, langsame Ausführung
oder
- schnelle Ausführung, große Programmgröße

Das kann man durch den Code beeinflussen, den man schreibt.
Meist ist es so, dass man für besonders schnell arbeitenden compilierten Programmcode auch viel mehr Quellcode schreiben muss.
Pages: 1 ... 68 69 [70] 71 72 ... 203