Show Posts
Pages: 1 ... 68 69 [70] 71 72 ... 216
1036  International / Deutsch / Re: Bei LCD 2004 Farbe der Hintergrundbeleuchtung austauschen? on: March 16, 2014, 06:02:41 am
Ich habe jetzt ein blau/weißes Display für 4,50Euro bestellt und werde das Problem mit roter Filterfolie lösen.

Ich vermute eher, Du wirst 4,50 EUR Lehrgeld bezahlen.
1037  International / Deutsch / Re: Thermometer mit 4x LED-Siebensegmentanzeigen, SAA1064 u. LM35 on: March 15, 2014, 03:22:18 pm
youtube Videos gibts davon genug, nur keinen fertigen Code.

Echt nicht? Mein Google findet auch für den SAA1064 problemlos Arduino-Code:
http://tronixstuff.com/2011/07/21/tutorial-arduino-and-the-nxp-saa1064-4-digit-led-display-driver/

So mit festem Schaltpunkt, wie ich es jetzt habe, steigt die Temparatur nach dem Abschalten bei 40°C noch auf 41,5°C an, da die Heizwiderstände noch Wärme abgeben. Dieses Überschwingen ist aber nicht gewünscht  smiley-confuse
Kann mir da jemand weiterhelfen?

Heizleistung stark überdimensioniert?
Dann vielleicht eine Heizung mit etwas weniger Leistung verwenden!

Am billigsten wäre die Umrüstung per Software auf eine niedrigere Heizleistung.

Die billigste Lösung bei einer zu groß dimensionierten Heizleistung ist bei einer Zweipunkt-Regelung und Schalten mit SSR Relais: Taktung!

Für eine Taktung der Heizleistung habe ich hier mal einen kleinen Sketch für Heizungen mit SSR-Schaltung geschrieben:
http://forum.arduino.cc/index.php?topic=180102.msg1335839#msg1335839
Der Funktion wird einfach die gewünschte Heizleistung in Prozent als Parameter übergeben, das SSR Relais schaltet die Taktung dann selbständig. Um keine Schaltzeiten unter 1,0 Sekunden entstehen zu lassen ist die Regelung nur zwischen 10% und 90% Heizleistung aufs Prozent genau. Unterhalb 10% Heizanforderung wird die Heizung ausgeschaltet und über 90% Heizanforderung wird die Heizung voll eingeschaltet.

Wenn Du nun eine halb so starke Heizung haben möchtest, rufst Du (in einer "nicht blockierenden loop") auf:
heizen(50);
Und dann schaltet die Heizung immer 5 Sekunden ein, und 5 Sekunden aus.
Ergebnis: 50% Heizleistung innerhalb eines 10-Sekunden Intervalls.

Um ein Überschießen der Temperatur bei Deiner Zweipunktregelung zu vermeiden, könnte man sich auch geeignete Heizstufen überlegen mit Prozentwerten Heizleistung unter 100%, und dann eine Zwei- oder Dreipunktregelung machen. Z.B. für eine Solltemperatur von 40°C z.B. so heizen:
Isttemperatur <32°C ==> "heizen(100);"
Isttemperatur >=32 und <36°C==> "heizen(75);"
Isttemperatur >=36°C <39,5°C ==> "heizen(50);"
Isttemperatur zwischen 39,5 und 40 ==> zuletzt gesetzte Heizleistung beibehalten (Hysterese!)
Isttemperatur >= 40°C ==> "heizen(0)"

So dass im Endeffekt mit weniger Heizleistung geheizt wird, wenn man bereits nahe an der Zieltemperatur dran ist.
Bei dieser Art Regelung müßte aber die niedrigste geschaltete Heizleistung (z.B. 50%) immer noch ausreichend hoch sein, um die Zieltemperatur zu erreichen, sonst kann es Dir passieren, dass die Temperatur dauerhaft zu niedrig bleibt.
1038  International / Deutsch / Re: Bei LCD 2004 Farbe der Hintergrundbeleuchtung austauschen? on: March 15, 2014, 02:07:05 pm
Wäre es möglich bei einem LCD die Beleuchtung auszutauschen. Also die blaue, weiße oder grüne LED gegen eine rote zu tauschen?

Nein, nicht so einfach.

Eine Backlight-Unit besteht aus mehr Bauteilen als nur aus einer Lichtquelle.
Unter anderem aus einer hochspeziellen Diffusor-Folie, die das Hintergrundlicht absolut gleichmäßig über den Hintergrund verteilt.  Wo willst Du denn diese hochspezielle Diffusorfolie in der benötigten Farbe herbekommen?
1039  International / Deutsch / Re: Wie ° Zeichen auf Display darstellen? on: March 15, 2014, 01:23:09 pm
lcd.print("°") und lcd.print(0xDF) funktionieren nicht, letzteres ist das Hardwarezeichen vom DOGM internen Zeichensatz.

Ach?

Hast Du schon mal lcd.write(0xDF) probiert?
1040  International / Deutsch / Re: shiftout Problem on: March 10, 2014, 04:17:48 pm
pinMode(button1, OUTPUT);

Bist Du sicher, dass "button1" nicht ein INPUT sein soll?
Z.B. ein manuell bedienbarer "Startknopf"?
1041  International / Deutsch / Re: Grundsatzfrage "gleichzeitige Anweisungen" on: March 10, 2014, 11:56:32 am
bitte mit ein paar beispiel zeilen

http://forum.arduino.cc/index.php?topic=177359.msg1315698#msg1315698
1042  International / Deutsch / Re: Komisches Verhalten von Putty on: March 09, 2014, 05:07:06 pm
Ich habe mir eine Session angelegt die ich mit einem Doppelklick starte.

Und die gezeigten Einstellungen sind die Einstellungen, wenn man nur EINMAL den Session-Eintrag anklickst und danach auf "Load"?
1043  International / Deutsch / Re: Komisches Verhalten von Putty on: March 09, 2014, 04:42:09 pm
Von der Standardeinstellungen habe ich lediglich den Verbindungstyp auf Seriell umgestellt und COM5 sowie Baud 115200 ausgewählt

Du arbeitest mit einer falschen Baudrate.

Beschreibe mal ganz genau, wie Du Deine Arduino-Session mit Putty startest!

Also ob Du z.B. eine "Saved Session" doppelklickst oder ob Du gar keine "Saved Session" auswähltst oder wie Du das genau beim Starten der Putty-Session machst.

Hast Du das auf dem Arduino laufende Programm über den Arduino-Bootloader hochgeladen oder mit Programmer? Wenn Upload mit Programmer, dann wäre es mit manchen Konfigurationen auch möglich, auf einen Controller ein Programm hochzuladen, das für eine falsche Baudrate kompiliert wurde, z.B. ein für 16 MHz Systemtakt programmiertes Programm auf einen Controller, der seine Fuses für 8 MHz internen Takt gesetzt hat. Das kannst Du ausschließen?
1044  International / Deutsch / Re: Eine if Schleife nur alle 5 Minuten durchlaufen on: March 09, 2014, 03:00:59 pm
ich möchte die unten gezeigte Schleife nur alle 5 Minuten 1X abarbeiten. Währen der restlichen Zeit sollte der Sketch aber auch abgearbeitet werden ein Delay scheidet als aus.
Weiß jemand eine Funktion mit der ich das bewerkstellen kann?

Mit millis() aus dem Arduino-Takt, ohne Echtzeit-Uhr?

Code:
unsigned long SecondsRunning()
// Liefert die Sekunden seit Programmstart zurück
// Diese Funktion muss in der loop laufend aufgerufen werden
{ // Sekundenzähler
  static unsigned long secondsCounted=0;
  static unsigned long prevMillis=0;
  while( millis() - prevMillis >= 1000){     
    secondsCounted++;
    prevMillis += 1000;
  }
  return secondsCounted;
}


void setup() {
  Serial.begin(9600);
}

unsigned long lastSeconds, thisSeconds;
int intervall=300; // Intervalldauer in Sekunden
void loop() {
  thisSeconds=SecondsRunning();
  if (thisSeconds>=lastSeconds+intervall)
  {
    lastSeconds+=intervall;
    Serial.print(intervall);Serial.println(" Sekunden sind um!");
  } 
}
1045  International / Deutsch / Re: PWM Zeitversätzt nach Start ansprechen on: March 09, 2014, 05:09:47 am
irgend wann ist das wahrscheinlich auch eine Zeitfrage, wenn ich 10 bis 20 oder mehr Aktionen definiere, … oder ist das Bord so schnell das ich mir da keine Gedanken drum machen muss?

momentan gehe ich mal von mehr als 4 Aktionen pro Hardware aus, bei jedem Schuss, welchen Denkansatz würde es denn noch geben?

OK, also es können zwischen "eins" und "relativ viele" Schaltvorgänge an einem einzelnen Pin auftreten und Du hast zugleich die Befürchtung, dass die Verarbeitung immer langsamer und unexakter wird, je mehr Schaltvorgänge definiert werden.

In dem Fall würde ich vorschlagen, dass Du die Deklaration der Hardware-Schaltvorgänge so läßt wie sie sind, also einfach mehrere Zeilen mit Schaltzeiten für jeden Pin, aber das Programm baut sich intern ein "Schaltzeiten-Array" auf, von der Größe "2*schritte" und in dem Array steht dann für jeden Schaltvorgang ein Eintrag für jeden Ein- und Ausschaltvorgang:
- Pin, Zeit des Schaltvorgangs, ein oder aus
Dann sortiert man das Schaltzeiten-Array nach Schaltzeit

Und die Schaltlogik geht dann nicht mehr die Hardwareeinträge durch, sondern die Einträge im Schaltzeiten-Array.  Da das Array sortiert ist, ist die Schaltgenauigkeit dann auch vollkommen unabhängig von der Anzahl der Schaltvorgänge: Man braucht ja nicht mehr alle Einträge durchgehen, um den nächsten Schaltvorgang festzustellen, sondern man braucht immer nur auf den jeweils nächsten Eintrag zu schauen und ob die Schaltzeit erreicht ist. Wenn ja, schalten. Dann auf den nächsten Schaltvorgang warten. Bis alle 2*schritte Schaltvorgänge ausgeführt wurden.
1046  International / Deutsch / Re: PWM Zeitversätzt nach Start ansprechen on: March 09, 2014, 04:14:38 am
da kann ich nicht ganz folgen ;-(

Wenn es jetzt nur um ein zweimaliges (oder max. dreimaliges) Schalten desselben Pins geht, wäre es vielleicht am einfachsten, für jeden Pin zwei Schaltzeiten zu definieren:
Code:
struct hardware_t{int pin;long vorlaufzeit; long dauer;long vorlaufzeit2; long dauer2;};
Nicht benötigte Schaltungen in der Hardwaredefinition auf null setzen. Und dann die if-Schaltlogik entsprechend ändern, dass eingeschaltet wird, wenn sich die Zeit innerhalb der ersten ODER der zweiten Schaltzeit befindet.

Falls Du aber "ganz viele" weitere Schaltungen für dieselbe Hardware benötigst, sollte man sich vielleicht eine andere Erweiterung der Schaltlogik überlegen.

Also als erstes mal kräftig überlegen: Was wird benötigt? Nur ein zweimaliges Schalten desselben Pins? Oder vielleicht doch ganz viele Schaltungen desselben Pins?
1047  International / Deutsch / Re: Dallas bremst loop stark aus ? on: March 07, 2014, 12:47:15 pm
Das Programm reagiert dennoch gefühlt verzögert länger als die eine Sekunde auf Tastendruck.

Ja. Aber nur bei falscher Ansteuerung und wenn zwischen "Anforderung einer Messung" und "Abholen des Messwertes" nicht die erforderliche Messzeit liegt. Dann macht die Dallas-Library eine Zwangspause im Sketch und würgt Deine Loop gnadenlos runter.

Die einfachste Logik, falls Du nicht mehr als 30 Messungen pro Minute brauchst, geht so: Immer wenn die Sekunde wechselt, machst Du EINE Aktion:
- bei Anbruch einer geraden Sekunde: Messung anfordern
- bei Anbruch einer ungeraden Sekunde: Temperatur abholen
u.s.w.
Dann liegt selbst in der höchsten Messauflösung mindestens die notwendige Messzeit dazwischen, und die Temperatur kann stets ohne eine zusätzliche Zwangspause abgeholt werden.
1048  International / Deutsch / Re: Wie geht ihr ans Code schreiben ran? on: March 06, 2014, 02:40:37 pm
Wie fangt ihr mit sowas an, erstellt ihr erst auf dem Papier einen kleinen Code oder fangt ihr gleich am Rechner an oder macht ihr erst ein Flussdiagramm?  Wie gehts bei euch los?

Also ich setze mich (üblicherweise) gleich an den Rechner und schreibe nichts auf Papier vor.
Das erste am Programm ist (fast immer) ein "Serial.begin(9600)" in die setup-Funktion zu schreiben, für serielle Debug-Ausgaben.

Und dann versuche ich, das Programm ganz klassisch nach dem EVA-Prinzip in drei Teile aufzuteilen:
E - Eingabe
V - Verarbeitung
A - Ausgabe

Grobes Grundgerüst für ein Programm, bei dem ständig neue Daten eingehen und verarbeitet werden:
Code:
void setup() {               
  Serial.begin(9600);
  Serial.println("Start");
}

void eingabe() {};
void verarbeitung() {};
void ausgabe() {};


void loop() {
  eingabe();
  verarbeitung();
  ausgabe();
}

Oder für ein Programm, das nur arbeiten soll, wenn neue Daten eingegeben werden:
Code:
void setup() {               
  Serial.begin(9600);
  Serial.println("Start");
}

boolean eingabe() {return true;};
void verarbeitung() {};
void ausgabe() {};


void loop() {
  if (eingabe())
  {
    verarbeitung();
    ausgabe();
  }
}

Zum Bereich "Eingabe" gehört, sich eine für das Programm angemessene Datenstruktur zu überlegen für die Daten, mit denen dann gearbeitet werden soll. Im Bereich "Eingabe" werden die Daten dann initialisiert oder eingelesen oder bei interaktiven Programmen die Bedienelemente (Buttons, Drehgeber, Potis, Sensoren) abgefragt.

Zum Bereich "Verarbeitung" gehört es dann, die in die Datenstruktur eingelesenen Werte zu verarbeiten, Berechnungen durchzuführen und die Ausgabe vorzubereiten, z.B. die auszugebenden Daten in eine vorbereitete Ausgabedatenstruktur zu übergeben.

Und zum Bereich "Ausgabe" gehört es dann schließlich, die Daten auszugeben, auf eine serielle Schnittstelle, auf ein LCD-Display, LEDs ein- und auszuschalten oder blinken zu lassen, eine Datei auf SD-Karte zu erzeugen, die Daten per Funk zu versenden oder sie in eine HTML-Webseite zu leiten.

Die Funktionen heißen zwar nicht unbedingt Eingabe(), Verarbeitung() und Ausgabe(), aber so ist die modulare Aufteilung. Und wegen der Trennung in diese verschiedenen Teilaufgaben ist es auch relativ einfach möglich, die Arbeitsweise eines Moduls jederzeit auszutauschen.

Durch die modulare Aufteilung ist es möglich, dass eine Eingabefunktion, die später vielleicht seine Daten von einem Temperatursensor erhält,  dann ganz im Anfang nur so aussieht:
Code:
long readTemperature() // Temperatur in Zehntelgrad auslesen
{
   return 213;
}
Oder eine Funktion, die die Daten am Ende auf einem LCD ausgeben soll so:
Code:
long showTemperature(long temp) // Ausgabe auf LCD
// Parameter temp in Zehntelgrad
{
   Serial.print(temp/10);Serial.print(".");Serial.println(temp%10);
}
So dass vielleicht weder die Eingabe gleich zu Anfang so funktioniert wie es am Ende sein soll, noch die Ausgabe, sondern dass diese Funktionen am Anfang mehr oder weniger nur "simuliert" werden. Von einem ganz simpel hingeschriebenen Programmgerüst. Und dann im Rahmen einer "schrittweisen Verfeinerung" des Programms tatsächlich erst schrittweise  entwickelt wird, mit allem drum und dran.
1049  International / Deutsch / Re: Interruptfunktion zählt immer durch on: March 06, 2014, 12:19:59 pm
Knopf mit 47kOhm zwischen 5V und Pin 3.

Der Knopf ist ein handelsüblicher Knopf, den man runter drückt, dann gibts Kontakt - lässt man los, ist der Kontakt weg.

Das hört sich irgendwie falsch verschaltet an.
Am besten schaust Du Dir nochmal an, wie ein PullDown- oder PullUp-Widerstand mit einem Taster beschaltet wird.

Zum Beispiel hier (dort PullDown):
http://arduino.cc/en/Tutorial/DigitalReadSerial

Oder Du läßt den externen Widerstand weg und aktivierst den internen PullUp am Taster-Pin.

Mit der Auswertung von mechanischen und prellenden Buttons per Interrupt verkackst Du übrigens Dein Programm. Das kann man zwar machen, ist aber eher nichts, was irgendwie sinnvoll ist.
1050  International / Deutsch / Re: Unterbechnung einer Lichtschranke möglichst schnell erfassen on: March 06, 2014, 07:47:28 am
Die LS ist aber (wie weiter unten auch schon steht) gegeben und da es sich um ein LS-System handelt, welches speziell für die Erfassung von hohen Geschwindigkeiten konzipiert wurde, wird die schon ok sein und v.a. wird sie auch nicht mehr verändert.

Amen.

Mir geht es wie in der Frage formulier wurde einzig darum, wie mit dem Arduino die zweite der beiden Zeitkomponenten möglichst gering gehalten werden kann.
Und wie geschrieben, bin ich nicht nur daran interessiert zu erfahren, welche Vorgehensweise bei der Programmierung optimal ist sondern auch, warum sie es ist (Taktzyklen, etc.)

Die gesamte Arduino-Software ist nicht auf optimal schnelle Verarbeitung und minimale Latenzzeiten ausgelegt, sondern auf einfache Programmierung durch Hobbyisten.

Wenn Du zur Programmierung trotzdem die Arduino-Software verwenden möchtest, bekommst Du die schnellste und latenzärmste Verarbeitung sicher hin mit
- Arduino-Software nicht aktivieren, also nicht eine setup() und loop() programmieren, sondern eine main()
- Verarbeitung in einer Schleife ("while(true)"), aber NICHT mit digitalRead, sondern mit direkter Port-Programmierung

Begründung:
Das Arduino-Setup im Sketch aktiviert im Hintergrund Interrupts für timer0, um damit die micros() und millis() Zeitzähler zu bedienen. Jeder Interrupt benötigt einen Overhead von ca. 60 Taktzyklen und wenn ein timer0 Interrupt gerade dann auftreten würde, wenn Dein Ereignis eintritt, würdest Du mindestens diese 60 Takte Latenz drinhaben, bevor Dein Code zum Zuge kommt. Deshalb nicht das Arduino-Setup verwenden.

Auch bei allen anderen Interrupts, also den von Dir selbstgeschriebenen, tritt eine Latenz von ca. 60 Taktzyklen auf. Eine "enge loop" kann dagegen viel schneller laufen als nur einmal in 60 Mikrosekunden. Deshalb keinen Interrupt programmieren.

Auch bei digitalRead, einer Komfortfunktion der Arduino-Software, beträgt der Overhead ca. 65 Taktzyklen oder so. Eine Schleife kann nie schneller laufen als das, was in der Schleife insgesamt ausgeführt wird. Einen Eingang kann man mit direkter Portprogrammierung in 2 statt 65 Taktzyklen abfragen, also deshalb lieber direkt die Ports programmieren als digitalRead verwenden.

Wie schnell das am Ende tatsächlich wird, müßtest Du Dir mal auf einem 2-Kanal Oszilloskop ansehen: Auf den einen Kanal (Lichtschranke) triggern und auf dem zweiten Kanal (Arduino-Ausgang) nachsehen, wieviel später sich das Signal ändert.
Pages: 1 ... 68 69 [70] 71 72 ... 216