#include <Adafruit_NeoPixel.h>

#define pinNeoPixel 7   // Zapojeni:
#define pinSwitch 6
#define P_TRIG 3
#define P_ECHO 2

float distance;     // Promenne:
int count, rcount, pos;
bool state, red;
uint32_t color;

Adafruit_NeoPixel strip(8, pinNeoPixel, NEO_GRB + NEO_KHZ800);    // Vytvoreni objektu pro LED pasky

void setup()
{
  strip.begin();    // Inicializace LED pasku
  strip.show();
  Serial.begin(9600);

  pinMode(pinSwitch, INPUT);    // Nastaveni I/O pinu
  pinMode(P_TRIG, OUTPUT);
  pinMode(P_ECHO, INPUT);
}

void loop()
{
  strip.clear();
  if (digitalRead(pinSwitch) == false) {    // Pokud switch neni zmacknuty (spojeny)
    readDistance();   // Precti vzdalenost z hc-sr04

    if (distance < 400 && distance > 300) {   // Pokud je vzdalenost mensi nez 400cm a vetsi nez 300cm
      count = map(distance, 300, 400, 8, 0);  // count = pocet rozsvicenych LED diod, vypocitej z vzdalenosti
      color = strip.Color(0, 255, 0);         // zelena barva

      int rcount = 0;   // aktualni pocet rozsvicenych pixelu (led diod)
      int pos = 8;      // zacinajici pozice (1 pixel z leva)

      while(rcount < count) {   // Zobraz jednotlive pixely v poctu count zleva do prava
        rcount++;
        pos--;
        strip.setPixelColor(pos, color);
      }

    } else if (distance > 30 && distance <= 300) {    // Pokud je vzdalenost mensi nez 300cm a vetsi nez 30cm
      count = map(distance, 30, 300, 8, 0);    // count = pocet rozsvicenych LED diod, vypocitej z vzdalenosti
      color = strip.Color(230, 40, 9);         // oranzova barva

      int rcount = 0;   // aktualni pocet rozsvicenych pixelu (led diod)
      int pos = 8;      // zacinajici pozice (1 pixel z leva)

      while(rcount < count) {   // Zobraz jednotlive pixely v poctu count zleva do prava
        rcount++;
        pos--;
        strip.setPixelColor(pos, color);
      }
    } else if (distance <= 30) {    // Pokud je vzdalenost mensi nez 30cm
      red = !red;

      if(red) color = strip.Color(255, 0, 0);   // Stridani cervene a cerne (zadne) barvy co 250ms, pokazde kdyz probehne tento kod
      else color = strip.Color(0, 0, 0);

      for (int i = 0; i <= 8; i++) {            // Nastav stejnou barvu na vsech 8 diod
        strip.setPixelColor(i, color);
      }
      delay(250);
    }
  }
  strip.show();   // Zobraz na LED pasku
  delay(25);      // Mensi delay
}

void readDistance() {   // Funkce na precteni vzdalenosti z ultrazvukoveho merice vzdalenosti
  digitalWrite(P_TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(P_TRIG, HIGH);
  delayMicroseconds(5);
  digitalWrite(P_TRIG, LOW);

  int latency = pulseIn(P_ECHO, HIGH);

  distance = latency / 58.31;
  //Serial.print("Distance: ");
  //Serial.print(distance);
  //Serial.println(" cm.");
}