Skocz do zawartości

Arduino - odczyt stanu pinu niski zamiast wysokiego


Pomocna odpowiedź

Napisano

Witam, mam prosty problem z programem Arduino, niestety jestem zielony i sam nie dam rady tego ogarnąć. 

Jak tutaj zmienić żeby program reagował na stan wysoki a nie niski na pinie 15. Teraz po uruchomieniu od razu wysyła alert a potrzebuje żeby wysłał dopiero po podaniu stanu wysokiego na ten pin. 

 

#include <SoftwareSerial.h>
//-----------------------------------------------------------------------------------
//Alert reciever's phone number with country code
const String PHONE_1 = "+480000";
const String PHONE_2 = ""; //optional
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
#define rxPin 4
#define txPin 0
SoftwareSerial sim800L(rxPin,txPin);
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
int alarm_sensor = 15;
int Alarm_detected;
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
void setup()
{
  //-----------------------------------------------------------------------------------
  //Begin serial communication: Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  //-----------------------------------------------------------------------------------
  //Begin serial communication: SIM800L
  sim800L.begin(9600);
  
  //-----------------------------------------------------------------------------------
  pinMode(alarm_sensor, INPUT);
  //----------------------------------------------------------------------------------
  delay(1000);             // 15 sec delay
  Serial.println("Initializing...");
  //Once the handshake test is successful, it will back to OK
  sim800L.println("AT");
  delay(1000);
  sim800L.println("AT+CMGF=1");
  delay(1000);
  //-----------------------------------------------------------------------------------
}
void loop()
{
  while(sim800L.available()){
  Serial.println(sim800L.readString());
  }
  
  Alarm_detected = digitalRead(alarm_sensor);
  Serial.println(Alarm_detected);
  //delay(100);
  //-----------------------------------------------------------------------------------
  //The fire is detected, trigger Alarm and send sms
  if (Alarm_detected == 0)
  {
      Serial.println("!! Piwnica Alarm !!");
      send_multi_sms();
      make_multi_call();
    }
//-----------------------------------------------------------------------------------
}
//-----------------------------------------------------------------------------------
void send_multi_sms()
{
  if(PHONE_1 != ""){
    Serial.print("Phone 1: ");
    send_sms("!! Piwnica Alarm !!", PHONE_1);
  }
  if(PHONE_2 != ""){
    Serial.print("Phone 2: ");
    send_sms("!! Piwnica Alarm !!", PHONE_2);
  }
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
void make_multi_call()
{
  if(PHONE_1 != ""){
    Serial.print("Phone 1: ");
    make_call(PHONE_1);
  }
  if(PHONE_2 != ""){
    Serial.print("Phone 2: ");
    make_call(PHONE_2);
  }
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
void send_sms(String text, String phone)
{
    Serial.println("sending sms....");
    delay(50);
    sim800L.print("AT+CMGF=1\r");
    delay(1000);
    sim800L.print("AT+CMGS=\""+phone+"\"\r");
    delay(1000);
    sim800L.print(text);
    delay(100);
    sim800L.write(0x1A); //ascii code for ctrl-26 //Serial2.println((char)26); //ascii code for ctrl-26
    delay(5000);
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
void make_call(String phone)
{
    Serial.println("calling....");
    sim800L.println("ATD"+phone+";");
    delay(20000); //20 sec delay
    sim800L.println("ATH");
    delay(1000); //1 sec delay
}

 

14 minut temu, MarekWilo napisał:

Tak już wcześniej próbowałem, niestety wtedy w ogóle program nie działa. W serial monitorze cały czas wyskakują "1".

 

 

Bo musisz ustalić jakiś konkretny stan na tym pinie...adru posiada tylko podciąganie sprzętowe na high...ty potrzebujesz podciąganie na low, czyli musisz dodać zewnętrzny rezystor między pin a gnd...coś w granicach 10k

  • Lubię! 1
(edytowany)

To nie Arduino tylko ESP8266 (Wemos D1 mini) + moduł SIM800L sterowany komendami AT, sorki że nie doprecyzowałem.

Mam też inny wsad który tylko wysyła SMS, i tam to działa tak jak trzeba wystarczy podać napięcie z pinu 3.3V na pin 15.

Tak wygląda ten działający kod:

 

#include <SoftwareSerial.h>

//Alarm reciever's phone number with country code
const String PHONE = "+48*******";

//GSM Module RX pin to Arduino 3
//GSM Module TX pin to Arduino 2
#define rxPin 4
#define txPin 0
SoftwareSerial sim800(rxPin,txPin);

//the pin that the pir sensor is atteched to
int pir_sensor = 15;

void setup() {
  pinMode(pir_sensor, INPUT);    // initialize sensor as an input
  delay(2000);
  Serial.begin(9600);          // initialize serial
  sim800.begin(9600);
  Serial.println("SIM800L software serial initialize");
  delay(15000);             // 15 sec delay
  sim800.println("AT");
  sim800.println("AT+CSQ");
}

void loop(){

//////////////////////////////////////////////////
while(sim800.available()){
  Serial.println(sim800.readString());
}
//////////////////////////////////////////////////
while(Serial.available())  {
  sim800.println(Serial.readString());
}
//////////////////////////////////////////////////
delay(3000);
  int val = digitalRead(pir_sensor);  // read sensor value
  if (val == HIGH) {                  // check if the sensor is HIGH
    //state = HIGH;
    Serial.println("Motion detected!");
sim800.print("AT+CMGF=1\r");
    delay(100);
    sim800.print("AT+CMGS=\""+PHONE+"\"\r");
    delay(100);
    sim800.print("!! ALARM PIWNICA !!");
    delay(100);
    sim800.write(0x1A); //ascii code for ctrl-26 //sim800.println((char)26); //ascii code for ctrl-26
    delay(1000);
    Serial.println("SMS Sent Successfully.");
    delay(300000);                    // 5 min delay
  }
}

 

Chodzi o tą funkcje?:

 

 int val = digitalRead(pir_sensor);  // read sensor value
  if (val == HIGH) {                  // check if the sensor is HIGH
    //state = HIGH;

 

 

Edytowano przez MarekWilo
(edytowany)

Ustawiasz pin na INPUT więc nie wiadomo jaki tam stan występuje bo nie jest "przypięty" do żadnej szyny zasilania...nie wiem czy esp8266 ma piny na low, ale pewnie ma...spróbuj 

pinMode(pir_sensor, INPUT_PULLDOWN);

Reszta bez zmian (ten if(val== 1) ma zostać)

Edytowano przez farmaceuta
4 minuty temu, farmaceuta napisał:

Reszta bez zmian (ten if(val== 1) ma zostać)

Ale mi chodzi o przerobienie tego pierwszego wsadu z pierwszego postu:

 

#include <SoftwareSerial.h>
//-----------------------------------------------------------------------------------
//Alert reciever's phone number with country code
const String PHONE_1 = "+480000";
const String PHONE_2 = ""; //optional
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
#define rxPin 4
#define txPin 0
SoftwareSerial sim800L(rxPin,txPin);
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
int alarm_sensor = 15;
int Alarm_detected;
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
void setup()
{
  //-----------------------------------------------------------------------------------
  //Begin serial communication: Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  //-----------------------------------------------------------------------------------
  //Begin serial communication: SIM800L
  sim800L.begin(9600);
  
  //-----------------------------------------------------------------------------------
  pinMode(alarm_sensor, INPUT);
  //----------------------------------------------------------------------------------
  delay(1000);             // 15 sec delay
  Serial.println("Initializing...");
  //Once the handshake test is successful, it will back to OK
  sim800L.println("AT");
  delay(1000);
  sim800L.println("AT+CMGF=1");
  delay(1000);
  //-----------------------------------------------------------------------------------
}
void loop()
{
  while(sim800L.available()){
  Serial.println(sim800L.readString());
  }
  
  Alarm_detected = digitalRead(alarm_sensor);
  Serial.println(Alarm_detected);
  //delay(100);
  //-----------------------------------------------------------------------------------
  //The fire is detected, trigger Alarm and send sms
  if (Alarm_detected == 0)
  {
      Serial.println("!! Piwnica Alarm !!");
      send_multi_sms();
      make_multi_call();
    }
//-----------------------------------------------------------------------------------
}
//-----------------------------------------------------------------------------------
void send_multi_sms()
{
  if(PHONE_1 != ""){
    Serial.print("Phone 1: ");
    send_sms("!! Piwnica Alarm !!", PHONE_1);
  }
  if(PHONE_2 != ""){
    Serial.print("Phone 2: ");
    send_sms("!! Piwnica Alarm !!", PHONE_2);
  }
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
void make_multi_call()
{
  if(PHONE_1 != ""){
    Serial.print("Phone 1: ");
    make_call(PHONE_1);
  }
  if(PHONE_2 != ""){
    Serial.print("Phone 2: ");
    make_call(PHONE_2);
  }
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
void send_sms(String text, String phone)
{
    Serial.println("sending sms....");
    delay(50);
    sim800L.print("AT+CMGF=1\r");
    delay(1000);
    sim800L.print("AT+CMGS=\""+phone+"\"\r");
    delay(1000);
    sim800L.print(text);
    delay(100);
    sim800L.write(0x1A); //ascii code for ctrl-26 //Serial2.println((char)26); //ascii code for ctrl-26
    delay(5000);
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
void make_call(String phone)
{
    Serial.println("calling....");
    sim800L.println("ATD"+phone+";");
    delay(20000); //20 sec delay
    sim800L.println("ATH");
    delay(1000); //1 sec delay
}

 

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...