Go Down

Topic: Having problem with my DIY alarm system code (Read 264 times) previous topic - next topic

DarkxRift

What I meant to do is before I armed the alarm all sensor are not activate, after the correct code has been entered, five seconds for the person to leave the area, all sensors start to do its work, if front door(which is reed switch) is triggered, ten second countdown for the person to enter password, I'm just struggling over that even I enter the correct code, the countdown still goes on.

gpop1

What I meant to do is before I armed the alarm all sensor are not activate, after the correct code has been entered, five seconds for the person to leave the area, all sensors start to do its work, if front door(which is reed switch) is triggered, ten second countdown for the person to enter password, I'm just struggling over that even I enter the correct code, the countdown still goes on.
this post is going to go on for a while so its a good idea after any changes to re-post the current code you are using. I would like to help but im not sure what your current code looks like.

DarkxRift

My current code looks like this:

Code: [Select]
/*
Transplant Wiring
Arduino GND   -> Breadboard
Arduino +5V   -> Breadboard
Arduino 8     -> Speaker
Arduino 7     -> Reed_Switch
Arduino 4     -> PIR_Sensor
Arduino A0    -> Photo_Resistor
Arduino A4    -> PCF8574 - LCD/Keypad
Arduino A5    -> PCF8574 - LCD/Keypad
*/

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <i2ckeypad.h>

#define Speaker 8
#define Switch 7
#define PIR 4
#define P_R A0
#define PCF8574_ADDR 0x20

#define ROWS 4
#define COLS 4


char* ourCode = "1234";
int currentPosition = 0;
//keypad variable

int reedPin = 0;
//Reed Switch variable

int pirPin = 0;
//PIR Sensor variable

int phPin = 0;
//Photo Resistor variable

int alarmActive = 0;
int alarmStatus = 0;
int zone;

int interval_reed = 9000;

LiquidCrystal_I2C lcd (0x38, 16, 2); // set the LCD address to 0x20 for a 16 chars and 2 line display
i2ckeypad kpd = i2ckeypad(PCF8574_ADDR, ROWS, COLS);

void setup()
{
  pinMode(Speaker, OUTPUT);
  //Speaker variable

  pinMode(PIR, INPUT);
  //PIR Sensor variable

  pinMode(Switch, INPUT);
  digitalWrite(Switch, HIGH);
  //Reed Switch variable

  pinMode(P_R, INPUT);
  //Photo Resistor variable

  Wire.begin();
  Serial.begin(9600);

  kpd.init();
  //keypad variable

  lcd.init();
  lcd. backlight();
  displayEntryCodeScreen();

}

void loop()
{

  checkPass();



  if (alarmActive == 1)
  {
    pirPin = digitalRead(PIR);
    phPin = analogRead(P_R);
    reedPin = digitalRead(Switch);

    if (reedPin == HIGH && alarmStatus == 0)
    {

      zone = 0;
      alarmTriggered();
      alarmStatus = 1;

    }

    else if (pirPin == HIGH && alarmStatus == 0)
    {

      zone = 1;
      alarmStatus = 1;
      alarmTriggered();
    }

    else if (phPin < 700 && alarmStatus == 0)
    {

      zone = 2;
      alarmStatus = 1;
      alarmTriggered();
    }
  }

}


void checkPass()
{
  char key = kpd.get_key();
  if (int(key) != 0)
  {
    lcd.setCursor(14, 3);
    lcd.print("     ");
    lcd.setCursor(14, 3);

    if (key == ourCode[currentPosition])
    {
      ++currentPosition;
      if (currentPosition == 4 && alarmActive == 0 )
      {
        armAlarm();
        currentPosition = 0;
      }
      else if (currentPosition == 4  && alarmActive == 1 )
      {
        disarmAlarm();
        currentPosition = 0;
      }
    }
    else if (key != ourCode[currentPosition] && alarmActive == 0)
    {
      invalidCode_1();
      currentPosition = 0;
    }
    else if (key != ourCode[currentPosition] && alarmActive == 1)
    {
      invalidCode_2();
      currentPosition = 0;
    }
  }
}

void armAlarm()// alarm armed and countdown start
{
  clearScreen();
  lcd.setCursor(0, 0);
  lcd.print("   Alarm ARMED    ");
  noTone(Speaker);
  delay(1000);
  countDown_1();

}

void countDown_1()// alarm countdown
{
  lcd.setCursor(0, 0);
  lcd.print("Countdown Start  ");
  int count = 5;
  while (count != 0 )
  {
    count--;
    lcd.setCursor(0, 1);
    lcd.print("------ ");
    lcd.print(count);
    lcd.print(" -------");
    delay(1000);
  }
  if (count == 0)
  {
    clearScreen();
    lcd.setCursor(0, 0);
    lcd.print("<<System READY>>");
    alarmActive = 1;
  } // when countdown reach zero


}

void countDown_2()
{
  clearScreen();

  lcd.setCursor(0, 0);
  lcd.print("-Enter Password-");
  int count = 10;

  unsigned long passTimeout = millis();

  while((millis() - passTimeout) < interval_reed)
  {
    chcekPass();
  }



  if ((millis() - passTimeout) < interval_reed)
  {
    lcd.setCursor(0, 0);
    lcd.print("Countdown Ended ");
    lcd.setCursor(0, 1);
    lcd.println("Alarm Triggered!");
    tone(Speaker, 1200);
  }
}



void disarmAlarm()// code for disarming alarm
{
  lcd.setCursor(0, 0);
  lcd.print(" Alarm DISARMED ");
  lcd.setCursor(0, 1);
  lcd.println(" Access GRANTED  ");
  noTone(Speaker);
  alarmStatus = 0;
  alarmActive = 0;

  delay(1000);
  displayEntryCodeScreen();
}

void invalidCode_1()// when alarm is not armed even if password input is incorrect no tone will be sound
{
  lcd.setCursor(0, 0);
  lcd.print("  Access DENIED ");
  lcd.setCursor(0, 1);
  lcd.println("  Invalid code  ");

}

void invalidCode_2()// when alarm is not armed even if password input is incorrect no tone will be sound
{

  lcd.setCursor(0, 0);
  lcd.print("  Access DENIED ");
  lcd.setCursor(0, 1);
  lcd.println("  Invalid code  ");
  tone (Speaker, 1200);
}

void clearScreen()// code for clearing the screen
{
  lcd.setCursor(0, 0);
  lcd.print("                          ");
  lcd.setCursor(0, 1);
  lcd.print("                          ");
}

void displayEntryCodeScreen()// code for displaying the entry code screen
{
  clearScreen();
  lcd.setCursor(0, 0);
  lcd.print("-Enter Password-");
}



void alarmTriggered() // when alarm is triggered, which zone will be printed on the LCD and tone will play
{

  clearScreen();
  lcd.setCursor(0, 0);
  lcd.print("Alarm Triggered!");

  if (zone == 0)// if zone one is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Countdown Start ");

  }



  if (zone == 1)// if zone one is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Motion in Zone 1 ");
    tone(Speaker, 1200);
  }
  if (zone == 2)// if zone two is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Motion in Zone 2 ");
    tone(Speaker, 1200);
  }
}


I have change this part:

Code: [Select]

void countDown_2()
{
  clearScreen();

  lcd.setCursor(0, 0);
  lcd.print("-Enter Password-");
  int count = 10;

  unsigned long passTimeout = millis();

  while((millis() - passTimeout) < interval_reed)
  {
    chcekPass();
  }



  if ((millis() - passTimeout) < interval_reed)
  {
    lcd.setCursor(0, 0);
    lcd.print("Countdown Ended ");
    lcd.setCursor(0, 1);
    lcd.println("Alarm Triggered!");
    tone(Speaker, 1200);
  }
}


everything else works fine, the after I've disarm the alarm I can still arm the alarm, sensor still work, but the reed switch countdown, I've set it to 10 seconds chance to check password but I've no idea how to make the alarm go off cause even if I wait for 10 seconds the alarm didn't go off, another thing is, is there anyway to show that the loop is counting down like the arming alarm countdown loop?

Code: [Select]

void countDown_1()// alarm countdown
{
  lcd.setCursor(0, 0);
  lcd.print("Countdown Start  ");
  int count = 5;
  while (count != 0 )
  {
    count--;
    lcd.setCursor(0, 1);
    lcd.print("------ ");
    lcd.print(count);
    lcd.print(" -------");
    delay(1000);
  }
  if (count == 0)
  {
    clearScreen();
    lcd.setCursor(0, 0);
    lcd.print("<<System READY>>");
    alarmActive = 1;
  } // when countdown reach zero


}

gpop1

  chcekPass();

that doesn't look right

maybe you mean  checkPass();
which calls a function

seriously got to get you to avoid using "while"

gpop1

the code especially involving the lcd is all over the place. functions when used correctly have useful purposes. When used incorrectly its just a program that jumps all over the place and makes mistakes easy to make and hard to spot

This program should have no more than 4 functions

1/ state machine for the alarm
2/ keypad code
3/ lcd code
4/ audio alarm

The idea of a function is to allow for easy trouble shooting

thing like

Code: [Select]
void clearScreen()// code for clearing the screen
{
  lcd.setCursor(0, 0);
  lcd.print("                          ");
  lcd.setCursor(0, 1);
  lcd.print("                          ");
}


make no sense as the lcd library already has a code to do that

Code: [Select]
lcd.clear();

jumping from function to function all the time writing info to the screen is going to cause problems.

If you write to line one then switch function and rewrite to the same line its going to cause problems.

Ive tried to address some of the issues but its hard to follow. (it may be easier seeing this on the display then fixing the problems). A better way would be to use flags then use a function called display and keep the different screen separated using a "switch/ case".

I don't think this will work but ive tried to clean up the code and fix some of the mistakes. The fact that I can not see all of the problems indicates that theres a problem with the plan.

Code: [Select]
/*
Transplant Wiring
Arduino GND   -> Breadboard
Arduino +5V   -> Breadboard
Arduino 8     -> Speaker
Arduino 7     -> Reed_Switch
Arduino 4     -> PIR_Sensor
Arduino A0    -> Photo_Resistor
Arduino A4    -> PCF8574 - LCD/Keypad
Arduino A5    -> PCF8574 - LCD/Keypad
*/

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <i2ckeypad.h>

#define Speaker 8
#define Switch 7
#define PIR 4
#define P_R A0
#define PCF8574_ADDR 0x20

#define ROWS 4
#define COLS 4


char* ourCode = "1234";
int currentPosition = 0;
//keypad variable

int reedPin = 0;
//Reed Switch variable

int pirPin = 0;
//PIR Sensor variable

int phPin = 0;
//Photo Resistor variable

int alarmActive = 0;
int alarmStatus = 0;
int zone;

int interval_reed = 9000;
byte count = 10;
byte count2 = 5;
LiquidCrystal_I2C lcd (0x38, 16, 2); // set the LCD address to 0x20 for a 16 chars and 2 line display
i2ckeypad kpd = i2ckeypad(PCF8574_ADDR, ROWS, COLS);

void setup()
{
  pinMode(Speaker, OUTPUT);
  //Speaker variable

  pinMode(PIR, INPUT);
  //PIR Sensor variable

  pinMode(Switch, INPUT);
  digitalWrite(Switch, HIGH);
  //Reed Switch variable

  pinMode(P_R, INPUT);
  //Photo Resistor variable

  Wire.begin();
  Serial.begin(9600);

  kpd.init();
  //keypad variable

  lcd.init();
  lcd. backlight();
  displayEntryCodeScreen();

}

void loop()
{

  checkPass();



  if (alarmActive == 1)
  {
    pirPin = digitalRead(PIR);
    phPin = analogRead(P_R);
    reedPin = digitalRead(Switch);

    if (reedPin == HIGH && alarmStatus == 0)
    {

      zone = 0;
      alarmTriggered();
      alarmStatus = 1;

    }

    else if (pirPin == HIGH && alarmStatus == 0)
    {

      zone = 1;
      alarmStatus = 1;
      alarmTriggered();
    }

    else if (phPin < 700 && alarmStatus == 0)
    {

      zone = 2;
      alarmStatus = 1;
      alarmTriggered();
    }
  }

}


void checkPass()
{
  char key = kpd.get_key();
  if (int(key) != 0)
  {
    if (key == ourCode[currentPosition])
    {
      ++currentPosition;
      if (currentPosition == 4 && alarmActive == 0 )
      {
        armAlarm();
        count2=5;
        currentPosition = 0;
      }
      else if (currentPosition == 4  && alarmActive == 1 )
      {
        disarmAlarm();
        counter = 10;
        currentPosition = 0;
      }
    }
    else if (key != ourCode[currentPosition] && alarmActive == 0)
    {
      invalidCode_1();
      currentPosition = 0;
    }
    else if (key != ourCode[currentPosition] && alarmActive == 1)
    {
      invalidCode_2();
      currentPosition = 0;
    }
  }
  lcd.setCursor(0, 4);
  currentpoistion == 1 ? lcd.print("*") : lcd.print("---");
  currentpoistion == 2 ? lcd.print("**") : lcd.print("--");
  currentpoistion == 3 ? lcd.print("***") : lcd.print("-");
  currentpoistion == 4 ? lcd.print("****") : void;



}

void armAlarm()// alarm armed and countdown start
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   Alarm ARMED    ");
  noTone(Speaker);
  delay(1000);
  countDown_1();

}

void countDown_1()// alarm countdown
{
  unsigned long currentTime = millis();
  static unsigned long lastTime;

  lcd.setCursor(0, 0);
  lcd.print("Countdown Start  ");

  if (currentTime2 - lastTime2 > 1000)
  {
    count2--;
    lastTime2 = currentTime2;
  }


  if (count2 != 0 )
  {
    lcd.setCursor(0, 6);
    lcd.print("timer: ");
    lcd.print (counter);
  }

  if (count2 == 0)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("<<System READY>>");
    alarmActive = 1;
  } // when countdown reach zero


}

void countDown_2()
{
  static int count = 10;
  unsigned long currentTime = millis();
  static unsigned long lastTime;

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("-Enter Password-");


  if (currentTime - lastTime > 1000)
  {
    count--;
    lastTime = currentTime;
  }

  if (count != 0)
  {
    checkPass();
  }

  if (count == 0)
  {
    lcd.setCursor(0, 0);
    lcd.print("Countdown Ended ");
    lcd.setCursor(0, 1);
    lcd.println("Alarm Triggered!");
    tone(Speaker, 1200);
  }
  lcd.setCursor(0, 6);
  lcd.print("timer: ");
  lcd.print (counter);

}



void disarmAlarm()// code for disarming alarm
{
  lcd.setCursor(0, 0);
  lcd.print(" Alarm DISARMED ");
  lcd.setCursor(0, 1);
  lcd.println(" Access GRANTED  ");
  noTone(Speaker);
  alarmStatus = 0;
  alarmActive = 0;

  delay(1000);
  displayEntryCodeScreen();
}

void invalidCode_1()// when alarm is not armed even if password input is incorrect no tone will be sound
{
  lcd.setCursor(0, 0);
  lcd.print("  Access DENIED ");
  lcd.setCursor(0, 1);
  lcd.println("  Invalid code  ");

}

void invalidCode_2()// when alarm is not armed even if password input is incorrect no tone will be sound
{

  lcd.setCursor(0, 0);
  lcd.print("  Access DENIED ");
  lcd.setCursor(0, 1);
  lcd.println("  Invalid code  ");
  tone (Speaker, 1200);
}

void displayEntryCodeScreen()// code for displaying the entry code screen
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("-Enter Password-");
}



void alarmTriggered() // when alarm is triggered, which zone will be printed on the LCD and tone will play
{

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Alarm Triggered!");

  if (zone == 0)// if zone one is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Countdown Start ");

  }

  if (zone == 1)// if zone one is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Motion in Zone 1 ");
    tone(Speaker, 1200);
  }
  if (zone == 2)// if zone two is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Motion in Zone 2 ");
    tone(Speaker, 1200);
  }
}



DarkxRift

the code especially involving the lcd is all over the place. functions when used correctly have useful purposes. When used incorrectly its just a program that jumps all over the place and makes mistakes easy to make and hard to spot

This program should have no more than 4 functions

1/ state machine for the alarm
2/ keypad code
3/ lcd code
4/ audio alarm

The idea of a function is to allow for easy trouble shooting

thing like

Code: [Select]
void clearScreen()// code for clearing the screen
{
  lcd.setCursor(0, 0);
  lcd.print("                          ");
  lcd.setCursor(0, 1);
  lcd.print("                          ");
}


make no sense as the lcd library already has a code to do that

Code: [Select]
lcd.clear();

jumping from function to function all the time writing info to the screen is going to cause problems.

If you write to line one then switch function and rewrite to the same line its going to cause problems.

Ive tried to address some of the issues but its hard to follow. (it may be easier seeing this on the display then fixing the problems). A better way would be to use flags then use a function called display and keep the different screen separated using a "switch/ case".

I don't think this will work but ive tried to clean up the code and fix some of the mistakes. The fact that I can not see all of the problems indicates that theres a problem with the plan.

Code: [Select]
/*
Transplant Wiring
Arduino GND   -> Breadboard
Arduino +5V   -> Breadboard
Arduino 8     -> Speaker
Arduino 7     -> Reed_Switch
Arduino 4     -> PIR_Sensor
Arduino A0    -> Photo_Resistor
Arduino A4    -> PCF8574 - LCD/Keypad
Arduino A5    -> PCF8574 - LCD/Keypad
*/

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <i2ckeypad.h>

#define Speaker 8
#define Switch 7
#define PIR 4
#define P_R A0
#define PCF8574_ADDR 0x20

#define ROWS 4
#define COLS 4


char* ourCode = "1234";
int currentPosition = 0;
//keypad variable

int reedPin = 0;
//Reed Switch variable

int pirPin = 0;
//PIR Sensor variable

int phPin = 0;
//Photo Resistor variable

int alarmActive = 0;
int alarmStatus = 0;
int zone;

int interval_reed = 9000;
byte count = 10;
byte count2 = 5;
LiquidCrystal_I2C lcd (0x38, 16, 2); // set the LCD address to 0x20 for a 16 chars and 2 line display
i2ckeypad kpd = i2ckeypad(PCF8574_ADDR, ROWS, COLS);

void setup()
{
  pinMode(Speaker, OUTPUT);
  //Speaker variable

  pinMode(PIR, INPUT);
  //PIR Sensor variable

  pinMode(Switch, INPUT);
  digitalWrite(Switch, HIGH);
  //Reed Switch variable

  pinMode(P_R, INPUT);
  //Photo Resistor variable

  Wire.begin();
  Serial.begin(9600);

  kpd.init();
  //keypad variable

  lcd.init();
  lcd. backlight();
  displayEntryCodeScreen();

}

void loop()
{

  checkPass();



  if (alarmActive == 1)
  {
    pirPin = digitalRead(PIR);
    phPin = analogRead(P_R);
    reedPin = digitalRead(Switch);

    if (reedPin == HIGH && alarmStatus == 0)
    {

      zone = 0;
      alarmTriggered();
      alarmStatus = 1;

    }

    else if (pirPin == HIGH && alarmStatus == 0)
    {

      zone = 1;
      alarmStatus = 1;
      alarmTriggered();
    }

    else if (phPin < 700 && alarmStatus == 0)
    {

      zone = 2;
      alarmStatus = 1;
      alarmTriggered();
    }
  }

}


void checkPass()
{
  char key = kpd.get_key();
  if (int(key) != 0)
  {
    if (key == ourCode[currentPosition])
    {
      ++currentPosition;
      if (currentPosition == 4 && alarmActive == 0 )
      {
        armAlarm();
        count2=5;
        currentPosition = 0;
      }
      else if (currentPosition == 4  && alarmActive == 1 )
      {
        disarmAlarm();
        counter = 10;
        currentPosition = 0;
      }
    }
    else if (key != ourCode[currentPosition] && alarmActive == 0)
    {
      invalidCode_1();
      currentPosition = 0;
    }
    else if (key != ourCode[currentPosition] && alarmActive == 1)
    {
      invalidCode_2();
      currentPosition = 0;
    }
  }
  lcd.setCursor(0, 4);
  currentpoistion == 1 ? lcd.print("*") : lcd.print("---");
  currentpoistion == 2 ? lcd.print("**") : lcd.print("--");
  currentpoistion == 3 ? lcd.print("***") : lcd.print("-");
  currentpoistion == 4 ? lcd.print("****") : void;



}

void armAlarm()// alarm armed and countdown start
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   Alarm ARMED    ");
  noTone(Speaker);
  delay(1000);
  countDown_1();

}

void countDown_1()// alarm countdown
{
  unsigned long currentTime = millis();
  static unsigned long lastTime;

  lcd.setCursor(0, 0);
  lcd.print("Countdown Start  ");

  if (currentTime2 - lastTime2 > 1000)
  {
    count2--;
    lastTime2 = currentTime2;
  }


  if (count2 != 0 )
  {
    lcd.setCursor(0, 6);
    lcd.print("timer: ");
    lcd.print (counter);
  }

  if (count2 == 0)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("<<System READY>>");
    alarmActive = 1;
  } // when countdown reach zero


}

void countDown_2()
{
  static int count = 10;
  unsigned long currentTime = millis();
  static unsigned long lastTime;

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("-Enter Password-");


  if (currentTime - lastTime > 1000)
  {
    count--;
    lastTime = currentTime;
  }

  if (count != 0)
  {
    checkPass();
  }

  if (count == 0)
  {
    lcd.setCursor(0, 0);
    lcd.print("Countdown Ended ");
    lcd.setCursor(0, 1);
    lcd.println("Alarm Triggered!");
    tone(Speaker, 1200);
  }
  lcd.setCursor(0, 6);
  lcd.print("timer: ");
  lcd.print (counter);

}



void disarmAlarm()// code for disarming alarm
{
  lcd.setCursor(0, 0);
  lcd.print(" Alarm DISARMED ");
  lcd.setCursor(0, 1);
  lcd.println(" Access GRANTED  ");
  noTone(Speaker);
  alarmStatus = 0;
  alarmActive = 0;

  delay(1000);
  displayEntryCodeScreen();
}

void invalidCode_1()// when alarm is not armed even if password input is incorrect no tone will be sound
{
  lcd.setCursor(0, 0);
  lcd.print("  Access DENIED ");
  lcd.setCursor(0, 1);
  lcd.println("  Invalid code  ");

}

void invalidCode_2()// when alarm is not armed even if password input is incorrect no tone will be sound
{

  lcd.setCursor(0, 0);
  lcd.print("  Access DENIED ");
  lcd.setCursor(0, 1);
  lcd.println("  Invalid code  ");
  tone (Speaker, 1200);
}

void displayEntryCodeScreen()// code for displaying the entry code screen
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("-Enter Password-");
}



void alarmTriggered() // when alarm is triggered, which zone will be printed on the LCD and tone will play
{

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Alarm Triggered!");

  if (zone == 0)// if zone one is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Countdown Start ");

  }

  if (zone == 1)// if zone one is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Motion in Zone 1 ");
    tone(Speaker, 1200);
  }
  if (zone == 2)// if zone two is triggered
  {
    lcd.setCursor(0, 1);
    lcd.print("Motion in Zone 2 ");
    tone(Speaker, 1200);
  }
}



I've try the code you gave me, It turns out even the first count down stop working :(

BulldogLowell

I've try the code you gave me, It turns out even the first count down stop working :(
did you try what I posted using the Serial Monitor?

DarkxRift

yes i've tried the code you gave me, solved that and another problem pops up, not related actually.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy