InputHysteresis Arduino Sketch

This sketch is used by Exercise: Input Hysteresis.

Full Source Code

The full code is all in one file InputHysteresis.ino.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// InputHysteresis.ino : Arduino program to demonstrate a simple single-state hysteretic response.

// Copyright (c) 2014-2015, Garth Zeglin.  All rights reserved. Licensed under the terms
// of the BSD 3-clause license as included in LICENSE.

// The baud rate is the number of bits per second transmitted over the serial port.
#define BAUD_RATE 115200

// This assumes a photoresistor is pulling A0 up and a resistor is pulling A0
// down.  When the input is bright, the voltage increases, when dark, the
// voltage decreases.
#define INPUT_PIN A0

// Some version of the Arduino IDE don't correctly define this symbol for an
// Arduino Uno.
#ifndef LED_BUILTIN
#define LED_BUILTIN 13
#endif

/****************************************************************/
// Global variables.

// The state of the system can be captured with only two values, e.g., it is
// represented as a single bit.  The following statement defines two symbolic
// values, one for each possible state.
enum state_t { IS_DARK, IS_LIGHT };

// Declare the state variable as a symbolic value.
enum state_t state = IS_DARK;

// The hysteretic response is defined by using two thresholds.  
const int light_threshold = 700;
const int dark_threshold  = 300;

/****************************************************************/
/**** Standard entry points for Arduino system ******************/
/****************************************************************/

// Standard Arduino initialization function to configure the system.

void setup()
{
  // initialize the Serial port
  Serial.begin( BAUD_RATE );

  // configure our trivial I/O
  pinMode( LED_BUILTIN, OUTPUT );

  // the LED start out ON to match the initial state
  digitalWrite(LED_BUILTIN, HIGH);
}

/****************************************************************/
// Standard Arduino polling function.

void loop()
{
  // Read the ambient light level.
  int input = analogRead(INPUT_PIN);

  if (state == IS_LIGHT) {
    if (input < dark_threshold) {
      Serial.print("Dark observed at input level ");
      Serial.println(input);
      Serial.println("Transitioning to the IS_DARK state.");
      
      state = IS_DARK;
      digitalWrite(LED_BUILTIN, HIGH);
    }

  } else { // state must be IS_DARK
    if (input > light_threshold) {
      Serial.print("Light observed at input level ");
      Serial.println(input);
      Serial.println("Transitioning to the IS_LIGHT state.");
      
      state = IS_LIGHT;
      digitalWrite(LED_BUILTIN, LOW);
    }
  }
}

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