#include "HX711.h"

HX711 scale;
//define pinos led
#define VD 13             //Define variavel VD associado a Sala Vazia e a Trabalhadores no Local 
#define AM 6              //Define variavel AM 
#define VM 12             //Define variavel VM associado a Emergencia 
//define pino sirene e frequencia para sirene
#define Buzzer 11         //Define variavel Buzzer associado ao pino 11 
#define mi 330            //Define variavel mi como frequência de 330 Hz 
#define fa 900            //define variavel fa como frequência de 900 HZ
//define botoes
#define button_reset 10   //Define button como botão de reset associado ao pino 10
#define button_start 9    //define a entrada 9 como botão de inicio
#define button_em 8       //define reset emergencia

int peso;                 // variavel que sera atribuida o valor da celula de carga
int kg;                   // variavel que recebe o valor tratado do valor da celula de carga
int cont; 
int cont2;
int ciclo;								//Declara variavel inteira como  cont

void setup() {
  Serial.begin(9600);                 //inicializa porta serial
  pinMode(VD, OUTPUT);                //Define modo de opereção do pino 13 como saida 
  pinMode(AM, OUTPUT);                //Define o modo de operação do pino 6 como saida 
  pinMode(VM, OUTPUT);                //Define o modo de operação do pino 12 como saida 
  pinMode(9,  INPUT_PULLUP);          //define o modo de operação do pino 9 como entrada
  pinMode(10, INPUT_PULLUP);          //define o modo de operação do pino 9 como entrada
  pinMode(8,  INPUT_PULLUP);          //define o modo de operação do pino 8 como entrada
  scale.begin(A1, A0);                //inicia a porta da celula de carga
}

void loop() 
{
  peso = scale.get_value();
  kg = peso/420; 
    delay(1000);
    inicio:
    Serial.println("pressione start para inicializar o sistema ");
    if (digitalRead(button_start) == LOW)
    {
     for(ciclo = 5000; ciclo > 0; ciclo --)
     {
       peso = scale.get_value();
       kg = peso/420; 
     if (kg <= 10 )                   //Serial faz a varredura continua, valor zero "Sala vazia" 
      {     
      digitalWrite(VD, HIGH);  	      //Coloca a variável digital VD em nível lógico alto 
      digitalWrite(VM, LOW); 		      //Coloca a variável digital VM em nível lógico baixo
      Serial.print("Sala vazia: ");   //Imprime no monitor serial o texto entre aspas duplas 
      Serial.print(kg);               //Imprime no monitor serial o texto entre aspas duplas 
      Serial.println(" KG");
      delay(1000);
      }
        if (kg > 10 && kg <= 50 )  //serial detecta alguma alteração, valor diferente de zero mas ainda não atingiu o pico "Trabalhadores no local" 
        {                              	
          digitalWrite(VM, LOW); 			//Coloca a variável digital VM em nível lógico baixo
          digitalWrite(VD, HIGH);                  //Coloca a variável digital VD em nível lógico alto 
          Serial.print("Trabalhador No Local: ");  //Imprime no monitor serial o texto entre aspas duplas 
          Serial.print(kg);                    //Imprime no monitor serial o texto entre parênteses
          Serial.println(" KG");
          delay(3000); 

        } 
          if (kg > 50 )		//Compara se a condição A0 e maior que o valor e se o botão está desligado 
          {                 						//Abertura da estrutura if (condicional) 
            digitalWrite(VD, LOW); 					//Coloca a variável digital VD em nível lógico baixo
            digitalWrite(VM, HIGH); 				//Coloca a variável digital VD em nível lógico alto
            delay(1000); 
            digitalWrite(VM, LOW); 					//Coloca a variável digital VD em nível lógico baixo
            delay(1000);  
            Serial.println("POSSIVEL QUEDA DO TRABALHADOR ");  //Imprime no monitor serial o texto entre aspas duplas
            Serial.println("PRESSIONE O BOTÃO AMARELO EM CASO DE ALARME FALSO ");  //Imprime no monitor serial o texto entre aspas duplas
            Serial.println("CONTAGEM REGRESSIVA 15S: ");  //Imprime no monitor serial o texto entre aspas duplas
            Serial.print(kg);                    //Imprime no monitor serial o texto entre parênteses
            Serial.println(" KG"); 
            for (cont = 15; cont >= 0; cont--) 		//Inicia estrutura de repetição for (inicio, condição, incremento)
              { 
                Serial.print(cont); 
                Serial.println("s");
                delay(500); 
                digitalWrite(VM, HIGH); 			//Coloca a variável digital VM em nível lógico alto
                delay(300); 
                digitalWrite(VM, LOW); 			//Coloca a variável digital VM em nível lógico baixo
                delay(300); 
                tone(11, mi);  //Executa a função tone no pino 13 utilizando o vetor melodia 
                delay(200); 										
	               if (digitalRead(button_reset) == LOW ) // Compara se a condição BOT e nivel logico alto
                  { 	
                    noTone(11);
                    delay(10);
                    goto inicio;
                  } 
                 
                     if(cont == 0)
                     {
                        for (cont2 = 1000; cont2 >=0; cont2 --)
                        {
                        digitalWrite(VM, HIGH); 			//Coloca a variável digital VM em nível lógico alto
                        delay(300); 
                        digitalWrite(VM, LOW); 			//Coloca a variável digital VM em nível lógico baixo
                        delay(300);  
                        tone(11, fa);
                        Serial.println("TRABALHADOR EM RISCO ");  //Imprime no monitor serial o texto entre aspas duplas
                        Serial.println("PRESSIONE O BOTÃO VERMELHO PARA DESLIGAR A SIRENE ");  //Imprime no monitor serial o texto entre aspas duplas
                        
                          if(digitalRead(button_em) == LOW)
                          {
                          noTone(11);
                          delay(10);  
                            goto inicio;
                          }
          }   }      }  }
    } }
}