Skocz do zawartości

Pomiar prądu + czujnik poziomu cieczy


Pomocna odpowiedź

Użyłem takiego kodu, jednak układ nie działa poprawnie.

Działa tylko pływak_2 i uruchamia 2 diody, mało tego- zmiana stanu zachodzi po dwukrotnym przesunięciu pływaka góra/dół.

// This example toggles the debug LED (pin 13) on or off when a button on pin 2 is pressed.

// Include the Bounce2 library found here :
// https://github.com/thomasfredericks/Bounce2
#include <Bounce2.h>

#define PLYWAK_1 0
#define LED_PIN_1 13
#define PLYWAK_2 3
#define LED_PIN_2 12

int ledState_1 = LOW;
int ledState_2 = LOW;


Bounce b = Bounce(); // Instantiate a Bounce object

void setup() {
  
  b.attach(PLYWAK_1,INPUT_PULLUP); // Attach the debouncer to a pin with INPUT_PULLUP mode
  b.interval(25); // Use a debounce interval of 25 milliseconds
  
  b.attach(PLYWAK_2,INPUT_PULLUP); // Attach the debouncer to a pin with INPUT_PULLUP mode
  b.interval(25); // Use a debounce interval of 25 milliseconds
  
  pinMode(LED_PIN_1,OUTPUT); // Setup the LED
  digitalWrite(LED_PIN_1,ledState_1); // Turn off the LED

  pinMode(LED_PIN_2,OUTPUT); // Setup the LED
  digitalWrite(LED_PIN_2,ledState_2); // Turn off the LED
 
}

void loop() {

   b.update(); // Update the Bounce instance
   
   if ( b.rose() ) {  // Call code if button transitions from HIGH to LOW
     ledState_1 = !ledState_1; // Toggle LED state
     digitalWrite(LED_PIN_1,ledState_1); // Apply new LED state
   }

   if ( b.rose() ) {  // Call code if button transitions from HIGH to LOW
     ledState_2 = !ledState_2; // Toggle LED state
     digitalWrite(LED_PIN_2,ledState_2); // Apply new LED state
   }
}

 

Zrobiłem 2 obiekty, jednak cąły czas przełączanie działa na 2 razy.

Postanowiłem zrobić program od nowa na samych IF(ach). Status LED działa prawidłowo, jednak jak już dołączam pustą pętlę to przestaje działać.

Pytanie co zrobić, aby otrzymywać powiadomienie o zmianie statusu tylko gdy zmiana wystąpi?


#define LED1 13
#define plywak1 0
#define LED2 12
#define plywak2 3

void setup() {
  Serial.begin(9600);
  Serial.println("Witaj!");
  pinMode(LED1, OUTPUT);
  pinMode(plywak1, INPUT_PULLUP);
  pinMode(LED2, OUTPUT);
  pinMode(plywak2, INPUT_PULLUP);
}

void loop() {
if (digitalRead(plywak1) == HIGH) {
  digitalWrite(LED1, HIGH); 
 // Serial.println("Plywak 1 woda");
  //while (digitalRead(plywak1) == HIGH) {
//    delay(25); 
  //  }
} if (digitalRead(plywak1) == LOW) {
  digitalWrite(LED1, LOW);
  //Serial.println("Plywak 1 bez wody");
    //  while (digitalRead(plywak1) == LOW) {
      //delay(25);
 // }
}
 if (digitalRead(plywak2) == HIGH) {
  digitalWrite(LED2, HIGH); 
  } 
  
  if (digitalRead(plywak2) == LOW) {
  digitalWrite(LED2, LOW); 
}
}

 

(edytowany)

Kurka nie mogłem go znaleźć, już tyle różnych kopii zapisywałem 🙂

Ale poszukałem trochę po bibliotekach i chyba znalazłem to co się sprawdzi. Biblioteka się nazywa "Switch": by Albert van Dalen" wykorzystałem jeden z plików Example do tej biblioteki.

Kod jest dość prosty i co najważniejsze działa póki co po Serial, teraz muszę tylko wkomponować to razem z Telegramem i dodać diody LED.

#include "Arduino.h"
#include "avdweb_Switch.h"

const byte pushButtonpin1 = 0;
const byte pushButtonpin2 = 2;

int i;

Switch pushButton1 = Switch(pushButtonpin1); // button to GND, use internal 20K pullup resistor
Switch pushButton2 = Switch(pushButtonpin2); // button to GND, use internal 20K pullup resistor

void setup()
{ Serial.begin(9600);
}

void loop()
{
  pushButton1.poll();
  pushButton2.poll();
  if(pushButton1.switched()) Serial.print("pushButton1 switched ");
  if(pushButton2.switched()) Serial.print("pushButton2 switched ");
  if(pushButton1.pushed()) {Serial.print("pushButton1 pushed "); Serial.print(++i); Serial.println(" times");}
  if(pushButton2.pushed()) {Serial.print("pushButton2 pushed "); Serial.print(++i); Serial.println(" times");}
  
  if(pushButton1.released()) Serial.println("pushButton released");
  if(pushButton2.released()) Serial.println("pushButton released");

}

 

Edytowano przez Krisk

No i gotowe:)

Udało się, po kilkunastu godzinach błądzenia w końcu program gotowy.

Po zmianie stanu pływaka 0/1  i 1/0 niezależnie 1 i 2 otrzymuję powiadomienia na tel przez Telegram:)

Mam jeszcze 2 techniczne pytania:

1. ,Moje pływaki są tak naprawdę kontaktronami i pytanie, czy mogą być tak podłączone- czyli przewody bezpośrednio do GND a drugi do GPIO. Gdzieś czytałem, że należy użyć rezystora.

2. Planuję dodatkowo do pompy podłączyć moduł pomiaru prądu ACS712 i dodać go do programu. Ale też myślę, o innym rozwiązaniu, gdzieś mi się o uszy odbiło, że montaż kontaktronu bezpośrednio przy przewodzie zasilającym (w moim przypadku pompy) w przypadku przepływy prądu przez przewód kontaktron zareaguje- czy tak będzie?

 

#include "Arduino.h"
#include "avdweb_Switch.h"

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>

const byte pushButtonpin1 = 0;
const byte pushButtonpin2 = 2;

const char* ssid = "xxxxxx";
const char* password = "xxxxx";

// Initialize Telegram BOT
#define BOTtoken "xxxxxxx:xxxxxxxxxxxxxxxx"  // your Bot Token (Get from Botfather)

// Use @myidbot to find out the chat ID of an individual or a group
// Also note that you need to click "start" on a bot before it can
// message you
#define CHAT_ID "xxxxxxxxxxxx"

X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

int i;
int j;

Switch pushButton1 = Switch(pushButtonpin1); // button to GND, use internal 20K pullup resistor
Switch pushButton2 = Switch(pushButtonpin2); // button to GND, use internal 20K pullup resistor

#define LED1 12
#define LED2 13


void setup()
{ Serial.begin(9600);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);

configTime(0, 0, "pool.ntp.org");      // get UTC time via NTP
  client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org

    // Connect to Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected");  

    bot.sendMessage(CHAT_ID, "System aktywny", "");


}

void loop()
{ 
  pushButton1.poll();
  pushButton2.poll();

  if(pushButton1.switched()) { Serial.print("PLYWAK 1 ");
  digitalWrite(LED1, LOW); 
  //bot.sendMessage(CHAT_ID, "PLYWAK 1");
  }

  if(pushButton1.pushed()) {Serial.print("WODA- URUCHOMIONY "); Serial.print(++i); Serial.println(" RAZY");
    digitalWrite(LED1, HIGH);
    bot.sendMessage(CHAT_ID, "PLYWAK 1 URUCHOMIONY- WODA!!! ");}

  if(pushButton2.switched()) { Serial.print("PLYWAK 2 ");
    digitalWrite(LED2, LOW); 
  }
  
  if(pushButton2.pushed()) {Serial.print("WODA- URUCHOMIONY "); Serial.print(++j); Serial.println(" RAZY");
  digitalWrite(LED2, HIGH);
  bot.sendMessage(CHAT_ID, "PLYWAK 2 URUCHOMIONY- WODA!!! ");
   }

  if(pushButton1.released()) {Serial.println("OPUSZCZONY");
  bot.sendMessage(CHAT_ID, "PLYWAK 1 OPUSZCZONY ");
  }
  if(pushButton2.released()) {Serial.println("OPUSZCZONY");
  bot.sendMessage(CHAT_ID, "PLYWAK 2 OPUSZCZONY ");}

}

 

(edytowany)
3 godziny temu, Krisk napisał:

należy użyć rezystora

Już używasz wbudowanego do procesora, bo w zastosowanej bibliotece konstruktor klasy Switch używa domyślnie PinMode=INPUT_PULLUP

3 godziny temu, Krisk napisał:

w przypadku przepływy prądu przez przewód kontaktron zareaguje- czy tak będzie?

To zależy.

Prąd musi być prądem stałym, o dość dużym natężeniu, (ew. parę zwoi jako cewka) i odpowiednie wzajemne położenie obu tych elementów. Możesz poeksperymentować.

Edytowano przez jand

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...