/*
ATENÇÃO:
ATENÇÃO:
ATENÇÃO:
Chego á conclusao que o wokwi nao gosta de codigos
muito extensos e/ou com muitas condiçoes IF etc. Cada adição fica mais baralhado
e faz SET a variaveis que estao dentro de IFs
74HC595 Arduino Shift Register example for Wokwi
Copyright (C) 2021, Uri Shaked
https://docs.wokwi.com/parts/wokwi-74hc595
https://docs.wokwi.com/parts/wokwi-74hc165
Serial.println("Elapsed Time: " + String(milliseconds / 1000) + " seconds");
+ 74HC165 Shift register input example
License: MIT.
*/
const uint8_t dataPin_595 = 2; /* DS */
const uint8_t clockPin_595 = 3; /* SHCP */
const uint8_t latchPin_595 = 4; /* STCP */
const uint8_t dataPin_165 = 5; /* Q7 */
const uint8_t clockPin_165 = 6; /* CP */
const uint8_t latchPin_165 = 7; /* PL */
const uint8_t numBits_165 = 8;
const uint8_t out_ar = 1;
const uint8_t out_bar = 2;
const uint8_t out_bat1 = 4;
const uint8_t out_bat2 = 8;
const uint8_t out_bat3 = 16;
const uint8_t out_vent = 32;
const uint8_t out_trip = 64;
const uint8_t out_run = 128;
uint8_t in_stop = 1;
uint8_t in_start = 1;
uint8_t in_bar = 1;
uint8_t in_k_on = 1;
uint8_t in_trip = 1;
uint8_t in_5 = 1;
uint8_t in_6 = 1;
uint8_t in_7 = 1;
const uint8_t t_bat_on=700; // define the time to BAT is ON
const uint8_t t_bat_bat=1; //ss // define the time in Seconds beathen BATimentos in ON mode
const uint8_t t_bat_bat_OFF=1; //ss // define the interval in Seconds beathenn BATimentos in OFF mode
const uint8_t t_bat_bat_to_OFF=2; //ss // define the time to stop the bat cycle to OFF cicle
const uint8_t n_bat_bat_to_OFF=5; //ss
// podem ser variaveis na MAIN
uint8_t output=0; // store the base output
uint8_t output_val=0; // new output with BATS
uint8_t new_output=0; // stores the output_val, if is == doesnt change OUTPUTS
bool cycle_start=false;
bool cycle_on=false;
bool cycle_stop=false;
uint8_t on_ar=0;
uint8_t on_vent=0;
uint8_t on_trip=0;
uint8_t on_bar=0;
uint8_t on_run=0;
uint8_t opt=0;
uint8_t n_bat_bat_aux=0;
void setup() {
Serial.begin(115200);
pinMode(dataPin_595, OUTPUT);
pinMode(clockPin_595, OUTPUT);
pinMode(latchPin_595, OUTPUT);
pinMode(dataPin_165 , INPUT);
pinMode(clockPin_165 , OUTPUT);
pinMode(latchPin_165 , OUTPUT);
// FOR ARDUINO
#define TIMER_PRESCALER 64 // Choose an appropriate prescaler for 1ms (adjust as needed)
// Set up Timer1
cli(); // Disable interrupts temporarily
TCCR1A = 0; // Set Timer1 control registers to zero
TCCR1B = 0;
// Set the compare match value for 1ms interrupt
OCR1A = 250; // Timer count for 1ms (16MHz / (64 * 250) = 1000 Hz)
// Set Timer1 to CTC (Clear Timer on Compare Match) mode
TCCR1B |= (1 << WGM12);
// Set the prescaler value
TCCR1B |= (1 << CS11) | (1 << CS10); // 64 prescaler
// Enable Timer1 Compare Match A interrupt
TIMSK1 |= (1 << OCIE1A);
sei(); // Enable interrupts
}
volatile uint16_t milliseconds = 0;
volatile uint16_t seconds = 0;
// Interrupt Service Routine (ISR) for Timer1
ISR(TIMER1_COMPA_vect) {
milliseconds++;
//Serial.println(milliseconds);
if(milliseconds==999){
seconds++;
Serial.print(seconds);
Serial.println(" seconds");
milliseconds=0;
}
}
/**********************************************************************************************************/
/** 74HC595 ***********************************************************************************************/
void outputs_Set_indivivual (uint8_t AR, uint8_t bat1, uint8_t bat2, uint8_t bat3, uint8_t trip, uint8_t vent, uint8_t bar , uint8_t run){
AR=(AR==1)? out_ar : 0 ;
bat1=(bat1==1)? out_bat1 : 0 ;
bat2=(bat2==1)? out_bat2 : 0 ;
bat3=(bat3==1)? out_bat3 : 0 ;
trip=(trip==1)? out_trip : 0 ;
vent=(vent==1)? out_vent : 0 ;
bar=(bar==1)? out_bar : 0 ;
run=(run==1)? out_run : 0 ;
digitalWrite(latchPin_595, LOW);
shiftOut(dataPin_595, clockPin_595, LSBFIRST /*MSBFIRT*/, AR+bat1+bat2+bat3+trip+vent+bar+run);
digitalWrite(latchPin_595, HIGH);
}
void outputs_Set_all (uint8_t dec_code){
digitalWrite(latchPin_595, LOW);
shiftOut(dataPin_595, clockPin_595, LSBFIRST, dec_code);
digitalWrite(latchPin_595, HIGH);
}
/**********************************************************************************************************/
/** 74HC164 ***********************************************************************************************/
bool read_input_individual(uint8_t input_to_read){
// to use this function, mean read a lot of times in the same loop
uint8_t bit=0;
uint8_t bit_val=0;
digitalWrite(latchPin_165 , LOW);
digitalWrite(latchPin_165 , HIGH);
for (uint8_t i = 0; i < numBits_165; i++) {
bit = digitalRead(dataPin_165);
if(i==input_to_read) bit_val=bit;
digitalWrite(clockPin_165 , HIGH); // Shift out the next bit
digitalWrite(clockPin_165 , LOW);
delay(1);
}
return bit_val;
}
void read_inputs (){
digitalWrite(latchPin_165 , LOW);
digitalWrite(latchPin_165 , HIGH);
for (uint8_t i = 0; i < numBits_165; i++) {
if(i==0) in_stop = digitalRead(dataPin_165);
if(i==1) in_start = digitalRead(dataPin_165);
if(i==2) in_bar = digitalRead(dataPin_165);
if(i==3) in_k_on = digitalRead(dataPin_165);
if(i==4) in_trip = digitalRead(dataPin_165);
if(i==5) in_5 = digitalRead(dataPin_165);
if(i==6) in_6 = digitalRead(dataPin_165);
if(i==7) in_7 = digitalRead(dataPin_165);
digitalWrite(clockPin_165 , HIGH); // Shift out the next bit
digitalWrite(clockPin_165 , LOW);
}
/*
Serial.println("");
Serial.print("in_stop=");
Serial.println(in_stop);
Serial.print("in_start=");
Serial.println(in_start);
Serial.print("in_bar=");
Serial.println(in_bar);
Serial.print("in_k_on=");
Serial.println(in_k_on);
Serial.print("in_trip=");
Serial.println(in_trip);
Serial.print("in_5=");
Serial.println(in_5);
Serial.print("in_6=");
Serial.println(in_6);
Serial.print("in_7=");
Serial.println(in_7);
*/
}
/*
uint8_t cycle_bat (uint8_t out_actual, uint16_t time_on, uint16_t time_bat_bat,uint8_t bat1, uint8_t bat2, uint8_t bat3 ){
// if(milliseconds==99)Serial.print("cycle_bat= ");
//if(milliseconds==99)Serial.println(out_actual);
if(milliseconds < time_on){
if(seconds==1){
//if(milliseconds==99)Serial.println("bat1");
return out_actual+bat1;
}
if(seconds==1+time_bat_bat){
// if(milliseconds==99)Serial.println("bat2");
return out_actual+bat2;
}
if(seconds==1+time_bat_bat+time_bat_bat){
//if(milliseconds==99)Serial.println("bat3");
return out_actual+bat3;
}
}else{
return out_actual;
}
} */
void loop() {
if(seconds>=250) seconds=0;
uint16_t delay_time = 300;
/* */
if(milliseconds==1){
Serial.println("=====================");
Serial.print("cycle_start=");
Serial.println(cycle_start);
Serial.print("cycle_on=");
Serial.println(cycle_on);
Serial.print("cycle_stop=");
Serial.println(cycle_stop);
Serial.print("on_ar=");
Serial.println(on_ar);
Serial.print("on_ar=");
Serial.println(on_ar);
Serial.println("--------------------");
}
if(milliseconds==2){
// Serial.println("------ Read inputs and set Base OUTPUT");
read_inputs();
on_bar=(in_bar==1)?out_bar:0; // não influencia no Código, apenas Informa
//on_trip= (in_trip==1)?out_trip:0;
//on_run= (in_trip==0 && in_k_on==1)?out_run:0;
///on_vent= (in_trip==1 || in_start==0)?0:out_vent;
output=on_ar+on_vent+on_trip+on_bar+on_run;
output_val = output;
}
// ERROS
if(in_k_on==1){ // conjungar com as varias situaçoes
on_run=out_run;
}
// CICLO normal
if(in_start==1){
if(cycle_start==false ){
seconds=0;
milliseconds=0;
if(milliseconds==0) Serial.println("1 - cycle_start=true");
on_ar=out_ar;
cycle_start=true;
}
if(cycle_start==true){
if(milliseconds < t_bat_on){
if(seconds==1){
//if(milliseconds==99)Serial.println("bat1");
output_val = output+out_bat1;
}
if(seconds==1+t_bat_bat){
// if(milliseconds==99)Serial.println("bat2");
output_val = output+out_bat2;
}
if(seconds==1+t_bat_bat+t_bat_bat){
// if(milliseconds==99)Serial.println("bat3");
output_val=output+out_bat3;
seconds=0;
milliseconds=0;
if(cycle_on==false){ // liga vent
cycle_on=true;
Serial.println("2 - cycle is on ");
on_vent=out_vent;
}
}
}else{
output_val = output;
}
}
}else{
if(cycle_start==true && cycle_on==true){
Serial.println("3 - Strat STOP cycle");
on_vent=0;
cycle_start=false;
cycle_stop=true;
seconds=0;
milliseconds=0;
};
if(cycle_stop==true && cycle_on==true){
/*
if(milliseconds==1) {
Serial.print("------case 5 output_val=");
Serial.println (output_val);
Serial.print(" -- seconds=");
Serial.println (seconds);
Serial.print(" -- t_bat_bat_OFF=");
Serial.println (t_bat_bat_OFF);
Serial.print(" -- n_bat_bat_to_OFF=");
Serial.println (n_bat_bat_to_OFF);
Serial.print(" -- n_bat_bat_aux=");
Serial.println (n_bat_bat_aux);
}
*/
if(milliseconds < t_bat_on && seconds==t_bat_bat_OFF){
if(n_bat_bat_aux<=n_bat_bat_to_OFF) output_val = output+out_bat1;
if(n_bat_bat_aux>n_bat_bat_to_OFF && n_bat_bat_aux<=2*n_bat_bat_to_OFF) output_val = output+out_bat2;
if(n_bat_bat_aux>2*n_bat_bat_to_OFF && n_bat_bat_aux<=3*n_bat_bat_to_OFF) output_val = output+out_bat3;
}else{
output_val = output;
}
if(seconds==t_bat_bat_OFF && milliseconds==10){
n_bat_bat_aux++;
seconds=0;
milliseconds=0;
}
if(n_bat_bat_aux>3*n_bat_bat_to_OFF){
on_ar=0;
opt=0;
cycle_stop=false;
cycle_start=false;
cycle_on=false;
on_run=0;
if(milliseconds==1) Serial.println("cycle_stop=false");
};
};
};
/*
if(cycle_stop==true && in_start==0 ){
if(milliseconds==1) {
Serial.print("------case 5 output_val=");
Serial.println (output_val);
Serial.print(" -- seconds=");
Serial.println (seconds);
Serial.print(" -- t_bat_bat_OFF=");
Serial.println (t_bat_bat_OFF);
Serial.print(" -- n_bat_bat_to_OFF=");
Serial.println (n_bat_bat_to_OFF);
Serial.print(" -- n_bat_bat_aux=");
Serial.println (n_bat_bat_aux);
}
if(milliseconds < t_bat_on && seconds==t_bat_bat_OFF){
if(n_bat_bat_aux<=n_bat_bat_to_OFF) output_val = output+out_bat1;
if(n_bat_bat_aux>n_bat_bat_to_OFF && n_bat_bat_aux<=2*n_bat_bat_to_OFF) output_val = output+out_bat2;
if(n_bat_bat_aux>2*n_bat_bat_to_OFF && n_bat_bat_aux<=3*n_bat_bat_to_OFF) output_val = output+out_bat3;
}else{
output_val = output;
}
if(seconds==t_bat_bat_OFF && milliseconds==10){
n_bat_bat_aux++;
seconds=0;
milliseconds=0;
}
if(n_bat_bat_aux>3*n_bat_bat_to_OFF){
on_ar=0;
opt=0;
cycle_stop=false;
cycle_start=false;
};
};
if(in_start==1 && cycle_stop==true){
cycle_stop=false;
}
if(cycle_start==false && in_start==1){
seconds=0;
milliseconds=0;
}
*/
if(output_val != new_output){
Serial.println("-----Set Outputs");
/*
Serial.print("output_val=");
Serial.print(output_val);
Serial.print(" new_output era=");
Serial.println(new_output);
if(output_val==0)Serial.println("OUTPUT = ZERO");
*/
outputs_Set_all(output_val);
new_output=output_val;
}else{
/*
if(milliseconds==1){
Serial.print("-----Outputs ");
Serial.print("output_val=");
Serial.println(output_val);
Serial.print("-----Outputs ");
Serial.print("new_output=");
Serial.println(new_output);
}
*/
}
}
/*
//1 2 4 8 16 32 64 128
void loop() {
uint16_t delay_time = 300;
if(milliseconds==100) opt=0; // individual inputs are a global variable
if(in_start==1 && cycle_stop==true){
cycle_stop=false;
}
if(cycle_start==false && in_start==1){
seconds=0;
milliseconds=0;
}
if(milliseconds==1){
Serial.print("OPT=");
Serial.println(opt);
}
switch(opt){
case 0:
if(milliseconds==1)Serial.println("------case 0");
read_inputs();
on_bar=(in_bar==1)?out_bar:0; // não influencia no Código, apenas Informa
on_trip= (in_trip==1)?out_trip:0;
on_run= (in_trip==0&&in_k_on==1)?out_run:0;
on_vent= (in_trip==1 || in_start==0)?0:on_vent;
output_val=output=on_ar+on_vent+on_trip+on_bar+on_run;
// if(cycle_start==false && in_start==1) opt=1;
if(cycle_start==false && in_start==1){
cycle_start=true;
on_ar=out_ar;
opt=2;
};
if(cycle_start==true && in_start==1) opt=2;
if(cycle_start==true && in_start==0) opt=4;
if(cycle_stop==true) opt=5;
Serial.print("------case 0");
Serial.print(" --- cycle_start=");
Serial.print(cycle_start);
Serial.print(" --- in_start=");
Serial.println(in_start);
break;
case 1:
if(milliseconds==1)Serial.println("------case 1");
cycle_start=true;
on_ar=out_ar;
opt=2;
break;
case 2:
if(milliseconds==1)Serial.println("------case 2");
// output_val = cycle_bat(output, t_bat_on, t_bat_bat, out_bat1, out_bat2, out_bat3);
if(milliseconds < t_bat_on){
if(seconds==1){
//if(milliseconds==99)Serial.println("bat1");
output_val = output+out_bat1;
}
if(seconds==1+t_bat_bat){
// if(milliseconds==99)Serial.println("bat2");
output_val = output+out_bat2;
}
if(seconds==1+t_bat_bat+t_bat_bat){
//if(milliseconds==99)Serial.println("bat3");
output_val=output+out_bat3;
}
}else{
output_val = output;
}
if(seconds>=1+t_bat_bat+t_bat_bat){
cycle_on=true;
on_vent=out_vent;
}
if(seconds>=1+t_bat_bat+t_bat_bat) seconds=0;
break;
case 3: // Turn ON the ventilador, and set the cycle_on
if(milliseconds==1)Serial.println("------case 3 ");
on_vent=out_vent;
cycle_on=true;
opt=2;
break;
case 4: // Turn OFF the ventilador, and start th bat cycle to OFF
if(milliseconds==1)Serial.println("------case 4");
on_vent=0;
cycle_stop=true;
opt=5;
seconds=0;
milliseconds=0;
break;
case 5:
if(milliseconds==1) {
Serial.print("------case 5 output_val=");
Serial.println (output_val);
Serial.print(" -- seconds=");
Serial.println (seconds);
Serial.print(" -- t_bat_bat_OFF=");
Serial.println (t_bat_bat_OFF);
Serial.print(" -- n_bat_bat_to_OFF=");
Serial.println (n_bat_bat_to_OFF);
Serial.print(" -- n_bat_bat_aux=");
Serial.println (n_bat_bat_aux);
}
if(milliseconds < t_bat_on && seconds==t_bat_bat_OFF){
//quero que durante x segundos só bata o BAT1 , com t_bat_on e t_bat_bat_off de intervalo
if(n_bat_bat_aux<=n_bat_bat_to_OFF) output_val = output+out_bat1;
if(n_bat_bat_aux>n_bat_bat_to_OFF && n_bat_bat_aux<=2*n_bat_bat_to_OFF) output_val = output+out_bat2;
if(n_bat_bat_aux>2*n_bat_bat_to_OFF && n_bat_bat_aux<=3*n_bat_bat_to_OFF) output_val = output+out_bat3;
}else{
output_val = output;
}
if(seconds==t_bat_bat_OFF && milliseconds==10){
n_bat_bat_aux++;
seconds=0;
milliseconds=0;
}
if(n_bat_bat_aux>3*n_bat_bat_to_OFF) opt=6;
break;
case 6:
if(milliseconds==1) {
Serial.print("------case 6 output_val=");
}
on_ar=0;
opt=0;
cycle_stop=false;
cycle_start=false;
break;
default:
break;
}
if(output_val != new_output){
//Serial.print("output_val=");
//Serial.print(output_val);
//Serial.print(" new_output era=");
// Serial.println(new_output);
if(output_val==0)Serial.println("OUTPUT = ZERO");
outputs_Set_all(output_val);
new_output=output_val;
}
}
}
//outputs_Set_all(0);
};
if(seconds>=1+t_bat_bat+t_bat_bat+t_bat_bat) seconds=0;
if(output_val != new_output){
Serial.print("output_val=");
Serial.print(output_val);
Serial.print(" new_output era=");
Serial.println(new_output);
outputs_Set_all(output_val);
new_output=output_val;
}
}
*/