Code working in individual parts, but not as a whole

So I am relatively new to Arduino and not that experienced of a coder. But, I don't understand why my code refuses to work. The different functions work fine when separated, but when the code is put together, nothing works. Not even the serial monitor works.

Here is my code:

#include <dht.h>

dht DHT;

#define DHT11_PIN 6

int enB = 3;
int in3 = 2;
int in4 = 4;
int chk = DHT.read11(DHT11_PIN);
int mode = 0;
int rpm = 100;
int startstop = 0;
#define SegA 11
#define SegB 10
#define SegC 8
#define SegD 9
#define SegE 5
#define SegF 12
#define SegG 13
#define SegDP 7

void setup() {
  Serial.begin(9600);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(A3, INPUT_PULLUP);
  pinMode(A4, INPUT_PULLUP);
  pinMode(A5, INPUT_PULLUP);
  digitalWrite(in4, HIGH);
  digitalWrite(in3, LOW);
  Serial.println("Hello");
}

void loop() {
    
  analogWrite(enB, rpm);

  ShowNumber(1);

  if(mode>9){
    mode=0;
  }
  
  if (digitalRead(A4)==LOW){
    mode=mode+1;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (digitalRead(A3)==LOW){
    mode=mode-1;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }
  
  if(digitalRead(A5) == LOW)
   {
      if(startstop == 0)
      {
          startstop = 255;
      }
      else
      {
          startstop = 0;
      }
   }

   if(startstop > 0)
   {
      ShowNumber(10);
      AutoMode();
   }
}
  

void ShowNumber(int Number){
  if(Number==0){
  digitalWrite(SegA, HIGH);
  digitalWrite(SegB, HIGH);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, HIGH);
  digitalWrite(SegE, HIGH);
  digitalWrite(SegF, HIGH);
  digitalWrite(SegG, LOW);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==1){
  digitalWrite(SegA, LOW);
  digitalWrite(SegB, HIGH);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, LOW);
  digitalWrite(SegE, LOW);
  digitalWrite(SegF, LOW);
  digitalWrite(SegG, LOW);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==2){
  digitalWrite(SegA, HIGH);
  digitalWrite(SegB, HIGH);
  digitalWrite(SegC, LOW);
  digitalWrite(SegD, HIGH);
  digitalWrite(SegE, HIGH);
  digitalWrite(SegF, LOW);
  digitalWrite(SegG, HIGH);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==3){
  digitalWrite(SegA, HIGH);
  digitalWrite(SegB, HIGH);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, HIGH);
  digitalWrite(SegE, LOW);
  digitalWrite(SegF, LOW);
  digitalWrite(SegG, HIGH);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==4){
  digitalWrite(SegA, LOW);
  digitalWrite(SegB, HIGH);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, LOW);
  digitalWrite(SegE, LOW);
  digitalWrite(SegF, HIGH);
  digitalWrite(SegG, HIGH);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==5){
  digitalWrite(SegA, HIGH);
  digitalWrite(SegB, LOW);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, HIGH);
  digitalWrite(SegE, LOW);
  digitalWrite(SegF, HIGH);
  digitalWrite(SegG, HIGH);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==6){
  digitalWrite(SegA, HIGH);
  digitalWrite(SegB, LOW);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, HIGH);
  digitalWrite(SegE, HIGH);
  digitalWrite(SegF, HIGH);
  digitalWrite(SegG, HIGH);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==7){
  digitalWrite(SegA, HIGH);
  digitalWrite(SegB, HIGH);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, LOW);
  digitalWrite(SegE, LOW);
  digitalWrite(SegF, LOW);
  digitalWrite(SegG, LOW);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==8){
  digitalWrite(SegA, HIGH);
  digitalWrite(SegB, HIGH);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, HIGH);
  digitalWrite(SegE, HIGH);
  digitalWrite(SegF, HIGH);
  digitalWrite(SegG, HIGH);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==9){
  digitalWrite(SegA, HIGH);
  digitalWrite(SegB, HIGH);
  digitalWrite(SegC, HIGH);
  digitalWrite(SegD, HIGH);
  digitalWrite(SegE, LOW);
  digitalWrite(SegF, HIGH);
  digitalWrite(SegG, HIGH);
  digitalWrite(SegDP, LOW);
  }
  
  if(Number==10){
  digitalWrite(SegA, LOW);
  digitalWrite(SegB, LOW);
  digitalWrite(SegC, LOW);
  digitalWrite(SegD, LOW);
  digitalWrite(SegE, LOW);
  digitalWrite(SegF, LOW);
  digitalWrite(SegG, LOW);
  digitalWrite(SegDP, HIGH);
  }
    
}

void AutoMode() {
  if (DHT.temperature<=18.3){
    mode=0;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }
  
  if (DHT.temperature>18.3 && (DHT.temperature<=23.8)){
    mode=1;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }
  
  if (DHT.temperature>23.8 && (DHT.temperature<=26.7)){
    mode=2;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>26.7 && (DHT.temperature<=29.4)){
    mode=3;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>29.4 && (DHT.temperature<=30.6)){
    mode=4;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>30.6 && (DHT.temperature<=32.2)){
    mode=5;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>32.2 && (DHT.temperature<=33.9)){
    mode=6;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>33.9 && (DHT.temperature<=35.6)){
    mode=7;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>35.6 && (DHT.temperature<=37.2)){
    mode=8;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>37.2){
    mode=9;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }
  
}

Edit: to make the issue more clear, when the code is put together, the main issue is that the physical parts stop working (as in their inputs aren't read and they don't take in the output information), and the serial monitor stops showing values

Please post two complete programs so we can see what the two parts that work separately but don’t work when you combine them are doing.

Maybe say a bit abour what Part A does, and Part B. And what combining them is supposed to accomplish.

TIA

a7

So first, these 2 read button inputs to change the speed of the motor rotation and to display the speed as a mode:

if (digitalRead(A4)==LOW){
    mode=mode+1;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (digitalRead(A3)==LOW){
    mode=mode-1;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

Then this reads a button input to run a certain function and stop it after a second press:

if(digitalRead(A5) == LOW)
   {
      if(startstop == 0)
      {
          startstop = 255;
      }
      else
      {
          startstop = 0;
      }
   }

   if(startstop > 0)
   {
      ShowNumber(10);
      AutoMode();
   }
}

This is the function that uses the temperature to decide the speed of the motor (its acting like a fan):

void AutoMode() {
  if (DHT.temperature<=18.3){
    mode=0;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }
  
  if (DHT.temperature>18.3 && (DHT.temperature<=23.8)){
    mode=1;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }
  
  if (DHT.temperature>23.8 && (DHT.temperature<=26.7)){
    mode=2;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>26.7 && (DHT.temperature<=29.4)){
    mode=3;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>29.4 && (DHT.temperature<=30.6)){
    mode=4;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>30.6 && (DHT.temperature<=32.2)){
    mode=5;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>32.2 && (DHT.temperature<=33.9)){
    mode=6;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>33.9 && (DHT.temperature<=35.6)){
    mode=7;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>35.6 && (DHT.temperature<=37.2)){
    mode=8;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }

  if (DHT.temperature>37.2){
    mode=9;
    ShowNumber(mode);
    rpm=mode*28.3;
    analogWrite(enB, rpm);
  }
  
}

But to make the issue more clear, when the code is put together, the main issue is that the physical parts stop working (as in their inputs aren't read and they don't take in the output information), as well as the serial monitor

I see a few issues:

  1. I see no Serial.print's in your code other than the one in setup()
  2. The ShowNumber(1); at the beginning of loop() will immediately overwrite any other call to ShowNumber(mode);
  3. You are reading the STATE of the buttons and not accounting for bounce. For example, if you press the button connected to A4 it is likely that mode will increment multiple times because loop() is getting called so fast. What you need to do is detect when the button BECOMES pressed. That way you are assured only 1 increment or decrement of mode when pressing A3 or A4. Similar issue with A5.

The following tutorial should help: StateChangeDetection

To make my request more clear, I repeat it.

Srsly, these should be, if you are being understood correctly, things you have right there and could just show us.

At a glance it seems like neither would “work” separately, so it’s no wonder and nothing to waste spend time trying to see why they don’t function when combined.

Meanwhile, where do you read the temperature?

What library are you using?

Tough crowd, yeah. But we do want to help.

a7

An update to the state change detection page for use with (the more modern) switches wired to ground and using the internal pullup (active LOW switches).

Also, I believe the DHT library you are using requires you to call DHT.read11() every time you want to read the temperature.

"The class has 6 read functions read11(PIN), read(PIN) and readxx(PIN) which have essentially the same interface. They read the DHT connected to PIN, and fill the two class members temperature and humidity. Multiple reads from these class members (H & T) will return the same (previous) values until a new read is done."

Hi @.

Line 10 of your sketch cannot exist at this location.
Delete this line and place it inside setup().

RV mineirin

Actually it needs to be inside of loop() in order to update the temperature class member. Otherwise AutoMode() will read the same temperature value forever.

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