#WATCHDOG32
Board kit per sperimentazione Watchdog, appositamente progettata per Arduino e Raspberry. 
A differenza dagli altri breakout, WATCHDOG32 ha in più il pin di ENABLE, che consente di tenerlo scollegato durante tutto il periodo di BOOT di Arduino Raspberry, e poi di collegarlo dopo il primo retrigger.
WatchDog32 genera un Reset HW su blocco cpu.

Disponibile in diverse configurazioni:
- Solo PCB + schema + istruzioni +  sketch di test
- Kit di montaggio , componenti + PCB + schema + istruzioni +  sketch di test
- Kit premontato e collaudato 



BOM:
J1 5 PIN 90 GRADI p254
JP2 2 pin jumper p254
R1 NOT INSTALL
R2 10K 1/4 vert
R3 1K 1/4 vert
R4 NOT INSTALL
R5 10K 1/4 vert
R6 330 1/4 vert
R7 NOT INSTALL
R8 330 1/4 vert
C1 100nF ceram
C2 100nF ceram
IC1 ADM1232
IC2 NOT INSTALL
IC3 NOT INSTALL
Q1 NOT INSTALL
Q2 BSS98


sketch di collaudo TEST-FULL (il diagnostic piu avanti)



sketch di collaudo Test_board_watchdog32_ITA_v04.ino







String Versione = "Test_board_watchdog32_ITA_v04";
/*
WATCHDOG32 BREAKOUT - NOTE HARDWARE
Attenzione, ci sono tre versioni di scheda WATCHDOG32 funzionalmente identiche
- 1) monta un transistor NPN Q2 con il lato piatto verso JP2, marcato BC317 (TO92 EBC)
- 2) monta un mosfet Q1 con il lato piatto veso R1/R2 , marcato BSS98 
- 3) monta un transistor PNP Q2 con il lato piatto verso JP2, marcato BC212 (TO92 CEB)

Le versioni 1 e 2 sono identiche
La versione 3 necessita di una inversione di segnale dichiarando la linea seguente
#define TransistorPNP 1

Il led di Arduino si accende quando ENABLE è attivo, ovvero, quando il reset di WATCHDOG32 è connesso al RESET di ARDUINO

Il tempo di sorveglianza del WATCHDOG è impostabile con un ponticello a goccia
data sheet sito analog devices ADM1232 . pdf

- pin2 TD at GND = 150ms
- pin2 TD floating = 600msec
- pin2 TD at VCC = 1200ms
*/
//********************************************************************************************
//Pinout di Arduino
#define Trigger_Wdog 8  //TRIGGER CONNETTERE AL PIN 3 TRG della scheda WATCHDOG32
#define Enable_Wdog 9   //ENABLE  CONNETTERE AL PIN 2 TRG della scheda WATCHDOG32

//pin di servizio, si possono omettere
#define Tracepin3 3
#define Tracepin4 4
#define Tracepin5 5
#define Tracepin6 6

//********************************************************************************************
// Dichiarazione della variabile per tenere traccia dello stato del pin
String inputString = "";      // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete
bool ExitFromMenu = false;    // Used for exit from loop 
char Cestino;                 // 
const long interval = 1000;           // interval at which to blink (milliseconds)



// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;  // will store last time LED was updated



// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

void setup() {

  pinMode(Tracepin3, OUTPUT);
  pinMode(Tracepin4, OUTPUT);
  pinMode(Tracepin5, OUTPUT);
  pinMode(Tracepin6, OUTPUT);

  digitalWrite(Tracepin3, LOW);
  digitalWrite(Tracepin4, LOW);
  digitalWrite(Tracepin5, LOW);
  digitalWrite(Tracepin6, LOW);


   // set the digital pin as output:
   Disabilita_Wdog();
   pinMode(LED_BUILTIN, OUTPUT);

//erial.println( F ("Attivato"));    
   //start serial connection
  Serial.begin(9600); // terminale
  Serial.println();
  Serial.println( F ("|******   SISTEMA RESETTATO  ******|"));
  Serial.println( F (" Sketch build 19092024 "));
  Serial.print( F ("Versione "));Serial.println(Versione);
  Serial.println();


}

//--******************************************************************************************

void(* resetFunc) (void) = 0; //declare reset function at address 0

//-------------------------------------------


void loop() {
  //--------------------------------------
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
  }
  //--------------------------------------
  Menu();
}

//*******************************************************
/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void TypeMenuList(void){
    Serial.println();
    Serial.println( F ("|*******************************************"));
    Serial.println( F ("|             ʘ‿ʘ   Menù   (◡_◡)          "));
      Serial.print( F ("|  Ver. "));Serial.println(Versione);
    Serial.println( F ("|  nessuno sta retriggerando il Watchdog32, "));
    Serial.println( F ("|  il led rosso WDOG32 continua a blinkare  "));
    Serial.println( F ("|*******************************************"));
    Serial.println( F ("  0 Reset"));
    Serial.println( F ("  1 Retriggera Watchdog32 ogni 100msec"));
    Serial.println( F ("  2 Abilita Watchdog32 senza retriggerare"));
    Serial.println( F ("  3 Abilita, triggera 5 secondi e poi ferma il trigger, deve resettare"));
    Serial.println( F ("  4 Abilita, triggera con tempi crescenti, deve resettare"));
    Serial.println( F (" 99 Torna al loop senza reset"));
  
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

void Menu() {

  //resta nel menu fino a che premi 0
  while (!ExitFromMenu) {
    Disabilita_Wdog();
    TypeMenuList();

    //svuoto il buffer
    while (Serial.available()) {
      Cestino = Serial.read();
    }

    Serial.println();
    // qui ciclo attesa e Flash fino a che non c'è un carattere sulla seriale
    while (!Serial.available()) {
      
      //--------------------------------------
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= interval/4) {
        previousMillis = currentMillis;   
      }     
    }

    // arrivato un carattere
    int CmdMenu = Serial.parseInt();
    Serial.print( F ("ricevuto CmdMenu "));Serial.println(CmdMenu);

    switch (CmdMenu){
      //-------------------------------------------------
      case 0:

        Serial.println( F ("reset tra 1 sec"));
        delay(1000);               // wait for a second
        resetFunc();  //call reset

        delay(100);
        Serial.println( F ("Il reset non ha funzionato"));
      break;
      //-------------------------------------------------
      case 1:
        //    Serial.println("  1 Retriggera Watchdog32 ogni 200msec");
        Azione1();
      break;
      //-------------------------------------------------
      case 2:
        //    Serial.println("  2 Abilita Watchdog32 senza retriggerare");
        Azione2();
      break;
      //-------------------------------------------------
      case 3:
        //Serial.println( F ("  3 Abilita, triggera 5 secondi e poi ferma il trigger, deve resettare"));
        Azione3();
      break;
      //-------------------------------------------------
      case 4:
        //    Serial.println( F ("  4 Abilita, triggera con tempi crescenti, deve resettare"));      
        Azione4();
      break;
      //-------------------------------------------------
      case 5:

      break;
       //-------------------------------------------------
      case 99:
        Azione99();
      break;
      //-------------------------------------------------

      default:
        //Serial.println( F ("Unrecognized command, try again!"));
        Serial.println( F ("Comando errato! Riprova"));
    } //Serial.available
  } // ExitFromMenu
} // Menu


//*******************************************************

//--------------------------------------------------------------------------
void Azione1(){
  pinMode(Trigger_Wdog, OUTPUT);
  Serial.println( F ("  il led rosso della scheda Watchdog32 si deve spegnere"));
  Serial.println( F ("  Arduino non si deve resettare"));
  Serial.println( F ("invia Q quando vuoi per uscire"));
  BlinkRetriggerWaitQ(); 
}
//--------------------------------------------------------------------------
void Azione2(){
  Serial.println( F (" il Watchdog32 viene connesso al reset"));
  Serial.println( F (" nessuno triggera il Watchdog32"));
  Serial.println( F (" il led rosso della scheda Watchdog32 continua a blinkare"));
  //Serial.println( F (" tra un secondo dovrebbe resettarsi Arduino"));
  Serial.println( F (" togli il jumper W1 e invia Q"));
  BlinkWaitQ();

  
  delay(1000);
  pinMode(Enable_Wdog, OUTPUT);
  Abilita_Wdog();
  Serial.println( F (" inserisci jumper W1, e in un secondo dovrebbe resettarsi Arduino"));
  delay(2000);
  Serial.println( F (" se non si è resettato invia Q"));
  BlinkWaitQ();
  Serial.println( F (" qualcosa non ha funzionato, invia Q per tornare al menu"));
  BlinkWaitQ();
  Disabilita_Wdog();
 
  
}
//--------------------------------------------------------------------------
void Azione3(){
  pinMode(Trigger_Wdog, OUTPUT);
  Serial.println( F (" il led rosso della scheda Watchdog32 si deve spegnere"));
  Serial.println( F (" inserisci il jumper W1 e poi invia Q per continuare"));
  pinMode(Enable_Wdog, OUTPUT);
  digitalWrite(Tracepin3, HIGH);

  Abilita_Wdog();
  BlinkRetriggerWaitQ();
  digitalWrite(Tracepin5, LOW);

  Serial.println( F (" tra 5 secondi il trigger verrà tolto"));
  digitalWrite(Tracepin6, HIGH);
  for(int i = 1; i<6; i++){
    for(int j = 1; j<10; j++){
      Retrigger_Wdog();
      delay(100);
      Serial.print(".");  
    }
    Serial.print(i);
    
    if(i==5){
      digitalWrite(Tracepin4, HIGH);

      Serial.println();
      Serial.println( F ("Tra un secondo si deve resettare"));
      Serial.println( F ("Se non resetta invia Q per continuare"));
      digitalWrite(Tracepin6, LOW);

    }
  }


  BlinkWaitQ();
  Serial.println( F (" qualcosa non ha funzionato, invia Q per tornare al menu"));
  BlinkWaitQ();
  Disabilita_Wdog();
  digitalWrite(Tracepin3, LOW);
  digitalWrite(Tracepin4, LOW);
  digitalWrite(Tracepin5, LOW);
  digitalWrite(Tracepin6, LOW);  
  
}
//--------------------------------------------------------------------------
void Azione4(){
  pinMode(Trigger_Wdog, OUTPUT);
  Serial.println( F (" il led rosso della scheda Watchdog32 si deve spegnere"));
  Serial.println( F (" inserisci il jumper W1 e poi invia Q per continuare"));
  
  pinMode(Enable_Wdog, OUTPUT);
  for(int i = 1; i<10; i++){
    Retrigger_Wdog();
    delay(100);
  }

  
  Abilita_Wdog();
  BlinkRetriggerWaitQ();
  Serial.println( F (" inizio a triggerare a tempi cresenti,deve resettare"));


  for (int t=250;t<3000;t=t+10){
    Serial.println(t);
    Retrigger_Wdog();
    Abilita_Wdog();

    //accelera
    if (t>750){
      t=t+15;
    }

    //accelera
    if (t>1000){
      t=t+50;
    }
     
    delay(t);
      
    // Utilizza digitalWrite() per impostare lo stato del pin
    if (t>1500){
      Serial.println();
      Serial.println("  XXXXXXXXXXXXXXX errore XXXXXXXXXXXXXXX  ");
      Serial.println(" (◡_◡) il tempo ha superato i 1500msec, e non si è generato un Reset");
      Serial.println(" - verifica se è stato inserito il jumper W1");
      Serial.println(" - la scheda non sta funzionando bene");
      Serial.println(" - verifica saldature e montaggio");
      while(1){
              //attesa infinita di un reset
      }
    }
  }
                    // wait for a second
  BlinkWaitQ();
  Serial.println( F (" qualcosa non ha funzionato, invia Q per tornare al menu"));
  BlinkWaitQ();
  Disabilita_Wdog();
}
//--------------------------------------------------------------------------

//--------------------------------------------------------------------------
void Azione99(){
  Serial.println( F ("E' stata scelta l'azione n. 99"));
  delay(2000);
  Serial.println( F ("torno al loop'"));
  delay(2000);
  ExitFromMenu = true;

  
}
//--------------------------------------------------------------------------



//---------------------------------------------------------
//lampeggia ed attendein loop il tasto Q per continuare
void BlinkWaitQ(void){
  while (1) {
    char inChar = (char)Serial.read();

    if (inChar == 'q'){
      break;
    }

    delay(500);                       // wait for a second

    if (inChar == 'Q'){
      break;
    }
    
    delay(500); 
  
  }
}
//---------------------------------------------------------
void BlinkRetriggerWaitQ(){
  while (1) {
    digitalWrite(Tracepin5, HIGH);

    Retrigger_Wdog();
    char inChar = (char)Serial.read();
    if (inChar == 'q'){
      break;
    }

    delay(200);                       // wait for a second

    Retrigger_Wdog();    
    if (inChar == 'Q'){
      break;
    }
    delay(200); 
  }
  

  
  
}




//*******************************************************


void Retrigger_Wdog(void) {
  digitalWrite(Trigger_Wdog, HIGH);
  delay(40);
  digitalWrite(Trigger_Wdog, LOW);
  delay(5);
}
//---------------------------------------------------------

void Abilita_Wdog(void) {

  Serial.println("WDOG abilitato");
    digitalWrite(LED_BUILTIN, HIGH);    // turn the ARDUINO LED ON by making the PIN voltage HIGH
  #ifdef TransistorPNP
    digitalWrite(Enable_Wdog, LOW);
  #else
    digitalWrite(Enable_Wdog, HIGH);
  #endif    

}
//---------------------------------------------------------

void Disabilita_Wdog(void) {

  Serial.println("WDOG disabilitato");
  digitalWrite(LED_BUILTIN, LOW);    // turn the ARDUINO LED off by making the pin voltage LOW
  #ifdef TransistorPNP
    digitalWrite(Enable_Wdog, HIGH);
  #else
    digitalWrite(Enable_Wdog, LOW);  
  #endif
}
//---------------------------------------------------------