Skocz do zawartości

Brak wyświetlania alarmu po przekroczeniu napięcia - woltomierz


mmajorek01

Pomocna odpowiedź

Witam serdecznie!

Dopiero zaczynam przygodę z Arduino i chciałbym zrobić woltomierz z alarmem przekroczenia pewnego napięcia. Bez „blokad” jest o wile prościej, ale wrzuciłem te blokady i się skomplikowało. Mam już pewien kod, ale myślę że ma trochę niedociągnięć. Wiem, że powonieniem zastosować „String” lub „char” i tak też zrobiłem. Ale chciałbym, aby to wyglądało inaczej.

Gdy już program działa to na wyświetlaczu ssd1306 po przekroczeniu wartości 2v napis „ALARM” mruga. Chciałbym, aby się po prostu pojawił i wyświetlał do póki napięcie nie spadnie poniżej tych 2V, potem jeśli znów wzrośnie to aby znów się pojawił. Proszę Was o pomoc. Sporo czasu nad tym spędziłem i nie udało mi się. Myślę, że to nie jest trudne (pewnie coś pomieszałem z warunkami, albo klamrami), ale nie wiem jak to ugryźć.

#include <Arduino.h>
#include <U8g2lib.h>
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);   
       
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
const String alarm = "ALARM";
float R1 = 1000000.0; // resistance of R1 (100K)
float R2 = 10000.0; // resistance of R2 (10K) 
int value = 0;

const int ledPin = 13;
const int buzzerPin = 12;

int blokada = 0;
int blokada2 = 0;

void setup()
{
  u8g2.begin();
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(analogInput, INPUT); 
}
void loop(){
   
   value = analogRead(analogInput);
   vout = (value * 5.0) / 1024.0; 
   vin = vout / (R2/(R1+R2)); 
   if (vin<0.09) {
   vin=0.0;
   }
 if ((vin >= 200) && (blokada == 0))  { 

    tone(buzzerPin, 200); 
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    delay(1000); 
    u8g2.clearBuffer();   
 
    blokada = 1;
    blokada2 = 0;
  }
if ((vin < 200) && (blokada2 == 0))
  {
    tone(buzzerPin, 200); 
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
   
    delay(1000); 
   
    blokada2 = 1;
    blokada = 0;
       
} 

if (vin > 200) // mruga napis "ALARM", chciałbym aby się zaświecił i był do czasu ponownego spadku napiecia poniżej 2 V
  {
   
    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.setCursor(0, 25); 
    u8g2.print(alarm);
    u8g2.sendBuffer();  
     
} 
    noTone(buzzerPin);
    digitalWrite(ledPin, LOW);
    delay(100); 

  u8g2.clearBuffer();          
  u8g2.setFont(u8g2_font_ncenB10_tr);
  u8g2.drawStr(0,12,"Czujnik ! !");  
  
  u8g2.setCursor(50, 50);
  u8g2.setFont(u8g2_font_ncenB18_tr);
  //u8g2.setFont(u8g2_font_courR10_tf);
  u8g2.print(vin/100);
  u8g2.sendBuffer();          
  delay(1000); 
}

Z góry bardzo dziękuję za odpowiedzi.

Link do komentarza
Share on other sites

Dzięki za szybką odp. Wiem że tym zapisem chcesz mnie nakłonić do myślenia, ale moja wiedza na temat programowania jeszcze nie jest na takim poziomie. Każdy kiedyś zaczynał... Możesz mi to trochę rozjaśnić?

Podałes mi wzór. Ale ja chciałbym aby wyswietlił się napis Alarm. Dzięki.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

"vin" wynosi 200 przy 2V, tak zostało ustawione, aby ułatwić przeliczanie.

Powiem szczerze, że na bibliotekach Adafruit_GFX oraz Adafruit_SSD1306 poradziłem sobie z tym, a na bibliotece "U8g2lib.h"  coś robię nie tak.

Czyli byłem w błędzie myśląc że użyję "String" lub "char"?

Link do komentarza
Share on other sites

ta linijka

u8g2.drawStr(0,12,"Czujnik ! !");  

u góry na monitorze (SSD1306) wpisuje "Czujnik ! !"  Jest to wpisane na stałe od początku programu.

a chciałbym aby po przekroczeniu tych 2v poniżej tego napisu wskoczył napis "ALARM" ze względu na  przekroczenie tej wartości. Ale jeśli jest napięcie niższe to aby się nie wyświetlał.

Myślałem że kod

if (vin > 200) 
  {
   
    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.setCursor(0, 25); 
    u8g2.print(alarm);
    u8g2.sendBuffer();  
     

sprawi że ten napis będzie wyświetlany poniżej, ale on nie wyświetla się tylko mruga..., niby nie wieka to różnica ale nie wiem ale chciałbym aby nie mrugał.

 

Link do komentarza
Share on other sites

wkleiłem kod u gory odrazu po loop() a później po linijce

if ((vin >= 200) && (blokada == 0))  {

wspolrzedne (cursor) ustawiłem już wcześniej na  u8g2.setCursor(0, 25); i w tych współrzędnych dalej mi mruga.

Niestety przeniesienie tego powyższego kodu wyżej nic nie dało.

Link do komentarza
Share on other sites

Wklej caly ten kod bo cos mnie oszukujesz😉

Ok...blad popelnilem... 

static bool flaga = 0
static bool x = 1
  
 if (vin < 200) {
  flaga = 1;
  } else {
  flaga = 0;
  x = 1
 u8g2.drawStr(0,12,"     ");  
}

if (flaga == 1 && x == 1) {
 u8g2.drawStr(0,12,"ALARM");  
  x = 0
 } 

 

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

#include <Arduino.h>
#include <U8g2lib.h>

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);

int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 1000000.0; // resistance of R1 (100K)
float R2 = 10000.0;   // resistance of R2 (10K)
int value = 0;

const int ledPin = 13;
const int buzzerPin = 12;

int blokada = 0;
int blokada2 = 0;

void setup()
{
  u8g2.begin();
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(analogInput, INPUT);
  digitalWrite(ledPin, LOW);
}

void measureVoltage()
{
  value = analogRead(analogInput);
  vout = (value * 5.0) / 1024.0;
  vin = vout / (R2 / (R1 + R2));
  if (vin < 0.09)
  {
    vin = 0.0;
  }
}

void blink()
{
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    delay(1000);
}

void loop()
{
  measureVoltage();

  //bufor czyśćmy na początku, potem będą nakładane teksty a dopiero na samym końcu
  //całość wyślemy do wyświetlacz, w ten sposób powinno nie migać
  u8g2.clearBuffer();   

  //dodałem ustawienie kursora bo nie wiem czy po clearBuffor jest ona jakoś ustawiana
  u8g2.setCursor(0, 0);
  u8g2.setFont(u8g2_font_ncenB10_tr);
  u8g2.drawStr(0, 12, "Czujnik ! !");

  u8g2.setCursor(50, 50);
  u8g2.setFont(u8g2_font_ncenB18_tr);
  u8g2.print(vin / 100);

  //nowy stan miernika
  bool max = vin >= 200;
  bool alarm = vin > 200;

  //tu będziemy pamiętali poprzedni stan żeby w przypadku wystąpienia
  //przekroczenia tylko raz wykonać bipnięcie i błyskanie
  //static oznacza że zmienna się nie kasuje po dojściu do końca procedury loop
  static bool lastMax = false;

  if (alarm) {
    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.setCursor(0, 25);
    u8g2.print("ALARM");
  }

  //to róbmy tylko raz, kiedy wszystkie napisy są już w buforze
  u8g2.sendBuffer();

  //to działa blokująco (delay) więc róbmy to na końcu, już po wysłaniu danych
  //na wyświetlacz
  if (max != lastMax) {
    tone(buzzerPin, 200);
    blink();

    lastMax = max;
  }

  //tu szczerze nie całkiem rozumiem jak to miało działąć
  //ale chyba jak się będzie wyłączało po tych 2 sekundach migania to będzie ok
  noTone(buzzerPin);

  delay(1000);
}

Chcesz to przejrzyj coś takiego. Lekko uporządkowane ale nie testowane.

Edytowano przez etet100
  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.