Tämä ei ole aivan vielä lopullinen mutta tästä näkee ohjelman, jolla tietokonetta ohjataan, jotta myssy toimisi oikein. Tämä on siis ohje tietokoneelle, miten pitää toimia ja koska valoja sytytellään ja sammutellaan.

/*
** Valoon reagoiva "NaamaMyssy"
**
**
*/
 

/* Valot */

const int tupsuValo = A5;
const int vihainenValo = A4;
const int iloinenValo = 11;

/* Kytkimet */

const int tupsuKytkin = 2;
const int vihainenKytkin = 3;
const int iloinenKytkin = 9;

/* Sensori */

const int valoSensori = A2;

/* Merkkivalo piirikortilla */

const int ledPin = 13;    // LED is connected to digital pin 13

/* Tilat */

const int valoisa = 1;
const int pimea = 0;
const int vihainen = 2;
const int iloinen = 1;
const int off = 0;
const int on = 1;

/* Valoisan raja, eli missä kohtan tulkitaan pimeäksi, 1000 vastaa tosi tosi kirkasta tilannetta nolla täyttä pimeyttä. */

const int valoisanRaja = 50;

/* Nappuloiden tilat, eli jos tilat muuttuvat, niin valoja muutetaan vastaavasti */
int vanhaYmparistonTila = valoisa;
int uusiYmparistonTila = valoisa;

int vanhaTupsuNappulanTila = off;
int uusiTupsuNappulanTila = off;

int vanhaVihaisenNappulanTila = off;
int uusiVihaisenNappulanTila = off;

int vanhaIloisenNappulanTila = off;
int uusiIloisenNappulanTila = off;

int valoisuusArvo = 0;

/* Asetukset ajetaan kerran kun myssyyn laitetaan virrat */
void setup()     
{
  
  pinMode(tupsuKytkin, INPUT_PULLUP);
  pinMode(iloinenKytkin, INPUT_PULLUP);
  pinMode(vihainenKytkin, INPUT_PULLUP);

  pinMode(tupsuValo, OUTPUT);
  pinMode(iloinenValo, OUTPUT);
  pinMode(vihainenValo, OUTPUT);

  pinMode(valoSensori, INPUT);
 
  pinMode(ledPin, OUTPUT);      
     
  digitalWrite(tupsuValo, LOW);
  digitalWrite(iloinenValo, LOW);
  digitalWrite(vihainenValo, LOW);
  digitalWrite(ledPin, LOW);
     
  // Asetetaan alkuarvot nappuloille riippuen onko pimeää vai ei
  valoisuusArvo = analogRead(valoSensori);
  if(valoisuusArvo > valoisanRaja){
    uusiYmparistonTila = valoisa;
    uusiTupsuNappulanTila = off;
  }
  else{
    uusiYmparistonTila = pimea;
    uusiTupsuNappulanTila = off;  
  }
  Serial.begin(9600);
}

int onCnt;
void loop()    
{
  
  valoisuusArvo = analogRead(valoSensori);
 // Serial.println(valoisuusArvo);
  if(valoisuusArvo > valoisanRaja)
    uusiYmparistonTila = valoisa;
  else
    uusiYmparistonTila = pimea;

  int tupsunArvo = digitalRead(tupsuKytkin);
  int vihaisenArvo = digitalRead(vihainenKytkin);
  int iloisenArvo = digitalRead(iloinenKytkin);
  
  Serial.println(tupsunArvo);
    
  if(tupsunArvo != HIGH) uusiTupsuNappulanTila = uusiTupsuNappulanTila ^ 1;    
  if(vihaisenArvo != HIGH) uusiVihaisenNappulanTila = uusiVihaisenNappulanTila ^ 1;    
  if(iloisenArvo != HIGH) uusiIloisenNappulanTila = uusiIloisenNappulanTila ^ 1;    
  
  if( vanhaYmparistonTila != uusiYmparistonTila ){ /* Muuta valonappulan tilaa vain jos ympäristön valaistus on muuttunut */

    /* Tutkitaan, että jos on tullut pimeää, niin laitetaan nappula päälle vaikka sitä ei olisi painettukaan, laitetaan iloinen päälle oletuksena */
    if((uusiTupsuNappulanTila == off)&&(uusiYmparistonTila == pimea)){
        uusiTupsuNappulanTila = on;
    }  
    else if( (uusiTupsuNappulanTila == on)&&(uusiYmparistonTila == valoisa) ){
       uusiTupsuNappulanTila = off;
    }
  }

  if( vanhaTupsuNappulanTila != uusiTupsuNappulanTila ){ /* Muuta valoja vain jos valonappulan tila on muuttunut */
    switch(uusiTupsuNappulanTila){
      case on:
        digitalWrite(tupsuValo, HIGH);       
      break;
      case off:
        digitalWrite(tupsuValo, LOW);
      break;
    }    
  }

  if( vanhaIloisenNappulanTila != uusiIloisenNappulanTila ){ /* Muuta valoja vain jos valonappulan tila on muuttunut */
    switch(uusiIloisenNappulanTila){
      case on:
        digitalWrite(iloinenValo, HIGH);       
      break;
      case off:
        digitalWrite(iloinenValo, LOW);
      break;
    }    
  }

  if( vanhaVihaisenNappulanTila != uusiVihaisenNappulanTila ){ /* Muuta valoja vain jos valonappulan tila on muuttunut */
    switch(uusiVihaisenNappulanTila){
      case on:
        digitalWrite(vihainenValo, HIGH);       
      break;
      case off:
        digitalWrite(vihainenValo, LOW);
      break;
    }    
  }
  
  
  vanhaTupsuNappulanTila = uusiTupsuNappulanTila;
  vanhaIloisenNappulanTila = uusiIloisenNappulanTila;
  vanhaVihaisenNappulanTila = uusiVihaisenNappulanTila;
  
  vanhaYmparistonTila = uusiYmparistonTila;
  delay(250);
}