Show Posts
Pages: 1 ... 77 78 [79] 80 81 ... 205
1171  Using Arduino / Programming Questions / Re: Class constructor not working as expected on: September 05, 2013, 08:17:05 am
lcd is just local in your constructor.

Make it a private class member variable instead.
1172  International / Deutsch / Re: Datenlogger on: September 05, 2013, 07:22:02 am
Da man zum Datenloggen nicht nur eine SD Card, sondern üblicherweise auch eine Uhr braucht, gibt es diese Kombination, incl. dem sehr empfehlenswerten Levelshifter für die SD-Card, als Bausatz z.B. von Adafruit auch in D (hier) erhältlich:


Scheint wohl nicht mehr up to date zu sein, da das msd Shield (etwas günstiger) als Ersatz angeboten wird.

In China gibt es natürlich nicht nur SD Card Module, sondern auch Uhrenmodule, so dass man das ganze auch deutlich billiger hinkriegt.
Geschmacks- und Erfahrungssache. (Die Chinesen leben davon, dass Arduino , Adafruit, Watterott, usw. die Informationen gratis zur Verfügung stellen. )


9V Blockbatterien sind übrigens Käse, wenn es auf einigermassen hohe Kapazität ankommt.

Zum Stromsparen wäre eine Selbstbau-Lösung, die die meiste Zeit ziemlich schläft, keinen 5V Linearregler hat, und nur bei Bedarf den 3.3V Spannungsregler einschaltet, deutlich besser. Aber da nutzen dir fertige Shields nicht soviel...

Nick Gammon hat mal sehr lehrreich übers Stromsparen geschrieben : http://gammon.com.au/power
 
1173  International / Deutsch / Re: Ethernet-Client-Anlaufproblem on: September 04, 2013, 03:58:17 pm
Timing geht einfacher per Software als über dickere Kondensatoren.
Da ja offensichtilich das Arduino Reset zu früh ist, einfach einen delay in setup, bevor das Ethernet Shield überhaupt angesprochen wird ???
1174  International / Deutsch / Re: Leonardo NFC Shield 2.0 und Relais on: September 04, 2013, 11:11:41 am
Quote
niemand eine Idee wie man ein Relais schalten kann, mit auf dem NFC Chip vorhandener ID
Eine Idee haben sicher viele:
Code:
- entsprechend dem Beispielsketch die ID lesen
 - Vergleichen ob das die erwartete ist
       Wenn ja: Pin HIGH schalten, Zeit starten
 
 (Mehrere Chips für verschiedene (oder das gleiche Relais) ??? )
 --> am einfachsten den obigen Punkt für andere ID wiederholen.
      Ausgefeiltere Lösungen für mehrere ID möglich.

 - Wenn gestartete Zeit zu alt: Pin LOW schalten.

Aber das ist doch so trivial, da bist du sicher schon selbst draufgekommen.

Wie man mit einem Pin HIGH/LOW ein Relais schaltet, hängt davon ab ob es ein Relais oder ein Relais-Modul mit passender Ansteuer-Elektronik für den Arduino ist.
Ist aber ebenfalls eher trivial ...

Relais schalten und NFC Chip lesen sind zwei verschiedene Sachen, die komplexere ist sicher der NFC Chip.

Daher würde ich nicht das ganze Internet nach unpassenden Lösungen durchsuchen, sondern es schneller selber machen.
1175  International / Deutsch / Re: Brauche Hilfe bei Projekt mit serieller Datenübertragung! - Taschenrechner on: September 04, 2013, 10:23:02 am
Vielleicht nicht Pin 0 und 1 = Hardware Serial ( die einzige beim UNO) ,
damit man leicht im Serial Monitor dokumentieren kann was passiert,
sondern eine SoftSerial Schnittstelle auf zwei beliebigen anderen Pins einrichten.
( Oder beim Mega eine der anderen HardwareSerial Schnittstellen benutzen)
1176  International / Deutsch / Re: Arduino Uhr on: September 03, 2013, 09:29:09 am
Quote
a) nimm print statt write

Vergleiche
Code:
lcd.write(48);
lcd.print(48);

( Beide sollten etwas lesbares ausgeben. )

Und das ist schon jenseits von guntherb's  "damit du was lernst" - Grenze smiley-wink


Falls du auch b) probieren willst, füg noch lcd.write('0'+9); hinten dran.
Code:
0489
[/sub]
1177  International / Deutsch / Re: Programm bleibt unerwartet stehen (Stepper Betrieb) on: September 03, 2013, 07:37:11 am
Das war mein Sample code für loop:
Code:
   if (NotausAbfrage() ) { NotAusFunktion(); return; }

So könnte NotausAbfrage aussehen:

Code:
const byte NotAusPin = 2;
const boolean NotAusActive = LOW;  // sicherer PullDown Widerstand, Betrieb nur wenn HIGH an diesem Pin

boolean NotAus = false;

boolean NotausAbfrage ()
{
  if (digitalRead(NotAusPin) == NotausActive) NotAus = true;
  return NotAus;
}

NotAusFunktion()  kann dann alles in einen sicheren Zustand fahren (eigentlich sollte ausschalten dazu ausreichen)
und "warten", bis die Wiederanfahrfreigabe kommt.
Dann kann NotAus = false gesetzt werden.
(Das schreibst du bitte selber.)

Und wehe dir, du verstehst "warten" als delay oder while - Schleife   smiley-wink   smiley
Das mag zwar hier und jetzt gehen, aber eventuell möchtest du irgendwann andere Funktionen auch im NotAus - Zustand laufen haben.
Die sollten dann nicht hier, sondern in loop() eingebaut werden, wenn sie eigentlich nichts mit dem NotAus an sich zu tun haben.

P.S.  Dass ich NotausAbfrage und  NotausFunktion getrennt habe, ist übrigens nicht zwingend. NotausFunktion könnte auch Teil der NotausAbfrage() sein.
1178  International / Deutsch / Re: Programm bleibt unerwartet stehen (Stepper Betrieb) on: September 03, 2013, 06:49:57 am
Solange du in der ISR bleibst, wird sich Serial.available() nicht ändern. smiley-wink
Wenn du auf zwei Sachen gleichzeitig wartest und nicht weisst, was zuerst kommt, brauchst du 2 ISR und musst in beiden auf beide Bedingungen abfragen, und falls nicht, sofort beenden.

"Wenn..." wohlgemerkt. Ein anderer Ansatz sagt, in so einem Fall liegt wahrscheinlich ein Design-Fehler vor.

- Eine ISR kann nicht auf etwas warten, und braucht also keine while Schleife.
- Mit Steppern und Tastern ( oder Joysticks )  braucht man keine ISR  (  smiley-wink  )

Quote
While Schleife wird erst verlassen, wenn der Notaus deaktiviert und eine 1 eingegeben wurde
Das mag ganz eventuell mal Absicht sein, so wie mein
Code:
void loop() {
if ( Notaus() ) return; // bei Notaus geht sonst nix !

// alles andere nur im Normalbetrieb
// ...
}


... aber doch nicht in einer Interrupt-Routine.


Nachtrag:
Es gibt eine while Scheife, und die hat Arduino in main():

Code:
void main() {
 setup();
 while (1) loop();  // leicht vereinfacht
}

nutze sie sinnvoll. Andere Warteschleifen machen dir alles nur komplizierter smiley-wink
1179  Using Arduino / General Electronics / 74HC4050 as Logic Level Converter ? on: September 03, 2013, 06:30:44 am
Thanks, 1Chicagodave.

I don't run 5  leds, but one ( to test indicate data transfer to the 5110 ), and with a 1k resistor it's rather 3 mA than 20 mA ,
but you are right that there's a difference between a test / prototype and a battery driven device used by other people.

I wonder about that usual datasheet line
Quote
input voltage  ... max Vcc + 0.5 V
which prohibits 5V signals to a 74HC4050 running at Vcc = 3V.  (?)

But as this line is also found in your nxp HEF4050B datasheet where there's explicitly the sentence about
Quote
     Accepts input voltages in excess of the supply voltage
I'm a bit confused.

I think the limit comes from something like this

Vcc ---o--+----
          _
          ^ 
          | 
Vi  ---o--+----
          |
          _
          ^
          |
Vss ---o--+----


inside the IC, which would short Vi to GND or Vcc if outside the allowed limit.

???

Thanks for more info on this issue.
1180  International / Deutsch / Re: Programm bleibt unerwartet stehen (Stepper Betrieb) on: September 03, 2013, 05:53:03 am
Serial und gar  while Schleifen mit Serial haben in Interruptfunktionen nichts zu suchen !
1181  International / Deutsch / Re: Arduino Uhr on: September 02, 2013, 02:58:20 pm
Dein Problem ist einfach: deine 6 Ziffern gehen von 0 bis 9,
was du mit write ausgeben willst sind aber Zeichen von '0' bis '9'.

( Zwischen '0' und 0 ist ein Unterschied )

Abhilfe a) nimm print statt write
 oder   b) nimm write('0' + ss);
 oder   c) da du nur ++ und =0 machst, kannst du auch mit Text rechnen 
Code:
if(s<'6'){
if(ss<='9'){
++ss;
delay(1000);
}else{
ss = '0';
++s; 
Das (c) hat vermutlich noch nie jemand gemacht, das wäre cool smiley-cool


Um eine Zeit ab Start von "00:00:00" hochzählen zu lassen, ist Udos SuperDCF natürlich ziemlich daneben, auch wenn die irgendwann später nebenbei fehlerfreie Sekundenpulse liefert, und andere Echtzeit-Uhren auch nur bedingt brauchbar.

delay() liefert dir unnötige Ungenauigkeit rein, da wäre millis umrechnen schon besser. Ein Arduino mit Quarz wäre hübsch.
Du könntest auch die Netzfrequenz mitzählen, die ist langfristig gesehen erstaunlich genau (jedenfalls im Vergleich zum UNO-Resonator, Udo ist konkurrenzlos).

Aber du willst vermutlich bloss eine lebendige LCD Anzeige, die zeigt wie lange dein Arduino schon läuft, und auf eine Minute am Tag kommt es weniger an als dass das Ding erstmal was anzeigt. 
1182  International / Deutsch / Re: Rechtecksignal funktioniert nicht on: September 02, 2013, 11:04:50 am
Um ein Poti einzulesen, muss man nicht analogRead() schneller machen.

Was man machen könnte, wäre nicht auf ein Ergebnis warten...


Aber 20 µs sollte man besser mit Timern hinkriegen ( direkte Port-Manipulation wäre auch nicht verkehrt, stimmt ).
1183  International / Deutsch / Re: Programm bleibt unerwartet stehen (Stepper Betrieb) on: September 02, 2013, 10:46:15 am
@Serenifly: Dein letztes Beispiel ist evtl. eher verwirrend, denn es heisst dass während Messung läuft, ist Joystick() nicht in Funktion.
Und Startpunktanfahren() ist nach meinem Verständnis auch nicht in einem loop() Durchlauf fertig.
( und wo ist NotAus, das die ganze Diskussion erst losgetreten hat ?! )

"State Maschine" ist ein hochtrabendes Wort, aber klar muss sich eine Funktion wie Messung(), die millionenmal aufgerufen wird, merken was gerade Sache ist, bis sie wieder in einem Zustand ist, wo sie nur noch nach einem neuen Startbefehl fragt.

Evtl kann die oberste Ebene Zustandsführung in loop realisiert werden :
Code:
struct { ... } JoystickState;
enum { STATE_IDLE, STATE_START, STATE_MESSUNG } currentState;
void setup()
{
   currentstate = STATE_IDLE;
   Serial.begin(115200);
}

void loop()
{
   if (NotAusAbfrage() ) { NotAusFunktion(); return; }
   Joystick();  // Abfragen und Zustand global bereitstellen

   if(currentState == STATE_IDLE)
   {
        if ( Startbefehl() )
           currentState = STATE_START;
        else Ausgangsposition();
   }
   if (currentState == STATE_START)
   {
      if ( StartpunktAnfahren() )
        currentState = STATE_MESSUNG;
   }
   if (currentState == STATE_MESSUNG)
   {
      int result = Messung();
      switch (result)
      {
       case 0: break; // läuft noch
       case 1:
           Serial.println("Messung erfolgreich beendet");
           currentState == STATE_IDLE;
           break; 
   }
}


Messung hat genauso wie loop eine eigene Zustandsführung, die aber nach aussen uninteressant ist ( Mal angenommen ).
Kann auch in einer eigenen Datei realisiwert werden

Code:
int Messung()
{
     // liefert 0 solange aktiv, oder eine Ergebniskennung

     const unsigned long Minimalzeit = 3600000;  // frühestens nach 1 Stunde fertig

     static enum {M_SETUP, M_INIT, M_WAIT,M_PHASE1,M_PHASE2} state = M_SETUP;

     static unsigned long starttime;
     static boolean done;
 
     switch (state)
     { 
      case M_SETUP:
          starttime = millis();
          // more quick setup functions
          state = M_INIT;
          break;
       ...
     case M_PHASE2:
         if ( done && millis()-starttime > MinimalZeit)
         state = M_SETUP;    // für die nächste Messung vorbereiten
         return 1;                 // Messung fertig
     }
     return 0;
}
1184  International / Deutsch / Re: Brauche Hilfe bei Projekt mit serieller Datenübertragung! - Taschenrechner on: September 02, 2013, 09:49:43 am
Quote
EIA232/RS232-like interface, with the voltage level +4.2V used for logical 1, and 0V (GND) for logical 0"
- Baudrate 9600 bps
- keine "Parität"
- Byte-Größe: 8 Bits
- Stop-bits: FROM Casio: 2 bits TO Casio: 1 bit

Das war doch schon klar, passt doch so wie es ist, ( 4.2/5.0 = 1 / 0 = 0 ) ist auch was der Arduino unter Seriell versteht.

Dein link zeigt, in Casio Basic gibt es

Send(A) und
Receive(B)

und nach deinem letzten Post im Juni war doch alles klar, oder ?

Die drei Drähte GND, RX, TX kannst du direkt an den Arduino anschliessen. Wenn du dein Casio-Crossover-Kabel nicht zerschneiden willst, ein passender Stecker  ( 2.5mm Stereo ) mit den 3 Leitungen hängt an jedem Stero - Ohrstöpsel, oder du bersorgst dir eine passende Buchse.
Quote
Ist es vielleichteinfacher, wenn man den USB-Port als Schnittstelle zum Arduino benutzen würde?

? Versteh ich evtl. nicht ?
Sicher sollte Serial ( via USB ) zum PC als Test- und Debug-Schnittstelle verwendet werden, beim Uno nimmst du eben SoftSerial auf zwei anderen Pins dazu, um den Arduino mit deinem Casio zu verbinden.

1185  International / Deutsch / Re: Programm bleibt unerwartet stehen (Stepper Betrieb) on: September 02, 2013, 09:11:38 am
Quote
Messung() kann an sich mehrere Stunden dauern

Messung() muss natürlich spätestens nach einigen wenigen Millisekunden zurückkommen.
Normalerweise stellen solche Funktionen nur fest, dass noch nichts neues zu tun ist, und fertig.
Wenn doch, dauert das Einleiten des nächsten Schritts auch keine Zeit, und wieder fertig...

Ein "Programm" und einmal durch loop() hat nichts miteinander zu tun.

Timer sind natürlich auch schön, speziell wenn du keine Zeit hast, dass eine der Funktionen doch mal 1-5 ms dauert.
Alles was nicht ganz so zeitkritisch ist, geht auch in einer vernünftigen loop().
Pages: 1 ... 77 78 [79] 80 81 ... 205