Show Posts
Pages: 1 2 [3] 4 5 ... 190
31  International / Deutsch / Re: [Uno:] Anfängerfrage zu pin13 on: July 13, 2014, 04:53:08 am
wenn ich jetzt eine externe led (z.B. an pin11) ohne Vorwiderstand ansteuren will, wollte ich
pinMode(11, OUTPUT_PULLUP);
verwenden, das versteht er aber nicht. Was mache ich da falsch?

Es gibt kein "OUTPUT_PULLUP".

Und ich weiß nicht, was das werden soll.

LEDs haben Vorwärtsspannungen zwischen circa 2V (rot) und 3V (weiß) und dürfen an einem 5V Output nur mit Vorwiderstand betrieben werden.
32  International / Deutsch / Re: [Uno:] Anfängerfrage zu pin13 on: July 13, 2014, 04:20:43 am
wenn ich nichts mache, ist led13 schwach an, wenn ich den Taster drücke, geht sie aus - das hatte ich in etwa erwartet.
Über Serial.println wird aber IMMER nur 0 angezeigt - wieso?

Dann hast Du einen "alten" UNO mit historischer Schaltung und keinen "UNO R3"!

An den "alten" UNOs ist an Pin-13 eine LED direkt über Vorwiderstand angeschlossen. Diese LED-Widerstandsschaltung zieht den Pegel auf ca. 1.7V und damit auf LOW, wenn Du den internen PullUp-Widerstand aktivierst. Deshalb verwendest Du Pin-13 an diesen alten Boards besser nur als OUTPUT.

Nur an den "R3" UNO-Boards ist Pin-13 ohne Einschränkungen als INPUT oder OUTPUT nutzbar, da hier die angeschlossene LED über einen Operationsverstärker vom Controller entkoppelt ist.
33  International / Deutsch / Re: Treppenstufenbeleuchtung Problem on: July 12, 2014, 06:40:51 am
kannst du mir anhand von deinem Programm zeigen wie ich das aufbauen muss
das jede Stufe langsam einfaded und beim ausgehen langsam ausfaded, habe wie ja weiter oben beschrieben

Das von Dir unter http://pastebin.com/ZgRfn7u1 verlinkte Beispielprogramm, das ich als Grundlage genommen habe, fadet allerdings überhaupt kein bisschen. Das kennt nur zwei Helligkeiten:
Code:
Tlc.set(channel, brightness);
Mit brightness als einer Konstanten, die den Wert 2000 hat.
Und:
Code:
Tlc.set(channel, 0);

Also entweder voll an oder komplett aus. Da fadet gar nichts in Deinem verlinkten Programmbeispiel.
(Abgesehen davon, dass es nicht mal richtig schaltet).

Zum Faden mußt Du erstmal verschiedene Helligkeitsstufen haben. Dazu habe ich Dir mal eine Helligkeitsreihe zwischen 0 und 2000 errechnet, die für das menschliche Auge zu ungefähr gleich stark wahrgenommenen Helligkeitsunterschieden führen:
Code:
// uint16_t brightness = 2000;            //Initialhelligkeit [0-4095]
uint16_t helligkeit[]={
    0,    5,   11,   19,   27,   36,   46,   58,   71,   86,
  103,  123,  145,  170,  198,  230,  267,  308,  355,  408,
  468,  537,  615,  703,  803,  916, 1045, 1191, 1356, 1545,
 1758, 2000};
int hellstufen=sizeof(helligkeit)/sizeof(helligkeit[0]);

Also in Deinem Programm kannst Du als erstes "brightness" auskommentieren und durch diese 32 verschiedenen Helligkeitsstufen ersetzen.

Und zum Faden änderst Du dann die Funktion entsprechend, so dass in sehr schnellem Wechsel die Helligkeit hochgefahren wird. In dieser Schleife ist es so, dass beim Hochfahren schon immer die nächste Treppenstufe mit den ersten 7 Helligkeitswerten angesteuert wird, während die Vorangegangene Treppenstufe noch dabei ist, die 7 letzten Helligkeitsstufen zu erreichen. Die geänderte Funktion wäre dann ungefähr diese:
Code:
void fade (byte schalter) {
  int i,j, startHellstufe;
  int channel[MAX];
  if (schalter==0) for (i=0;i<MAX;i++) channel[i]=i;
  else for (i=MAX-1;i>=0;i--) channel[i]=MAX-i-1;
  for (i=0;i<MAX;i++)
  {
    if (i==0)startHellstufe=0; else startHellstufe=7;
    for (j=startHellstufe;j<hellstufen;j++)
    {
      Tlc.set(channel[i], helligkeit[j]);

      if (i<MAX-1 && j>=hellstufen-7)
      {     
        Tlc.set(channel[i+1], helligkeit[j-(hellstufen-7)]);
      }
      Tlc.update();
      delay(10);     
    }
  }
  delay(timeout1);
  for (i=0;i<MAX;i++)
  {
    Tlc.set(channel[i], 0);
    Tlc.update();
    delay(250);     
  }
}
(wie gesagt: Ungetestet, weil ich Deine Hardware nicht habe.)

Also beim Einschalten der Treppenbeleuchtung sollte es damit in 32 Helligkeitsstufen und damit für das Auge ziemlich sanft hochfaden, beim Ausschalten gibt es keine Änderung und die Lichter gehen klack-klack-klack nacheinander aus.
34  International / Deutsch / Re: Code- bzw. Pin-Kompatibilität Uno vs. Mega on: July 11, 2014, 10:36:55 am
wie kommt das zustande? was passt hier nicht zusammen?

Das kann zustande kommen, wenn eine Library aus Geschwindigkeitsgründen nicht mit langsamen Arduino-Komfortfunktionen (z.B. "digitalRead" oder "digitalWrite") arbeitet, sondern wenn sie direkt auf Register der Hardware zugreift. Andere Hardware, andere Register.

Wenn eine Library so etwas an den Funktionen der Arduino Core-Library vorbei macht und stattdessen direkt auf Hardwareregister zugreift, sind solche Libraries dann nur noch für die Controller verwendbar, an die der Code mit bedingter Compilierung angepaßt wurde.
35  International / Deutsch / Re: Treppenstufenbeleuchtung Problem on: July 11, 2014, 10:31:33 am
So ich habe jetzt jurs seinen angepassten code hochgeladen und es funktioniert  smiley-mr-green

Das kann passieren, wenn ich Code poste.  smiley-wink

es sieht aber alles noch ein bißchen abgehackt aus wenn die einzelnen Stufen angehen aber das ist doch sicherlich nur noch feintuning oder?

Ja. Im Moment werden die LEDs klack, klack, klack im Viertelsekundentakt hart ein- und ausgeschaltet, also die brightness von 0 auf 2000 bzw. von 2000 wieder auf 0 gesetzt.

Wenn Du einen Softstart und sanftes Ausschalten bevorzugst, steht es Dir natürlich frei, diese harten Schaltschritte weiter zu unterteilen. Z.B. in einer Schleife alle 25 Millisekunden die Helligkeit um 200 erhöhen, bis die LED auch nach 250 ms die Endhelligkeit von 2000 erreicht hat. Und beim Ausschalten in umgekehrter Reihenfolge die Helligkeit wieder stückchenweise alle 25 ms etwas zurücksetzt statt auf einen Schlag zurück auf 0. Wobei das Helligkeitsempfinden des Auges aber nicht linear ist, sondern mehr exponentiell, so dass man besser Helligkeitsstufen mit exponentiell eingeteilter brightness schaltet statt linear mit gleichbleibenden brightness-Schritten.
36  International / Deutsch / Re: Treppenstufenbeleuchtung Problem on: July 11, 2014, 03:53:18 am
weiß echt nicht mehr weiter

Du bist mit dem Programm verarscht worden.

Die Programmlogik verfängt sich beim Schalten in einer Endlosschleife und dann ist Ende Gelände.

Das von Dir oben verlinkte Programm ist offenbar weder vom Programmierer noch von Dir auf einwandfreie Funktion geprüft worden.

Das ist eigentlich verwunderlich, denn so wie das Programm mit blockierenden delay-Aufrufen realisiert ist, kann man die Schaltlogik nach einer Auslösung durch einen der beiden Sensoren eigentlich vollkommen transparent von Anfang bis Ende durchlaufen lassen, und nach dem Schaltdurchlauf nehmen die Sensoren wieder die Arbeit auf.

Ich habe zwar weder Deine Hardware noch Deine Software, aber ich habe mal versucht, es Dir von der Programmlogik her so umzustricken, dass keine Endlosschleifen mehr auftreten.

Wenn Du Glück hast, läuft es so auf Anhieb:
Code:
// Treppenlicht
#include "Tlc5940.h"
#include "NewPing.h"

/**************************************************************************/
//Einstellungen ab hier vornehmen
#define MAX 11                         //Anzahl der Stufen [0-15]
#define MAX_DISTANCE   70              // Maximaldistanz in cm, die ausgelesen werden soll; max. 400
#define ULTRASCHALL_1  4               // Pin vom 1. Ultraschall Sensor
#define ULTRASCHALL_2  5               // Pin vom 2. Ultraschall Sensor


uint16_t brightness = 2000;            //Initialhelligkeit [0-4095]
uint32_t timeout1 = 10000;             //Gesamttimeout in Millisekunden

//Globale Initialisierungen
bool sensor[2] = {1,1};                   //Array fuer Sensorwerten

//Deklarationen für Ultraschall

NewPing sonar[2] =
{     
  NewPing(ULTRASCHALL_1, ULTRASCHALL_1, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping.
  NewPing(ULTRASCHALL_2, ULTRASCHALL_2, MAX_DISTANCE)
};


void setup ()
{
  Tlc.init();
}

void loop ()
{
  readSensor();
  if (sensor[0]==1) fade(0);
  else if (sensor[1]==1) fade(1);
}

//Einlesen der Sensorwerte
void readSensor () {

  unsigned int us1 = sonar[0].ping()/US_ROUNDTRIP_CM;
  delay(50);
  unsigned int us2 = sonar[1].ping()/US_ROUNDTRIP_CM;
  delay(50);
 
  if((us1>10) && (us1<MAX_DISTANCE)) sensor[0] = 1;
  else sensor[0] = 0;
 
  if((us2>10) && (us2<MAX_DISTANCE)) sensor[1] = 1;
  else sensor[1] = 0;
}

//Funktion fuer das Einfaden
void fade (byte schalter) {
  int i;
  int channel[MAX];
  if (schalter==0) for (i=0;i<MAX;i++) channel[i]=i;
  else for (i=MAX-1;i>=0;i--) channel[i]=MAX-i-1;
  for (i=0;i<MAX;i++)
  {
    Tlc.set(channel[i], brightness);
    Tlc.update();
    delay(250);     
  }
  delay(timeout1);
  for (i=0;i<MAX;i++)
  {
    Tlc.set(channel[i], 0);
    Tlc.update();
    delay(250);     
  }
}

Wenn nicht, mußt Du selbst die Programmlogik debuggen.
Viel Erfolg!
37  International / Deutsch / Re: Hilfe! Digital Pins haben keine Funktion mehr on: July 10, 2014, 09:35:41 am
Es sind aber auch etliche Pins betroffen, die noch nie beschaltet waren. Oder gibt es auch einen kollektiven Tod?

Die Pins sind nicht vollkommen unabhängig, sondern  ein Pin ist quasi ein achtel eines Portregisters. D.h. ein Portregister repräsentiert bis zu acht Pins.

Pinmapping (ist beim Atmega328 vergleichbar):
http://arduino.cc/en/Hacking/PinMapping168

Wenn z.B. der Pin-13 mit der Board-LED nicht mehr funktioniert, dann kann unter Umständen nicht nur der Pin-13 betroffen sein, sondern auch weitere Pins aus demselben Portregister PORTB. Im PORTB Register sind auf einem UNO-Board die Arduin-Pins 8, 9, 10, 11, 12 und 13 enthalten.

Also in dem Fall, dass Du beispielsweise die Pin-13 LED durch eine Kurzschlussüberlastung himmelst, ist auch eine Wahrscheinlichkeit gegeben, dass weitere Pins zwischen Pin-8 und Pin-12 auf dem Board betroffen sein können.

Aber im Endeffekt weißt Du beim Verschrotten durch Überlastung natürlich nie genau, was passieren wird. Denn wenn Du einen Controller außerhalb seiner Spezifikation betreibst, ist das Verhalten eben "nicht spezifiziert". Und das Verhalten kann dann tatsächlich von "nichts passiert" bis "alles kaputt" reichen.

Hast Du denn einen Kurzschluß gebaut?

Oder kann es vielleicht auch einfach eine Fehlbedienung sein? Zum Beispiel, dass Du Pins als OUTPUT nutzen möchtest, die im setup() gar nicht als OUTPUT gesetzt sind?
38  International / Deutsch / Re: if Bedingung Problem on: July 10, 2014, 09:23:54 am
Irgendwas scheint Dich am klaren Denken zu hindern.

Das hier ist eine unsinnige Bedingung, die nie erfüllt ist, solange relaisMin kleiner als relaisMax ist:
Code:
if (sensorValue <= relaisMin && sensorValue >= realaisMax){
digitalWrite(relais, LOW);
digitalWrite(relais1, LOW);
}

Und zum Schalten mit Hysterese mußt Du den einen Fall dann schalten, wenn der Min-Wert unterschritten wird und den anderen Fall mußt Du schalten, wenn der Max-Wert überschritten wird:

Code:
if (sensorValue < relaisMin){
digitalWrite(relais, LOW);
digitalWrite(relais1, HIGH);
}
else if (sensorValue > relaisMax){
digitalWrite(relais, HIGH);
digitalWrite(relais1, LOW);
}

Dann bleibt der Bereich zwischen Min und Max unbeachtet und der letzte Schaltzustand in diesem Bereich erhalten.
39  International / Deutsch / Re: Hilfe! Digital Pins haben keine Funktion mehr on: July 10, 2014, 09:14:23 am
Irgend etwas ist mit meinem Arduino Mega 2560 geschehen, das die digitalen Pins außer Gefecht gesetzt hat (sowohl für digitalWrite oder digitalRead).
Nicht mal mehr der Blink-Sketch bringt eine Reaktion der onboard-Pin13-LED.
SCA/SCL auf 20 und 21 funktionieren, eine RTC kann abgefragt werden.

Durch Überlastung und Kurzschluss kannst Du an den Atmega-Controllern durchaus einzelne Pins himmeln, ohne dabei gleich den ganzen Controller zu schrotten. Dann funktionieren eben nur die defekten Pins nicht mehr, aber andere durchaus noch.
40  International / Deutsch / Re: String vergleichen on: July 10, 2014, 08:30:06 am
Also, warum läßt sich das

if (sZeit == GZeit)

nicht vergleichen?

Natürlich lassen sich auch zwei Pointer vergleichen.
Zwei Pointer sind gleich, wenn sie gleich sind.
In diesem Fall verweisen die Pointer auf zwei verschiedene char-Arrays, also sind die Pointer selbstverständlich verschieden.
So what?

Über die Inhalte, auf die diese Pointer verweisen, wird damit allerdings nichts gesagt.
Inhalte in char-Arrays, auf die mit einem Pointer verwiesen wird, werden mit der Funktion strcmp() verglichen:
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga46f3cbd2de457c0fb340a1f379fc33ba
41  International / Deutsch / Re: Temperatur-Messung mit DS18S20 - ANFÄNGER-PROBLEM on: July 10, 2014, 06:55:15 am
"Dallas_Temperature" bekomme ich bei der Kompilierungs-Prüfung eine Reihe von Fehlern im Sketch angezeigt.

Bevor Du Libraries "benutzen" kannst, mußt Du diese "installiert" haben, was unter Arduino darin besteht, dass Du die Library-Dateien an die passende Stelle auf der Festplatte kopierst und dann die Arduino-Software neu startest.

http://arduino.cc/de/Guide/Libraries

Die korrekte Installation einer Library testest Du am besten anhand eines der zur Library beigefügten Programmierbeispiele, die Du jeweils findest unter:
Datei - Beispiele - [Name der Library]
42  International / Deutsch / Re: Arduino Pulsgenerator on: July 10, 2014, 05:12:32 am
Gäbe es auch die Möglichkeit die Werte der Eingabe Zwischenzuspeichern und danach schneller abzuarbeiten?

Natürlich kannst Du auch Werte zwischenspeichern und später abarbeiten.
Jedes Arduino-Board verfügt über RAM-Speicher.

Außerdem könntest Du über Serial auch bereits bei derselben Baudrate die vierfache Menge an Daten übertragen wie Du es machst. Deinem Code entnehme nich, dass Du nur drei verschiedene Pulszustände übertragen möchtest, 0,1 oder 2, und so etwas läßt sich bereits in nur 2 Bits binär codieren:
Code:
00 = 0
01 = 1
10 = 2
11 = 3 = invalid
Über Serial wird als kleinste Einheit aber immer 1 Byte = 8 Bits übertragen. D.h. wenn Du die Pulsfolge 0112 übertragen möchtest, könntest Du diese vier Pulse binär in einem einzigen Byte übertragen:
Code:
0 1 1 2  (Pulse-ID)
00010110 (Binär codiert in einem Byte)

So kannst Du in einem einzigen Byte zwischen 1 und 4 Impulsen übertragen, indem Du in einem Byte mehr als nur eine einzelne Impulsinformation überträgst.

Aber Du kannst übertragene Bytes natürlich auch im RAM zwischenpuffern und später verarbeiten. Die Art des benötigten Speichers nennt sich FIFO-Puffer (FIFO = First IN First OUT) und steht dafür, dass später die Informationen als erstes aus dem Puffer rausgezogen werden, die auch als erstes hineingepackt wurden.
43  International / Deutsch / Re: Arduino Pulsgenerator on: July 10, 2014, 04:24:37 am
Ziel ist es Pulse mit 1 MHz via Serial Monitor zu steuern.

Nun habe ich Folgendes Problem. Ich kann eine Abfolge von Zeichen in den Serial Monitor eingeben und entsprechende Impulse erzeugen, allerdings entstehen Pausen zwischen den Pulsen  welche viel länger sind als die eigentlichen Impulse.

Bei 115200 Baud kannst Du maximal 11520 Zeichen pro Sekunde über die serielle Schnittstelle senden. Der zeitliche Mindestabstand zwischen zwei gesendeten (und auch empfangenen) Zeichen beträgt also:
1/11520 s = ca. 0,0000868 s = ca. 86,8 µs,

So wie Du es mit den über Serial gesendeten Zeichen @115200 Baud machst, kann also ein nachfolgender Impuls erst ca. knappe 90µs nach dem vorhergehenden erzeugt werden, weil der zeitliche Abstand zwischen zwei Zeichen @115200 Baud dieser Zeit entspricht.

Du mußt auf zeitlich kürzere Zeitabstände kommen, die Du verarbeiten möchtest?

Wenn es nur um die Zeit zwischen zwei Zeichen auf Serial geht, könntest Du mit Baudraten von 250000 oder 500000 noch etwas herausholen. Arduino-Boards (auch die mit 8-Bit Controller) unterstützen Baudraden bis 500000 Baud ebenso wie gängige PCs. Allerdings unterstützt der "Serielle Monitor" der Arduino-Software nur max. 115200, aber das ist nicht die maximal mögliche Baudrate.
44  International / Deutsch / Re: Brauche Hilfe bei einer Stoppuhr on: July 09, 2014, 02:45:21 pm
ich bin gerade dabei, eine Stoppuhr zu programmieren.

Mit einem Taster an Pin 50 zum Starten und einem Taster an Pin 51 zum stoppen.

Bei jeder Betätigung des Tasters an Pin 50 soll eine eigene Zeit laufen, die dann bei einem Druck an dem Taster bei Pin 51 wieder stoppt.

Das klappt aktuell leider nur zum Teil.

Ich kann zweimal den Taster an Pin 50 betätigen und 2 mal den Taster an Pin 51 und habe dann meine 2 Zeiten.

Drücke ich aber zweimal Pin 50, dann einmal Pin 51 und dann wieder Pin 50, um eine dritte Zeit zu starten, macht er nichts mehr, auch nicht beim mehrmaligen Betätigen vom Taster an Pin 51.

Für Programme, die auf der einen Seite Benutzereingaben entgegennehmen und auf der anderen Seite Daten ausgeben sollen, bietet sich eine Programmlogik nach dem EVA-Prinzip an:
- Eingabe (Druckstatus der Buttons ermitteln)
- Verarbeitung (Eingabedaten und sonstige Daten nach Bedarf verarbeiten)
- Ausgabe (Daten auf LCD ausgeben)

Und diese drei Schritte in der loop-Funktion immer reihum ausführen.

Dazu müßtest Du Dir eine grundlegende Datenstruktur aus Variablen überlegen, die von den drei Funktionen verarbeitet werden sollen.

Insbesondere dann, wenn Du keine klare Zuordnung von Buttons und Funktionen hast, sondern so wie bei Dir der eine Button wahlweise Timer1 oder Timer2 starten kann, und der andere Button mal Timer2 und mal Timer1 wieder anhalten soll, es also Funktions-Doppelbelegungen für Bedienelemente gibt, kommst Du ohne eine saubere und klare Struktur Deines Programms wohl kaum klar.
45  International / Deutsch / Re: serial.print etc: zurück zum Zeilenanfang? eine Zeile nach oben? on: July 08, 2014, 12:44:38 pm
Gibt es eine Möglichkeit das zu beheben?

Ausgabe von Textkonstanten mit F-Makro.
Pages: 1 2 [3] 4 5 ... 190