Sketch reseten per code

Hallo zusammen,

ich habe kurz eine Frage. Ist es möglich den Sketch sagen wir nach dem er durchgelaufen ist (LED's etc leuchten) dann nach etwa 3 sekunden ein reset gemacht wird? so wie wenn man auf dem Board den reset taster drückt. Halt einfach nur Codemässig und ohne irgendwas über den reset pin zu verkabeln.

Mit freundlichen Grüssen

Es ist möglich, aber ich sehe keinen Sinn in der Sache. Einen Reset braucht es nur wenn der Controller blockiert ist ( Endlosschleife oder andere Programmierfehler) oder durch elektrisch Störungen.
Wieso glaubst Du denn daß es notwendig ist den Arduino zu resetieren?
Grüße Uwe

Hallo,
würde das nicht auch funktionieren, wenn man über einen Transistor den ResetPin auf Masse zieht?
Oder einen HIGH-Pin mit Reset verbinden und dann auf LOW schalten?
Gruß und Dank
Andreas

SkobyMobil:
Hallo,
würde das nicht auch funktionieren, wenn man über einen Transistor den ResetPin auf Masse zieht?
Oder einen HIGH-Pin mit Reset verbinden und dann auf LOW schalten?
Gruß und Dank
Andreas

Nein, durch sich selbst Resetieren wird kein sicherer Reset ausgelöst. Der Transistor würde sofort nach dem Ansteuern
wieder ausgeschaltet da der Reset alle Pins ausschaltet und dadurch ist die minimale Länge des Resetimpulses nicht garantiert.

Aber lassen wir mal moepi2k antworten wieso er glaubt es zu brauchen da ich glaube daß er etwas falsch interpretiert.

Grüße Uwe

Per Watchdog Timer kann man zu einem zuverlässigen Reset kommen ....

Aber mich würde auch mal interessieren, wozu das gut sein soll.
Denn selbst den Bootloader kann man ohne Reset anspringen.

Ist es möglich den Sketch sagen wir nach dem er durchgelaufen ist (LED's etc leuchten) dann nach etwa 3 sekunden ein reset gemacht wird?

Dafür schreibt mein sein Programm in der Endlosschleife (loop). Du musst halt nur wieder zu deinem Soll Stand zurückkehren.

#define LED  13
#define BUTTON 11
int led_state = 1;

void reset_values(void)
{
  digitalWrite(LED, HIGH);  // LED bei Start AN  
  led_state = 1;
}

void setup(void)
{
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT);

  reset_values();
}


void loop(void)
{
  delay(500);
  led_state = !led_state;
  digitalWrite(LED, led_state);

  reset_values();
}

Bitte stelle deinen Code rein, der sowas zwingend benötigt! Mir wäre jetzt nichts soweit bekannt.

Das mit dem reset kam mir irgendwie grad als einziges in denn sinn. Klar kann man das ja per code in den Soll Wert bringen. Hier mal schnell den Ausschnitt des Sketch's:

void loop() 
{
  int thisVoltage=analogRead(A0);
  if (thisVoltage>ZEROVOLTAGE && lastVoltage<=ZEROVOLTAGE)
  {
    impulsStartzeit=micros();
    impulsAktiv=true;
    myservo.write(45);
    Serial.println(thisVoltage);
  }
  lastVoltage=thisVoltage;
  if (impulsAktiv && micros()-impulsStartzeit>ZUCKDAUER)
  {
    impulsAktiv=false;
    myservo.write(90);
  }
  if (thisVoltage >120) digitalWrite(ledPin0, HIGH);
  else(ledPin1, LOW);
   if (thisVoltage >230) digitalWrite(ledPin1, HIGH);
  else(ledPin1, LOW);
   if (thisVoltage >340) digitalWrite(ledPin2, HIGH);
  else(ledPin2, LOW);
    if (thisVoltage >450) digitalWrite(ledPin3, HIGH);
  else(ledPin3, LOW);
    if (thisVoltage >560) digitalWrite(ledPin4, HIGH);
  else(ledPin4, LOW);
    if "timer expired" millis-Timer >= 15000UL
  then  digitalWrite(ledPin4, LOW);
    if (thisVoltage >670) digitalWrite(ledPin5, HIGH);
  else(ledPin5, LOW);
    if (thisVoltage >780) digitalWrite(ledPin6, HIGH);
  else(ledPin6, LOW);
    if (thisVoltage >900) digitalWrite(ledPin7, HIGH);
  else(ledPin7, LOW);
}

Wenn die Led leuchten, möchte ich das die halt nach sagen wir 4 Sekunden wieder erlieschen, so das sie Bereit sind für die nächste Abfrage.

wollte es eigentlich so machen:

if (thisVoltage >120) digitalWrite(ledPin0, HIGH);
  else(ledPin1, LOW);
delay(4000);
digitalWrite(ledPin0, LOW);

aber so geht nichts mehr.

bin leider noch nicht so erfahren mit der programierung.

Mit freundlichen Grüssen

Du schreibst, dass du Anfänger bist. So sieht der Code auch aus, :*. Lerne das Programmieren und du wirst merken, dass hier kein Reset erforderlich ist.

Des weiteren macht es kein Sinn,

immer if/else zu schreiben, ist nicht komfortabel. Schau dir dazu mal die möglichen Kontrollstrukturen.

Sinnvoll wäre es hier, den Sketch etwas anders aufzubauen.

// Leds den Pin digitalen Pins zuweisen
const int num_leds = 8;
const int led_array[num_leds] = {
  2,3,4,5,6,7,8,9};

void setup() 
{
  // Alle Led Pins als Ausgang bestimmen
  for(int i = 0; i < num_leds; i++) pinmode(led_array[i], OUTPUT);
}

void loop()
{
  static int last_value;
  digitalWrite(last_value, 0);    // Setzt den zuletz gesetzen Ausgang zurueck
  int value = analogRead(A0) / 128;   // value nimmt den Wert von 0 - 7 an.

  digitalWrite(value, 1);             // Setzt den aktuellen Ausgang
  last_value = value;                 //Speichert letzten Wert, 
                                      //damit er im nächsten loop Durchlauf zurückgesetzt wird
}

sschultewolter Du mußt schon mit einem Array arbeiten und nicht mit dem Index-Wert.

// Leds den Pin digitalen Pins zuweisen
const int num_leds = 8;
const int led_array[num_leds] = {
  2,3,4,5,6,7,8,9};

void setup() 
{
  // Alle Led Pins als Ausgang bestimmen
  for(int i = 0; i < num_leds; i++) pinmode(led_array[i], OUTPUT);
}

void loop()
{
  static int last_value;
  digitalWrite(last_value, 0);    // Setzt den zuletz gesetzen Ausgang zurueck
  int value = analogRead(A0) / 128;   // value nimmt den Wert von 0 - 7 an.

  digitalWrite( led_array[value], 1);             // Setzt den aktuellen Ausgang
  last_value = value;                 //Speichert letzten Wert, 
                                      //damit er im nächsten loop Durchlauf zurückgesetzt wird
}

okey, das ist jetzt etwas too much für mein wissen. kannst du mir mal erklären was der code genau macht? zudem erkennt er nicht was pinmode ist.

und wie bestimme ich nun den digitalen wert? so das z.b 100 = ledpin 0 ist, wert 200 ledpin 0+1, wert 300 ledpin 0+1+2 etc?

kann ich den digitalen pin 0 + 1 so benutzen wie die restlichen? den die leuchten bi mir ständig, ich weiss das die für rx tx da sind, aber ich habe mal irgendwo gelesen das man die trotzdem benutzen kann.

Mit freundlichen Grüssen

Hallo Leute,

Ich habe folgendes Projekt (welches auch einen Thread hat): Ich habe ein Glücksrad und ich habe an der Rückseite 3 Sensoren angebracht. Die geben mir jetzt folgende Werte aus. Drehrichtung, Startposition und Umdrehungen pro Minute. Diese Daten sende ich an Twitter. Ich möchte nun das wenn das Rad zum stehen kommt und also eine weile(5-10 sekunden) keine Sensor angesprochen wurde bzw ein bestimmter Sensor nicht angesprochen wurde das der Code evtl resettet wird oder alle Variablen wieder auf null gesetzt werden damit wenn jemand das Glücksrad wieder andreht es alles wieder von neu berechnet und wieder einen Tweet sendet. Wie wäre da die eleganteste Lösung wobei elegant eigentlich egal ist^^

wie kann ich abfragen ob die ein timer die letzten 10 sekunden nicht geändert hat?

const int timeout = 10;       //Zeit in Sekunden
unsigned long previousMillis;

void loop()
{
     if(millis() - previousMillis > timeout * 1000UL)
     {
       previousMillis = millis()

       //Code hier wird alle 10 Sekunden ausgeführt
     }
}

So wie es jetzt da steht wird das alle 10 Sekunden ausgeführt. Wenn du jetzt aber irgendwo Aktivität hast machst du dort einfach "previousMillis = millis()". Dann wird der nächste Timeout um 10 Sekunden nach hinten geschoben.

Einen richtigen Reset kann man über den Watchdog Timer machen. Das sollte aber nicht wirklich nötig sein.