Car HVAC/clock screen with an Arduino Nano, buttons for setting the clock (I feel like I'm close)

Hello

So, I've made an Arduino clock/HVAC screen using some instructions on a Honda forum but I've made a few tweaks to the code as my steering while switches did not work properly.
Everything still works except for setting the time for the RTC using a resistive ladder set of momentary push buttons.

It's supposed to be that if button 1 is held for 4 seconds then the clock will go into setting mode, button 2 increases the hour, 3 decreases the hour, 4 increases the minutes and 5 decreases the minutes.

As it is at the moment, I can't get it to go into setting mode.

I think I'm close because something I did, just by moving lines of code around made it work but in the process, I broke several other things (almost everything in the void loop). I then reverted to an old backup of the code and forgot what I did to make it work.

here's the code

#include "Wire.h"
#include "ds3231.h"

#define CLK 2           // Red wire, pin #4 (DISP CLK)
#define DAT 3           // Yellow wire, pin #5 (AC SO)
#define INPUT_PIN A0

volatile byte climat_data[7];
int val,mode;
struct ts t;
unsigned long previousMillis = 0; 
const long interval = 60000;
unsigned long buttonTimer = 0;
const long longPressTime = 3000;
boolean buttonActive = false;
boolean longPressActive = false;

void setup() {
  pinMode(CLK, OUTPUT);
  digitalWrite(CLK, LOW);
  pinMode(DAT, INPUT_PULLUP);
  pinMode(INPUT_PIN, INPUT);
  Wire.begin();
  Serial.begin(115200);
  mode=0;
  DS3231_init(DS3231_INTCN);
  delay(500);  
  DS3231_get(&t);
  Serial.write("n0.val=");
  Serial.print(t.hour);
  Serial.write(0xff);                             
  Serial.write(0xff);
  Serial.write(0xff);   
  Serial.write("n1.val=");
  Serial.print(t.min);
  Serial.write(0xff);                             
  Serial.write(0xff);
  Serial.write(0xff);   
}

void Climat_Read(uint8_t *dataPin, uint8_t *clockPin){
  for (uint8_t b = 0; b < 7; b++ ) {
    for (uint8_t i = 0; i < 8; ++i) {
      digitalWrite(clockPin, HIGH);
      delayMicroseconds(50);
      digitalWrite(clockPin, LOW);
      delayMicroseconds(50);
      switch (digitalRead(dataPin)){
        case 0:
          climat_data[b] |= 1 << i;
          break;
        case 1:
          climat_data[b] &= ~(1 << i);
          break;
      }
    }
  }
}


void Check_Mode(){
     if(analogRead(INPUT_PIN)==1){
        if (buttonActive == false){
        buttonActive = true;
        buttonTimer = millis();
        }
        if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)){
            longPressActive = true;
            if(mode){              
              mode=0;
              DS3231_set(t);
              Serial.write("p5.pic=17");
              Serial.write(0xff);                             
              Serial.write(0xff);
              Serial.write(0xff);
              Serial.write("p3.pic=17");
              Serial.write(0xff);                             
              Serial.write(0xff);
              Serial.write(0xff);          
              Serial.write("p4.pic=17");
              Serial.write(0xff);                             
              Serial.write(0xff);
              Serial.write(0xff);             
            }else{
              mode=1;
              DS3231_get(&t);
              Serial.write("p5.pic=18");
              Serial.write(0xff);                             
              Serial.write(0xff);
              Serial.write(0xff);              
              Serial.write("p3.pic=15");
              Serial.write(0xff);                             
              Serial.write(0xff);
              Serial.write(0xff);      
              Serial.write("p4.pic=16");
              Serial.write(0xff);                             
              Serial.write(0xff);
              Serial.write(0xff);
            }
       }
     }else{
        if(buttonActive == true){
           if(longPressActive == true){
              longPressActive = false;
           }
        buttonActive = false;
        }
     }
}

void Update_Time(){
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval){
    previousMillis = currentMillis;
    DS3231_get(&t);
    Serial.write("n0.val=");
    Serial.print(t.hour);
    Serial.write(0xff);                             
    Serial.write(0xff);
    Serial.write(0xff);
    Serial.write("n1.val=");
    Serial.print(t.min);
    Serial.write(0xff);                             
    Serial.write(0xff);
    Serial.write(0xff);     
  }
}

int readAnalogButton() {
  int button = analogRead(INPUT_PIN);
  if (button > 921) return 0;
  if (button < 256) return 1;
  if (button < 598) return 2;
  if (button < 726) return 3;
  if (button < 794) return 4;
  if (button < 921) return 5;
}



void Set_Time(){
  DS3231_get(&t);
  val = analogRead(INPUT_PIN);
     if(val==4){ // MINUTE UP
        if(t.min==59){
           t.min = 0;
        }else{
            t.min = t.min+1;
        }
        Serial.write("n1.val=");
        Serial.print(t.min);
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);                
        DS3231_set(t);
     }                                   
     if(val==5){ // MINUTE DOWN
        if(t.min==0){
           t.min = 59;
        }else{
           t.min = t.min-1;
        } 
        Serial.write("n1.val=");
        Serial.print(t.min);
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);                  
        DS3231_set(t);
     }             
     if(val==2){ // HOUR UP
        if(t.hour==23){
           t.hour = 0;
        }else{
           t.hour = t.hour+1;
        } 
        Serial.write("n0.val=");
        Serial.print(t.hour);
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);           
        DS3231_set(t);
     }                                   
     if(val==3){ // HOUR DOWN
        if(t.hour==0){
           t.hour = 23;
        }else{
           t.hour = t.hour-1;
        } 
        Serial.write("n0.val=");
        Serial.print(t.hour);
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);           
        DS3231_set(t);         
     }
}

void loop(){


{int result = readAnalogButton();
  Serial.println(result);
}
{
  Update_Time();
 Check_Mode();
  if(mode){
     Set_Time();
  }
     
  Climat_Read(DAT, CLK);
    //Temp1
    switch ( ((climat_data[4]) & B11110) >> 1 ){
      case 0:
        Serial.write("vis n3,0");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 1:
        Serial.write("vis n3,1");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff); 
        Serial.write("n3.val=15");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 0xf:
        Serial.write("vis n3,1");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff); 
        Serial.write("n3.val=29");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      default:
        byte i = (((climat_data[4]) & B11110) >> 1);
        Serial.write("vis n3,1");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff); 
        Serial.write("n3.val=");
        Serial.print(i+14);
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
    }

//Temp2 please change n2 to the appropriate object number on nextion lcd
    switch ( ((climat_data[5]) & B11110) >> 1 ){
      case 0:
        Serial.write("vis n2,0");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 1:
        Serial.write("vis n2,1");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff); 
        Serial.write("n2.val=15");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 0xf:
        Serial.write("vis n2,1");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff); 
        Serial.write("n2.val=29");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      default:
        byte i = (((climat_data[5]) & B11110) >> 1);
        Serial.write("vis n2,1");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff); 
        Serial.write("n2.val=");
        Serial.print(i+14);
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
    }






    // Fan speed
    switch( (climat_data[1] & B1110) >> 1 ){
      case 0:
        Serial.write("p2.pic=7");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);
        break;
      case 1:
        Serial.write("p2.pic=8");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 2:
        Serial.write("p2.pic=9");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 3:
        Serial.write("p2.pic=10");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 4:
        Serial.write("p2.pic=11");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 5:
        Serial.write("p2.pic=12");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 6:
        Serial.write("p2.pic=13");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 7:
        Serial.write("p2.pic=14");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
    }
    //Directions
    switch ( (climat_data[2] & B1110000) >> 4 ){
      case 0:
        Serial.write("p1.pic=2");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 1:
        Serial.write("p1.pic=6");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 2:
        Serial.write("p1.pic=4");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 3:
        Serial.write("p1.pic=5");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 4:
        Serial.write("p1.pic=3");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
    }
    //AUTO mode
    if ((climat_data[2]) & B10){                           
      Serial.write("t1.txt=\"AUTO\"");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);      
    } else {
      Serial.write("t1.txt=\"\"");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);      
    }
    //AC mode
    switch ( (climat_data[3] & B110) >> 1 ){
      case 0:
        Serial.write("t0.txt=\"\"");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 1:
        Serial.write("t0.txt=\"ON\"");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
      case 2:
        Serial.write("t0.txt=\"OFF\"");
        Serial.write(0xff);                             
        Serial.write(0xff);
        Serial.write(0xff);        
        break;
    }  
  delay(100);
  }

When compiling it gives no errors and it says
"Sketch uses 7412 bytes (24%) of program storage space. Maximum is 30720 bytes.
Global variables use 784 bytes (38%) of dynamic memory, leaving 1264 bytes for local variables. Maximum is 2048 bytes."

Please could anybody see what I've done wrong. I've been tearing my hair out for the last week trying to get it to work properly and I would very much like to re-assemble my dashboard :sweat_smile:

Here's how the whole thing is wired

You sure you want to do an "analogRead", for example, here

void Check_Mode(){
     if(analogRead(INPUT_PIN)==1){
        if (buttonActive == false){
        buttonActive = true;

and here

void Set_Time(){
  DS3231_get(&t);
  val = analogRead(INPUT_PIN);
     if(val==4){ // MINUTE UP

and not perhaps call

readAnalogButton()

?

1 Like

Oh my god thank you so much! I can't believe it was something so simple..
I had a feeling I just needed a fresh pair of eyes to find the silly mistake.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.