• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
jak przypisać kilka liczb do jednej zmiennej?
#1
Witam mam problem i potrzebuje pomocy. Projekt zakłada sterowanie pompką 12V i podlewanie kwiatków.
Mam zmienną
Kod:
byte pompaWodaDzien_ON = 14; //uruchom pompę tego dnia
która jest warunkiem kiedy ma zostać uruchomiona pompa.
Problem w tym że kwiatki potrzebują podlewania więcej niż raz w miesiącu. W jaki sposób wykonać to tak aby zmienna wynosiła np

Kod:
pompaWodaDzien_ON = 04 14 24 ;
 
Odpowiedź
#2
Możesz wykorzystać tablicę i sprawdzać jej wartości w pętli.
Nie trzeba dawać punktów za pomoc, ale jeśli problem został rozwiązany, proszę o tym poinformować w ostatnim poście.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
Coś mi nie rusza z operatorem || ale jak dam samo pompaWodaDzienPodlewania[3] w warunku to działa.


Kod:
#include <DS3231.h>                                      // biblioteka zegara czasu rzeczywistego DS3231
#include <Wire.h>

#define mosfetPompaWoda 2                         // Pin uruchamiajacy pompe wody

DS3231 clock;
RTCDateTime dt;

const unsigned long czasDzialaniaPompaWoda =30000;                         // Czas jaki ma działać pompa w millisekundach
unsigned long startStoperPompaWody=0;                                                // Stoper odliczający czas pracy pompy
byte licznik=0;
//byte pompaWodaDzien_ON = 14;                                                                               
byte pompaWodaGodzina_ON= 19;
byte pompaWodaMinuta_ON= 31;
byte pompaWodaSekunda_ON= 00;
byte statusPompaWoda= 0; 
byte iloscWody=2;
byte pompaWodaDzienPodlewania[8]={1,4,8,14,16,20,24,28};
                                             
void setup()
 {                                                        
  Serial.begin(9600);
  clock.begin();
  pinMode(mosfetPompaWoda,OUTPUT);                     // Mosfet Pin 2 Pompa Wody
  digitalWrite(mosfetPompaWoda, LOW);                  // Wylaczenie podczas startu
  
  }
void loop() 
{

  dt = clock.getDateTime();                  // pobierz date i czas z zegara systemowego RTC DS3231///////////
  nawodnienie();                             // uruchomienie i wyłączenie pompy o zadanym czasie
  
}


void nawodnienie()
{
  unsigned long czas = millis();
  
  if ((licznik == 0) && (dt.day == (pompaWodaDzienPodlewania[0] || pompaWodaDzienPodlewania[1] || pompaWodaDzienPodlewania[2] || pompaWodaDzienPodlewania[3] || pompaWodaDzienPodlewania[4] || pompaWodaDzienPodlewania[5])) && (dt.hour == pompaWodaGodzina_ON) && (dt.minute == pompaWodaMinuta_ON) && (dt.second == pompaWodaSekunda_ON) && (iloscWody >1))
  {  
    licznik=1;
    statusPompaWoda = 1;                                                             //Status pompy
    startStoperPompaWody = czas;                                                     //start stopera
    digitalWrite(mosfetPompaWoda, HIGH);                                             //uruchomienie pompy o wskazanym czasie
    Serial.println("pompa dziala");

  }

  if((licznik == 1) && (czas - startStoperPompaWody >= czasDzialaniaPompaWoda))
  {
    licznik=0; 
    //startStoperPompaWody =0; 
    statusPompaWoda = 0;                                                            //Status pompy
    digitalWrite(mosfetPompaWoda, LOW);                                             //wylaczenie pompy po wskazanym czasie
    Serial.println(" pompa wylaczona");
  }
}
 
Odpowiedź
#4
Wynikiem || jest 0 lub 1, a to nie musi być == dt.day. Poza tym na pewno da się to jeszcze trochę skomplikować Big Grin.
 
Odpowiedź
#5
(14-05-2018, 20:56)kaczakat napisał(a): ... Poza tym na pewno da się to jeszcze trochę skomplikować Big Grin.

Za dziesięć dni minie pół roku od choinki pod którą leżał prezent w postaci Arduino Uno, zdaję sobie sprawę z tego iż to co piszę w oczach fachowców jest hmm amatorszczyzną ale bawię się przy tym świetnie a o to chodzi także z góry wybaczcie za moje wypociny Smile

Wracając do tematu. 
Cytat:Wynikiem || jest 0 lub 1

Jak to ma się do tego zapisu pochodzącego z czujnika odległości ?
Kod:
// Sprawdzamy zakres pomiarowy
 if (Distance >= MaximumRange || Distance <= MinimumRange)
 {
   Serial.println("Poza zakresem");  
 }
 
Odpowiedź
#6
W nawiasie masz to:
(pompaWodaDzienPodlewania[0] || pompaWodaDzienPodlewania[1] || pompaWodaDzienPodlewania[2] || pompaWodaDzienPodlewania[3] || pompaWodaDzienPodlewania[4] || pompaWodaDzienPodlewania[5])
o ile nie będzie to dzień 0 (w sensie wszystkie dni 0) to zawsze da 1?
Potem porównujesz ten 1 == dt.day, co zawsze będzie zero poza dniem wypłaty.
Właśnie dlatego nie robi się takich rozbudowanych warunków, szczególnie gdy się zaczyna bawić logiką.

W drugim przypadku wybierasz między dwoma działaniami logicznymi, jeśli którakolwiek jest 1 to if się wykona.
 
Odpowiedź
#7
Gdy trzeba operować na dacie wygodniej używać UnixDateStamp niż dzień, miesiąc, rok. Ma to duże znaczenie, gdy trzeba obliczać liczbę dni pomiędzy zdarzeniami. Zakładam, że kwiatki nie maja niedziel, dla nich to zwykły dzień. Jeśli coś ma się wydarzać np co 3 dni, nie można przyjąć konkretnego dnia tygodnia. Podobnie, nie będzie to konkretny dzień miesiąca. W C są funkcje przeliczające UnixDateStamp, szukaj pod hasłem time.h. W linku https://www.epochconverter.com/ masz jeden z konwerterów. Wszystko sprowadza się do porównywania liczby 32-bit. Łatwo synchronizowac czas z NTP, wystarczy skopiować taka liczbę do swojego systemu.
- uC: ARM, AVR, 8051, PIC
- Procesory: MC68k, Z-80, Z-8, 6502
- Języki: C, Asm, PHP
- układy programowalne: CPLD, FPGA, GAL
- Telekomunikacja: GSM, ISDN, Modemy
- Transmisja danych: RS485/422/232C Ethernet

http://er-mik.prv.pl/projekty_avt.php
http://er-mik.prv.pl/
http://kolejki.prv.pl/




 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości