Skocz do zawartości

Prot1976

Użytkownicy
  • Zawartość

    8
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O Prot1976

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Witajcie, W czeluściach intereneta natknąłem się na kod pisany na Arduino z zegarem RTC1307, opis działania i oryginalny kod znajduje się pod linkiem poniżej. https://github.com/benjaf/LightController/tree/master/Arduino/LightController Udało mi się podmienić bibliotekę RTC i częściowo zmienić kod i o ile udało mi się wysłać odczyt zegara na Serial Monitor to już bieżące wartości dla przykładowych kanałów są dla mnie nieosiągalne. /* * Name: LightController.ino * Author: User "benjaf" at plantedtank.net forums * URL: https://github.com/benjaf/LightController * This example is set up for 2 channels with a maximum of 10 points. * Anything that may require editing is labeled with ¤CHANGE¤ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // ----------------------- RTC Library ----------------------- #include "ChannelManager.h" #include <TimeLib.h> // ----------------------- Constants ----------------------- // ¤CHANGE¤ const int MaxChannels = 2; // Max number of channels, change if more or less are required const int MaxPoints = 10; // Max number of light intensity points, change if more or less are required // ----------------------- Variables ----------------------- // RTC //RTC_DS1307 RTC; // Time //DateTime CurrentTime; time_t CurrentTime; // ----------------------- Lights ----------------------- // Schedule Point format: (Hour, Minute, Intensity) // Difference in intensity between points is faded/increased gradually // Example: // Channels[0].AddPoint(8, 0, 0); // Channels[0].AddPoint(8, 30, 255); // Channels[0].AddPoint(11, 0, 255); // ... // // Explanation: // 00:00 - 08:00 -> Light OFF // 08:00 - 08:30 -> Increment light towards Fully ON // 08:30 - 11:00 -> Light Fully ON // // Min intensity value: 0 (OFF) // Max intensity value: 255 (Fully ON) // // If only 1 point is added, channel always maintains value of that point // // There is the option of which fade mode to use. // Basically there are 2 modes: Linear and Exponential // - Linear is what you would expect - 50% on = 50% duty cycle. // - Exponential is an estimation of how our eyes react to brightness. The 'real' formula is actually inverse logarithmic, // but for our use exponential is close enough (feel free to add more fade modes if you disagree) - and much faster to compute! Channel Channels[MaxChannels]; Point Points[MaxChannels][MaxPoints]; // Add more timing definitions here if more channels are added: // ¤CHANGE¤ void InitializeChannels(int channels) { // Channel 0: (Example) // This is an example of a typical lighting schedule (Lights on 08:30 - 19:00 w. 30 minutes of sunrise / sunset added) // using linear fading on pin 10. //int channelNo = 0; //int pin = 10; //Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]); //Channels[channelNo].AddPoint(8, 0, 0); //Channels[channelNo].AddPoint(8, 30, 255); //Channels[channelNo].AddPoint(19, 0, 255); //Channels[channelNo].AddPoint(19, 30, 0); // Channel 0: int channelNo = 0; // Currently editing channel 0 int pin = 13; // Channel 0 uses pin 10 Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]); // Initialize channel and choose FadeMode Channels[channelNo].AddPoint(8, 0, 0); // Add Point (can also use decimal values ranging from 0 to 1 if you prefer) Channels[channelNo].AddPoint(8, 0, 0); Channels[channelNo].AddPoint(8, 30, 150); Channels[channelNo].AddPoint(10, 16, 0); Channels[channelNo].AddPoint(10, 21, 255); Channels[channelNo].AddPoint(10, 26, 0); Channels[channelNo].AddPoint(12, 45, 255); Channels[channelNo].AddPoint(19, 30, 150); Channels[channelNo].AddPoint(20, 0, 0); // Channel 1: channelNo = 1; // Currently editing channel 1 pin = 11; // Channel 1 uses pin 11 Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]); Channels[channelNo].AddPoint(8, 0, 0); Channels[channelNo].AddPoint(15, 55, 0); Channels[channelNo].AddPoint(15, 56, 0); Channels[channelNo].AddPoint(15, 57, 255); Channels[channelNo].AddPoint(15, 58, 0); Channels[channelNo].AddPoint(20, 0, 0); } // ----------------------- Functions ----------------------- long lastUpdateTime = 0; // Update light intensity values void UpdateLights(time_t currentTime) //void UpdateLights() { long now = Seconds(hour(), minute(), second()); // Convert current time to seconds since midnight if(now != lastUpdateTime) // Perform update only if there is a perceivable change in time (no point wasting clock cycles otherwise) { for(int channel = 0; channel < MaxChannels; channel++) // For each Channel { analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); } } lastUpdateTime = now; } // Convert HH:mm:ss -> Seconds since midnight long Seconds(int hour, int minute, int second) { return ((long)hour * 60 * 60) + (minute * 60) + second ; } // ----------------------- Setup ----------------------- void setup() { // Initialize channel schedules InitializeChannels(MaxChannels); // set the Time library to use Teensy 3.0's RTC to keep time setSyncProvider(getTeensy3Time); Serial.begin(115200); while (!Serial); // Wait for Arduino Serial Monitor to open delay(100); if (timeStatus()!= timeSet) { Serial.println("Unable to sync with the RTC"); } else { Serial.println("RTC has set the system time"); } // Clock // Wire.begin(); // RTC.begin(); //RTC.adjust(DateTime(__DATE__, __TIME__)); // Set RTC time to sketch compilation time, only use for 1 (ONE) run. Will reset time at each device reset! } // ----------------------- Loop ----------------------- void loop() { // Get current time //CurrentTime = RTC.now(); CurrentTime = Teensy3Clock.get(); // Update lights UpdateLights(CurrentTime); if (Serial.available()) { time_t t = processSyncMessage(); if (t != 0) { Teensy3Clock.set(t); // set the RTC setTime(t); } } digitalClockDisplay(); int ch1_value = analogRead(13); Serial.println(ch1_value); // Serial.println(Seconds); } void digitalClockDisplay() { // digital clock display of the time Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.print(" "); Serial.print(day()); Serial.print(" "); Serial.print(month()); Serial.print(" "); Serial.print(year()); Serial.print(" "); Serial.println(Teensy3Clock.get()); Serial.println(now()); // Serial.print(Seconds()); Serial.print(" "); Serial.println(); } time_t getTeensy3Time() { return Teensy3Clock.get(); } /* code to process time sync messages from the serial port */ #define TIME_HEADER "T" // Header tag for serial time sync message unsigned long processSyncMessage() { unsigned long pctime = 0L; const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013 if(Serial.find(TIME_HEADER)) { pctime = Serial.parseInt(); return pctime; if( pctime < DEFAULT_TIME) { // check the value is a valid time (greater than Jan 1 2013) pctime = 0L; // return 0 to indicate that the time is not valid } } return pctime; } void printDigits(int digits){ // utility function for digital clock display: prints preceding colon and leading 0 Serial.print(":"); if(digits < 10) Serial.print('0'); Serial.print(digits); } Prosiłbym o wskazówki o co chodzi w kilku miejscach oryginalnego kodu: o co chodzi w tym fragmencie // ----------------------- Variables ----------------------- // RTC RTC_DS1307 RTC; // Time DateTime CurrentTime; I w tym fragmencie: // ----------------------- Functions ----------------------- long lastUpdateTime = 0; // Update light intensity values void UpdateLights(DateTime currentTime) { long now = Seconds(currentTime.hour(), currentTime.minute(), currentTime.second()); // Convert current time to seconds since midnight if(now != lastUpdateTime) // Perform update only if there is a perceivable change in time (no point wasting clock cycles otherwise) { for(int channel = 0; channel < MaxChannels; channel++) // For each Channel { analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); // Get updated light intensity and write value to pin (update is performed when reading value) } } lastUpdateTime = now; } // Convert HH:mm:ss -> Seconds since midnight long Seconds(int hours, int minutes, int seconds) { return ((long)hours * 60 * 60) + (minutes * 60) + seconds ; } i jak w serial monitor wyświetlić wartości zapisywane dla każdego kanału (w testowym kodzie są 2 ale docelowo może być więcej): analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); // Get updated light intensity and write value to pin (update is performed when reading value) Będę wdzięczny za wskazówki Pozdrawiam K
  2. Prot1976

    Kontrola CO2 w komorze o pojemności 200l

    zapomniałem dodać że cewka zaworu jest na 230VAC więc nie jest zasilana z zasilacza kontrolera, zasilacz do ardu 12V 2A wiec wystarcza
  3. Prot1976

    Kontrola CO2 w komorze o pojemności 200l

    mam problem z wyświetlaczem przy pracy samego przekaźnika wszystko jest OK, niestety problem pojawia się gdy tylko podaję zasilanie na cewkę elektrozaworu. zdjęcie poniżej pokazuje tylko co dzieje się na wyświetlaczu w skład układu wchodzi DFRDuino UNO v3 * DFRobot LCD Keypad Shield v1.1 * DFrobot Gravity - czujnik dwutlenku węgla CO2 IR 0-50000ppm * DFRobot 1x Relay Shield problem jest wyłącznie z wyświetlaczem, sam kontroler pracuje poprawnie i kontroluje zawór w zależności od stężenia CO2 Gdzie szukać problemu?
  4. Prot1976

    Kontrola CO2 w komorze o pojemności 200l

    Jest to i projekt i zarazem początkujący jestem ja , a że bardziej jestem początkujący i jest to pierwszy projekt wrzuciłem to do początkujących (to zdanie wygląda jak mój program ). Mam same problemy z tym programem , ale jeszcze jakoś daje radę.
  5. Cześć, Miał być prosty układ z prostym kodem, ale apetyt rośnie w miarę jedzenia a w lesie coraz ciemniej. w całym układzie brakuje mi jeszcze zaworu, reduktora i samej komory ale jak do tej pory całość reaguje na zmiany stężenia CO2. Zamarzyło mi się MENU, możliwość wprowadzania zmian i ich zapis w EEPROM w przypadku utraty zasilania Kod posklejany i kawałków kilku innych... całość jak na razie działa. /*Program do kontroli stężenia CO2 w komorze o pojemności około 200l * konieczna jest zmiana docelowego stężenia * dopasowanie czasu nastrzyku do różnicy między odczytem a stężeniem docelowym * zwłoka z uwagi na czas odpowiedzi czujnika CO2 i czas mieszania gazów w komorze * * w skład układu wchodzi * DFRDuino UNO v3 * DFRobot LCD Keypad Shield v1.1 * DFrobot Gravity - czujnik dwutlenku węgla CO2 IR 0-50000ppm * DFRobot 1x Relay Shield */ #include <SoftwareSerial.h> //biblioteka komunikacji z czujnikiem #include <LiquidCrystal.h> // biblioteka dla wyświetlacza 16x2 SoftwareSerial mySerial(1, 2); // RX, TX piny do komunikacji z czujnikiem unsigned char hexdata[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; //Read the gas density command /Don't change the order LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Piny do komunikacji z LCD int CO2relay = A2; // analog A2 jako wyjście przekaźnika float CO2_LCD; // prezentacja CO2 na LCD /* * */ unsigned long previousMillis = 0; unsigned currentMillis = millis(); long injection = 1000; int InjState = LOW; float SetPoint = 5.00; //przyciski int lcd_key = 0; int adc_key_in = 0; #define UP 1 #define DOWN 2 #define btnNONE 5 // odczyt przycisku int read_LCD_buttons () { adc_key_in = analogRead(0); // read the value from the sensor // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result // For V1.1 us this threshold if (adc_key_in < 250) return UP; if (adc_key_in < 450) return DOWN; return btnNONE; // when all others fail, return this... } void setup() { pinMode(CO2relay, OUTPUT); //digitalWrite(CO2relay, LOW); mySerial.begin(9600); lcd.begin(16, 2); // start bibliotek analogWrite(10,2); } void loop() { unsigned long currentMillis = millis(); lcd_key = read_LCD_buttons(); // stan przycisków /* * tylko przyciski góra i dół * góra zwiększa wartość SetPoint o 0.1 * dół zmiejsza o 0.1 */ switch (lcd_key) { case UP: { SetPoint=SetPoint+0.1; break; } case DOWN: { SetPoint=SetPoint-0.1; break; } } mySerial.write(hexdata,9); //delay(100); for(int i=0,j=0;i<9;i++) { if (mySerial.available()>0) { long hi,lo,CO2; int ch=mySerial.read(); if(i==2){ hi=ch; } //High concentration if(i==3){ lo=ch; } //Low concentration if(i==8) { CO2=(hi*256+lo); //CO2 concentration CO2_LCD = CO2/10000.0; } } } lcd.setCursor(0,1); lcd.print("KOMORA "); lcd.print(CO2_LCD,1); lcd.print("%"); lcd.print(" |"); lcd.setCursor(0,0); lcd.print("SETUP "); lcd.print(SetPoint,1); lcd.print("%"); lcd.print(" |"); if ((CO2_LCD < SetPoint - 0.2) && (currentMillis - previousMillis >= injection)) { previousMillis = currentMillis; if (InjState == LOW){ InjState = HIGH; lcd.setCursor(13,0); lcd.print("INJ"); lcd.setCursor(13,1); lcd.print("CO2"); //delay(1000); //digitalWrite(CO2relay,LOW); //delay(2000); } else { InjState = LOW; lcd.setCursor(13,0); lcd.print("INJ"); lcd.setCursor(13,1); lcd.print("OFF"); } digitalWrite(CO2relay, InjState); } } K.
  6. Dzień dobry, zlecę napisanie programu na Teensy 3.6 do regulacji jasności światła w cyklu dobowym. Schemat pracy ma być zapisywany w formie pliku tekstowego na karcie SD przy pomocy komputera i pobierany z niej do pamięci przez teensy w przypadku wykrycia karty. Schemat musi zawierać informacje o czasie i wartości procentowej jaką ma osiągnąć sygnał PWM dla wyjścia, np.: 06:00;000;010;020;030;... 10:12;095;100;060;080;... czyli między 06:00 a 10:12 kanał 1 zwiększy wartość o 95% kanał 2 zwiększy wartość o 90% kanał 3 zwiększy wartość o 40% kanał 4 zwiększy wartość o 50% Zmiana ma być płynna bez widocznych skoków nawet jeśli w ciągu jednej minuty wartość zmiany wyniesie 100%. Wiem że to bardzo skąpy opis ale mam nadzieję że na początek wystarczy. Pozdrawiam k
  7. Prześlij plik 3D i ilość zobaczę ile czasu potrzeba na druk, jeśli wykonanie w żywicy wchodzi w grę.
  8. Prot1976

    Wątek zbiorczy: powitania użytkowników

    Cześć, Mam na imie Karol, Z programowaniem raczej na bakier ale może się to zmieni, szukam informacji i pomocy przy budowie kontrolera warunków dla moich owadożerów. Mam pracujący układ na particle proton z kodem znalezionym w sieci, brakuje mi jednak kilku funkcji
×