Removal of delay, while still getting a delay

I want to remove the delay ();, and I've tried to do it with long-variables, but I can't figure it out... :confused:
I've attached the code below.
Thanks in advance :wink:

Vejrstation_ekst.ino (4.09 KB)

Please see Read this before posting a programming question and follow the instructions regarding posting code

I see no long variables in your code nor any use of millis() for timing

See Using millis() for timing. A beginners guide, Several things at the same time and the BlinkWithoutDelay example in the IDE for ideas

if you use code tags, you get this

#include <DHT.h>// fugtighedssensor library
#include <Wire.h>//LCD library
#include <LiquidCrystal_I2C.h> //LCD library
LiquidCrystal_I2C lcd(0x27, 16, 2); //Fortæller, hvordan skærmen ser ud

#define DHTPIN 2     // pin'en, som målebenet sidder på

#define DHTTYPE DHT11   // DHT 11 
const int blue = 6; //denne pin bruges til den blå lysdiode
const int green = 7; //denne pin bruges til den grønne lysdiode
const int yellow = 8; //denne pin bruges til den gule lysdiode
const int red = 9; //denne pin bruges til den røde lysdiode
const int hvid = 10; //denne pin bruges til at styre den hvide diode, der viser at systemet virker som det skal
int knap = 13;
DHT dht(DHTPIN, DHTTYPE);//definere først porten sensoren er forbundet til og typen af sensor

void setup() {
  Serial.begin(9600); //åbner for den serielle forbindelse ift. målinger
  Serial.println("DHT11 test!");//Kan fjernes eller ses i den serielle monitor
  dht.begin(); //sensoren starter op, så den er klar til at levere data til skærmen
  pinMode(blue, OUTPUT); //ben til led
  pinMode(green, OUTPUT); //ben til led
  pinMode(yellow, OUTPUT); //ben til led
  pinMode(red, OUTPUT); //ben til led
  pinMode(hvid, OUTPUT); //ben til led
  pinMode(knap, INPUT);// Ben til input fra knappen
  lcd.init(); //lcd-skærmen initialiseres
}

void loop() {
  void updateSensor() {
    delay(2000); // Da sensorens målinger kan være op til 2 sekunder gamle, ventes der 2 sekunder
    // Det tager desuden ca. 250 ms at måle med sensoren
    float h = dht.readHumidity(); //fugtigheden defineres som "h", med en integer, der ikke er konstant, da der ikke er grund til at gøre det her
    float t = dht.readTemperature(); //temperaturen defineres som "t" med en integer, der ikke er konstant
    if (t <= 2) {
      digitalWrite(blue, HIGH);
    } else {
      digitalWrite(blue, LOW);
    }
    if (t >= 19 && t <= 24) { //tænder dioden på pin 7 hvis temperaturen er mellem 19 og 24 grader
      digitalWrite(green, HIGH); //den røde led sendes et "HIGH" signal, hvilket betyder at den får 5V
    } else
    {
      digitalWrite(green, LOW);
    }

    if (t >= 2 && t <= 19) { //tænder dioden på pin 8 hvis temperaturen er mellem 2 og 19 grader
      digitalWrite(yellow, HIGH);
    } else
    {
      digitalWrite(yellow, LOW);
    }
    if (t >= 23) { //tænder dioden på pin 9 hvis temperaturen er over 23
      digitalWrite(red, HIGH);
    } else
    {
      digitalWrite(red, LOW);
    }
  }
  void ButtonUpdate() {
    if (knap == HIGH) {
      lcd.noBacklight();
      Serial.println("HEJ");
    }
  }
  void updateScreenState() {// Den første streng kan bruges til at tjekke om temperaturen og fugtigheden måles, hvis ikke er der noget galt med kredsløbet
    if (isnan(t) || isnan(h)) {// Hvis der ikke returneres et tal, kan man se at noget er galt
      Serial.println("Failed to read from DHT"); //er der fejl kan det ses i serial monitor
    } else {
      Serial.print(t); //der printes i serial monitor, kan skrives ud, eller bruges til test af h/t - vises der bogstaver er noget galt
      lcd.backlight(); //Lcd skærmen startes op så karakterene er lettere at se
      //Generelt har jeg sat mellemrum ind de steder, hvor der ellers ville kunne stå bogstaver, for at få displayet til at se 'rent' ud
      lcd.setCursor(0, 0); //Cursoren sættes til den første karakterplads på den første linje
      lcd.print("Temp.:"); //Der skrives temperatur
      lcd.print(t, 1); // // Temperaturen printes med et decimal. Dette defineres ved 1-tallet
      lcd.print((char)223); // Der indsættes en speciel karakter for grader tegnet
      lcd.print("C"); // Der indsættes en
      lcd.setCursor(0, 1); // Cursoren sættes til den første karakterplads på den anden linje
      lcd.print("Fugtighed: ");//Der skrives 'Fugtighed'
      lcd.print(h, 0); //Værdien for fugtighed skrives på skærmen
      lcd.print("%  "); //Der vises et procenttegn
    }
  }
  if (h >= 90) { // er fugtigheden over 90% vises der en advarsel
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("Advarsel, fugtig");
    lcd.setCursor(0, 1);
    lcd.print("hed for hoej!    ");
    delay(2000);
    lcd.clear();
  }

}

And if you autoformat your code (Ctrl-T in the IDE), you will see that all your functions have been placed inside your loop() function. This is not allowed. Function definitions need to be at the global level.

Show us what you have tried.


There are many many many many many examples on this web site !


Here are examples:

 //Blink without Delay skeleton 
//4 examples demonstrated
//

//LED wiring options
//=============================================
//Depending which way your LEDs are wired, uncomment the next line.
//#define PlusEqualsON 

#ifdef PlusEqualsON
//wired so +5V turns LED ON
#define ledON  HIGH
#define ledOFF LOW
//=========================
#else
//wired so +5V turns LED OFF
#define ledON  LOW
#define ledOFF HIGH
//=========================
#endif

//switch wiring options
//=============================================
//Depending which way your switches are wired, uncomment the next line.
#define PushEqualsLOW 

#ifdef PushEqualsLOW 
//pushing the switch makes pin LOW
#define Pushed   LOW
#define Released HIGH
//=========================
#else
//pushing the switch makes pin HIGH
#define Pushed   HIGH
#define Released LOW
//=========================
#endif

//=============================================
unsigned long currentMillis;
unsigned long pin13Millis;
unsigned long pin12Millis;
unsigned long pin11Millis;
unsigned long SwitchMillis;

//if these are not changed in the sketch, they can be const
unsigned long debounceMillis = 100UL;     //100ms
unsigned long ledOnTime      = 5*1000UL;  //5 seconds

byte laststartSwitchState    = HIGH;
byte buttonState             = HIGH;
byte counter                 = 0;

//the following are enable/disable flags
//some of these might not be used in this sketch
boolean flag13 = true;
boolean flag12 = true;
boolean flag11 = true;
boolean flag10 = true;

const byte startSwitch = 2; //pushed = LOW
const byte testSwitch  = 3; //pushed = LOW

//**********************************************************************

void setup()
{
  Serial.begin(9600);
  
  digitalWrite(13,ledOFF);
  pinMode(13, OUTPUT); 

  digitalWrite(12,ledOFF);
  pinMode(12, OUTPUT);

  digitalWrite(11,ledOFF);
  pinMode(11, OUTPUT);
  
  digitalWrite(10,ledOFF);
  pinMode(10, OUTPUT);

  pinMode(startSwitch, INPUT_PULLUP); //pushed = LOW
  pinMode(testSwitch,  INPUT_PULLUP); //pushed = LOW

} //  >>>>>>>>>>>>>> E N D  O F  s e t u p ( ) <<<<<<<<<<<<<<<<<

void loop()
{
  //save the current time
  currentMillis = millis();

  //************************************* E x a m p l e  1
  //toggle pin 13 every 200mS
  //has 200ms or more gone by?
  if (currentMillis - pin13Millis >= 200UL)
  {
    //code here runs every 200ms
    //get ready for next iteration
    pin13Millis = pin13Millis + 200UL;
    //toggle pin 13
    digitalWrite(13,!digitalRead(13));
  }

  //************************************* E x a m p l e  2
  //at power up, pin 12 LED goes ON, after 3 seconds goes OFF and stays OFF
  //could be used as a powerup reset signal
  if (flag12 == true && currentMillis - pin12Millis <= 3000UL)
  {
    //code here runs for 3 seconds after power up, then stops
    digitalWrite(12,ledON);
  }
  else
  {
    digitalWrite(12,ledOFF);
    //disable further pin 12 control
    flag12 = false;
  }

  //************************************* E x a m p l e  3
  //if testSwitch is pushed and released
  //pin 11 LED goes ON for 5 seconds, then goes OFF 
  buttonState = digitalRead(testSwitch);
  
  //are we are allowed to check the switch and is it pressed?
  if(flag11 == true && buttonState == Pushed)
  {    
    //enable timing of LED on pin 11
    flag11 = false; //false --> timing is enabled
    //turn LED ON
    digitalWrite(11,ledON);
    //record the time LED turned ON
    pin11Millis = currentMillis;
  }
    
  //are we allowed and is it time to control pin 11
  if (flag11 == false && currentMillis - pin11Millis >= ledOnTime)
  {
    //if enabled, code here runs after ledOnTime ms goes by
    digitalWrite(11,ledOFF);
    //allow switch press detection again
    flag11 = true; //true --> switch monitoring is enabled
  }

  //************************************* E x a m p l e  4
  //is it time to check the switches?
  //in particular, pushing startSwitch will turn ON/OFF (toggle) an output pin 10
  //is it time to check the switches
  if (currentMillis - SwitchMillis >= debounceMillis)
  {
    //code here runs every debounceMillis ms
    //get ready for the next iteration
    SwitchMillis += debounceMillis; 
    //go and check the switches
    checkSwitches();    
  } 

  //*********************************
  //put other non-blocking stuff here
  //*********************************

} //  >>>>>>>>>>>>>> E N D  O F  l o o p ( ) <<<<<<<<<<<<<<<<<


//======================================================================
//                      F U N C T I O N S
//======================================================================


//****************** c h e c k S w i t c h e s ( ) *********************
//switches are checked every debounceValue milli seconds 
//no minimum switch press time is validated with this code (i.e. No glitch filter)
void checkSwitches()  
{
  //re-usable for all the switches  
  boolean thisState;    

  //************************************* E x a m p l e  Push ON push OFF (toggle)   
  //check if this switch has changed state
  thisState = digitalRead(startSwitch);
  if (thisState != laststartSwitchState)
  {  
    //update the switch state
    laststartSwitchState = thisState;  

    //this switch position has changed so do some stuff

    //"HIGH condition code"
    //switch went from LOW to HIGH
    if(thisState == HIGH)        
    {
      //Do some HIGH switch stuff here
    }

    //"LOW condition code"
    //switch went from HIGH to LOW
    else                          
    {
      //Do some LOW switch stuff here  
      digitalWrite(10, !digitalRead(10));
      //print number of pushes
      counter++;
      Serial.println(counter);
    }

  } //END of startSwitch code

  //*****************************************  
  //similar code for other switches goes here 
  //*****************************************  

} //END of checkSwitches()

//**********************************************************************

//======================================================================
//                      E N D  O F  C O D E
//======================================================================

jexzy:
I want to remove the delay ();, and I've tried to do it with long-variables, but I can't figure it out... :confused:
I've attached the code below.
Thanks in advance :wink:

Are you adding other things to the code?

This is wrong. You do not define functions inside your loop() function.

void loop() {
  void updateSensor() {