Sterownik aabratek LM/VM- arduino

Przyrządy pomiarowe, ich montaż i zastosowanie odczytów w procesach destylacji. Regulacja procesów.

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy

Post autor: rastro »

I ja, i ja....
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
Awatar użytkownika

robert4you
950
Posty: 951
Rejestracja: środa, 30 mar 2016, 18:43
Podziękował: 9 razy
Otrzymał podziękowanie: 134 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: robert4you »

Ktoś coś dostał od kolegi ?
************************************************************************

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Obiecanki cacanki, a głupiemu radość ;)
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

Cressi
30
Posty: 35
Rejestracja: czwartek, 3 gru 2009, 18:16
Krótko o sobie: Jestem fajnym człowiekiem:)
Ulubiony Alkohol: Whisky,
Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
Lokalizacja: południowa Wielkopolska
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: Cressi »

Sorry, nie sledze watku na bieząco.
Ponizej kod - to moje pierwsze "podejscie" do Arduino wiec moze nie jest optymalny. Przepraszam za zamieszanie i posypuje niniejszym głowe popiołem. Od miesiaca jestem w praktycznie permamentnej podróży służbowej i trochę jestem rozkojarzony..
W załącznikach schemat połaczeń i płytka PCB. Zastrzzegam ze płytka nie jest zweryfikowana w praktyce i mogą być jakieś błędy (chociaż jest dość dokładnie sprawdzona )

Kod: Zaznacz cały

//#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>


#define ile_czujnikow 2    //ilosc podlaczonych czujnikow
#define alarm_treshold 0.1
#define relay_treshold 0.3
#define ONE_WIRE_BUS 10     //maagistrala onewire pin 10
#define reference_pin 12    //klawisz ustawiania wartosci referencyjnej podpiety pod pin 12
#define reset_pin 11        //klawisz resetowania wartosci referencyjnej podpiety pod pin 7
#define relay_pin 9        //przekaznik elektrozaworu podpiety pod pin 9
#define buzzer_pin 8

OneWire magistrala(ONE_WIRE_BUS);
DallasTemperature sensors(&magistrala);
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
DeviceAddress adresy [ile_czujnikow] =
{ 0x28, 0xFF, 0x43, 0xB7, 0x82, 0x16, 0x3, 0x71, //adresy czujnikow - ustawic wlasne
  0x28, 0xFF, 0x41, 0x58, 0x82, 0x16, 0x5, 0xFC
};
byte symbol[8] = {
  0b00110,
  0b01001,
  0b01001,
  0b00110,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};




void setup() {

  pinMode (reference_pin, INPUT_PULLUP);
  pinMode (reset_pin, INPUT_PULLUP);
  pinMode (relay_pin, OUTPUT);
  pinMode (buzzer_pin, OUTPUT);
  digitalWrite (relay_pin, LOW);
  digitalWrite (buzzer_pin, LOW);
  
  lcd.begin(20, 4);
  lcd.createChar (0, symbol);

  
  lcd.home();
  lcd.print (F("10'th:"));    //tu mozna wstawic wlasna nazwe czujnika                 //wyswietlenie stalych tekstĂłw na wyswietlaczu w celu oszczedzenia czasu procesora
  lcd.setCursor (18, 0);                                                               //
  lcd.print(char(0));
  lcd.print(F("C"));

  lcd.setCursor(0, 1);
  lcd.print (F("Head:"));     ////tu mozna wstawic wlasna nazwe czujnika
  lcd.setCursor (18, 1);
  lcd.print(char(0));
  lcd.print(F("C"));

  
  lcd.setCursor(0, 3);
  lcd.print (F("Ref:"));     ////tu mozna wstawic wlasna nazwe czujnika
  lcd.setCursor (18, 3);
  lcd.print(char(0));
  lcd.print(F("C"));



  sensors.begin();
  sensors.setResolution (12);
  
}



void loop() {
  float mean;
  static float reference = 100;
  byte wiersz = 0;
  float temperatura;

  sensors.requestTemperatures();
  for (wiersz = 0; wiersz < ile_czujnikow; wiersz++)
  {
    temperatura = (sensors.getTempC(adresy [wiersz]));
    display_temp (&temperatura, 12, wiersz);
    if (wiersz == 0) {
            mean = obliczSrednia(temperatura);
            if (digitalRead(reference_pin) == LOW)
            {
              reference = mean;
              // digitalWrite (relay_pin, LOW);
            }
            if (digitalRead (reset_pin) == LOW)
            {
              digitalWrite (buzzer_pin, LOW);
              digitalWrite (relay_pin, LOW);
            }
            if (mean > (reference + alarm_treshold)) digitalWrite (buzzer_pin, HIGH);
            if (mean > (reference + relay_treshold)) digitalWrite (relay_pin, HIGH);
            //display_temp (&mean, 12, 2);
            display_temp (&reference, 12, 3);

    }
  }
}
//delay (300);




void display_temp(float *value, byte column, byte row) //funkcja wyswietla wartosc value w kolumnie column i wierszu row
{
  char outstr[9];
  //value = value + corr[wiersz];
  *value = round (*value * 100);
  *value = (*value / 100.0);
  dtostrf(*value, 6, 2, outstr); //wyswieltenie bo 2 miejsc po przecinku
  lcd.setCursor(column, row);
  lcd.print(outstr);
}

float obliczSrednia (float svalue)    //svalue to wynik jednego pomiaru (SingleValue)
{
#define z_ilu_srednia 3
  static byte k;  //numer pomiaru, albo inaczej pozycja w tablicy
  byte i;
  float mvalue = 0.0;   //zmienna przechowujaca wartosc sredniej
  static float values [z_ilu_srednia]; //tablica przechowujaca wyniki n ostatnich pomiarow

  if (k > (z_ilu_srednia - 1)) k = 0;
  values [k] = svalue;
  k++;
  for (i = 0; i < z_ilu_srednia; i++)
    mvalue = mvalue + values [i];
  mvalue = mvalue / z_ilu_srednia;
  return (mvalue);
}











Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

A jak tam z reakcją na przyciski? Bo na moje oko to pętla trwa co najmniej 750ms. Jak się załączy alarm i mamy peszek to przycisk trza trzymać 3/4 sekundy, to już bardzo długo.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

Cressi
30
Posty: 35
Rejestracja: czwartek, 3 gru 2009, 18:16
Krótko o sobie: Jestem fajnym człowiekiem:)
Ulubiony Alkohol: Whisky,
Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
Lokalizacja: południowa Wielkopolska
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: Cressi »

Retro, masz racje. Tak wlasnie jest. Po rozkazie rozpoczęcia konwersji uP czeka ok 750 ms i tu nic sie nie dzieje.
Pisałem przecież ze to moje pierwsze podejście. Kod jest otwarty i każdy może go sobie poprawiać wedle własnego uznania. Pewnie nawet sam algorytm trzeba by lekko zmodyfikować, ale od czegos trzeba zacząć.
Zaczalem juz pisac inną wersje, ale troche to potrwa .

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

No trzeba by tam ustawić żeby konwertował asynchronicznie, tylko później trzeba trochę pomyśleć jak zrealizować czekanie na koniec konwersji. Pewnie jakiś timer i zaraz po konwersji trzeba by ustawić flagę i odpalić timer. Jak się timer odpali to flaga jest zerowana i można spokojnie zrealizować odczyt temperatury i obsługę wyświetlacza, a jak nie to tylko skanowanie klawiszy. Ja tam arduino szczególnie nie znam, ale takie rzeczy jak opóźnienia są zawsze słabe zwłaszcza jeżeli mamy do czynienia ze sterowaniem. Ale dramatu nie ma, bo już widziałem sterownik, co to miał tych opóźnień nasianych że główna pętla w porywach szła minutę ;).
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

Cressi
30
Posty: 35
Rejestracja: czwartek, 3 gru 2009, 18:16
Krótko o sobie: Jestem fajnym człowiekiem:)
Ulubiony Alkohol: Whisky,
Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
Lokalizacja: południowa Wielkopolska
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: Cressi »

Tia, w arduino zapomnij o bezpośredniej obsłudze timerów. Ale jest metoda z wykorzystaniem time_milis() i włączeniem w bibliotece dallas_temperature opcji nie czekania na konwersje
W nowej wersji chce zrobić mniej wiecej tak

Kod: Zaznacz cały

{
1. rozpocznij konwersje
2. zapisz bieżący stan time_milis()
{tutaj obsługa wyświetlacza, przycisków etc;
policzenie średnich, zapamiętanie wartości referencyjnej
sprawdź czy minęło 750 ms, jeśli nie, zajmuj sie dalej obsługą wyświetlacza etc.
}
odczytaj termometry, umieść wyniki w tablicy i wróć na początek.
}
W takim układzie można się bawić w debounce, rozpoznawanie jak długo naciśnięty jest klawisz itd. Powolutku. W założeniach miał to być prymitywny dwukanałowy termometr, a obsługę zaworu dopisywałem później.( stad wynika sposób obliczania średniej - ma miejsce tylko gdy program sprawdza sensor o adresie czujnika z pierwszego wiersza tablicy adresów) Zgadzam się z Tobą ze można to znacznie ulepszyć, ale nie od razu Kraków zbudowano. Na szczęście platforma Arduino pozwala na śmiesznie łatwe zaktualizowanie kodu w procesorze.
Z doświadczenia (choć z zupelnie innej branży) powiem Ci,m ze wielu poległo stawiając sobie (albo innym) zbyt wysokie wymagania na początku. Ja jestem zwolennikiem pracy krok po kroku.
Na razie zrobiłem PCB i całość jest w zasadzie już polutowana. Jak wrócę do domu będę kończył hardware i pewnie znów wrócę do softu. Ostatni kontakt z programowaniem to miałem na studiach, ale frajda z samodzielnego stworzenia czegoś co działa jest niemała.

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Nie no bez przesady, też się da w sumie całe to arduino to nic innego jak c opakowane w c++ do tego jest edytorek i biblioteki, na upartego pewnie da się nawet wstawki w asm porobić. Do timerów jest nawet lib TimerLibrary czy jakoś tak, wydaje się że to jest to co jest potrzebne do obsługi DS'a w trybie asynchronicznym.

https://github.com/JChristensen/Timer - szczególnie ciekawa jest metoda after z tego liba ;)
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

Cressi
30
Posty: 35
Rejestracja: czwartek, 3 gru 2009, 18:16
Krótko o sobie: Jestem fajnym człowiekiem:)
Ulubiony Alkohol: Whisky,
Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
Lokalizacja: południowa Wielkopolska
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: Cressi »

Tyle ze ryzyko jest takie, ze Ci inne biblioteki sie rozsypia jak zaczniesz grzebac. Zeby miec kontrole nad wszystkim trzebaby pisac w czystym C.
Ale dzięki za naprowadzenie, poszperam za ta biblioteką.

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Ten lib wydaje się fajny... robisz funkcję readTemp() {}, czytającą temperaturę, w główne pętli zlecasz konwersję do czujników w trybie async, zaraz potem after(750ms, readTemp) i to tyle, jak czas minie to zrobi się call do obsługi odczytu temperatury. Z drugiej strony ten timer raczej jest softwarowy i działa mniej więcej tak jak w twoim opisie.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

crobe
50
Posty: 68
Rejestracja: niedziela, 21 lut 2016, 19:55
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: crobe »

W jednej bibliotece do DS18b20 jest tak że program nie czeka na czujnik, zrobiłem tak termometr jak chcecie wkleję kod.

Wyświetlacz 2x16 3x 18b20 i alarmy do temperatur

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Ale jak nie czeka? To jak odczytujesz temperaturę? Bo to jest tak że zlecasz konwersję do czujnika, a następnie trzeba odczekać aż konwersja się zakończy. Sposoby są dwa albo czekasz aż konwersja się skończy i czytasz, albo nie czekasz i zajmujesz się innymi rzeczami a odczyt realizujesz za jakiś czas (albo liczysz czas z boku, albo używasz timera). Jak masz tak że używasz liba w ten sposób że zadajesz konwersję i potem odczyt i zaraz wyświetlasz to zwyczajnie nie wiesz że czekasz, ew. zwyczajnie nie wiesz że czekasz ;). Jak to tylko termometr to pół biedy, jak sterujesz elektrozaworem to też ujdzie, bo i tak musisz reagować na odczyt, ale jak wpadniesz na pomysł żeby dodać przycisk do alarmu to czas reakcji blisko sekundy będzie najwyżej irytujący. Ale jak będziesz chciał zrobić sterownik grupowy na SSR to się można nieco zdziwić że nie za bardzo działa.

Kod: Zaznacz cały

void DallasTemperature::requestTemperatures()
{
  _wire->reset();
  _wire->skip();
  _wire->write(STARTCONVO, parasite);

  // ASYNC mode?
  if (!waitForConversion) return; 
  blockTillConversionComplete(&bitResolution, 0);

  return;
}
a w środku blockTillConversionColmplete(... jest:

Kod: Zaznacz cały

void DallasTemperature::blockTillConversionComplete(uint8_t* bitResolution, uint8_t* deviceAddress)
{
	if(deviceAddress != 0 && checkForConversion && !parasite)
	{
	  	// Continue to check if the IC has responded with a temperature
	  	// NB: Could cause issues with multiple devices (one device may respond faster)
	  	unsigned long start = millis();
		while(!isConversionAvailable(0) && ((millis() - start) < 750));	
	}
	
  	// Wait a fix number of cycles till conversion is complete (based on IC datasheet)
	  switch (*bitResolution)
	  {
	    case 9:
	      delay(94);
	      break;
	    case 10:
	      delay(188);
	      break;
	    case 11:
	      delay(375);
	      break;
	    case 12:
	    default:
	      delay(750);
	      break;
	  }

}
przy czym domyślnie waitForConversion jest ustawiane na true, a więc zwykle program czeka ile potrzeba, a że nas zwykle interesuje konwersja 12bit więc sam rozumiesz. Jak przestawisz tryb na async to czekanie musisz sobie zorganizować we własnym zakresie. Ale może znasz jakiś inny lib do ds'a, mi się nie udało znaleźć, ale też jakoś szczególnie nie przykładałem się do szukania czegoś innego.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

crobe
50
Posty: 68
Rejestracja: niedziela, 21 lut 2016, 19:55
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: crobe »

Odczyt jest opóźniony, ale to działa tak że biblioteka sprawdza czy czujnik przesłał dane jak dane wpłynęły to przekazuje wartość do "glownego" programu.

Nie ma problemu z przyciskami bo właśnie miałem opóźnienia przy klikaniu. Teraz jest ok.

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

A możesz załączyć kawałek kodu, albo chociaż zdradzić co to za biblioteka? Jakoś nie bardzo sobie mogę wyobrazić jak ta biblioteka działa że w magiczny sposób przekazuje dane jak już konwersja się zakończy. Bo tu z kolegą Cressi kombinujemy, a może rozwiązanie jest pod ręką tylko nam umknęło.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

crobe
50
Posty: 68
Rejestracja: niedziela, 21 lut 2016, 19:55
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: crobe »

chodzi o " sensors.setWaitForConversion(false); "
a i fakt pisałem ten program dawno odświeża temperatury co sekundę ....

cały program

Kod: Zaznacz cały

#include <EEPROMex.h>
#include <EEPROMVar.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <avr/wdt.h>

#define ONE_WIRE_BUS 8
#define TEMPERATURE_PRECISION 12

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress czuj1, czuj2, czuj3;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

unsigned long previousMillis = 0;

//ZMIENNE WARTOSCI MENU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int menuin = 0;
int menu = 1;
float val = 0;
float valold = 0;
//#########################################################################################################################################################################################

//ZMIENNE KLAWIATURY  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int klaw;
int klawold;
int kwart;
int klawsek = 0;
//#########################################################################################################################################################################################

float temp1;
float temp1min = 20;
float temp1max = 90;

float temp2;
float temp2min = 30 ;
float temp2max = 100;

float temp3;
float temp3min = 40;
float temp3max = 110 ;

int al1 = 0;
int al2 = 0;
int al3 = 0;
int ton = 0;
int dzwiek = 0;

int al1stan = 0;
int al2stan = 0;
int al3stan = 0;

int al1min = 0;
int al1max = 0;

int al2min = 0;
int al2max = 0;

int al3min = 0;
int al3max = 0;


unsigned long czas;  
int klawsek1;

byte st1[8] = {
  0b01000,
  0b10100,
  0b01000,
  0b00011,
  0b00100,
  0b00100,
  0b00100,
  0b00011
};

byte st2[8] = {
  0b01110,
  0b01110,
  0b01110,
  0b01110,
  0b01110,
  0b00000,
  0b01110,
  0b01110
};

byte al[8] = {
  0b00010,
  0b00101,
  0b00111,
  0b00101,
  0b10000,
  0b10000,
  0b10000,
  0b11100
};

byte b1[8] = {
  0b00001,
  0b00001,
  0b00001,
  0b00001,
  0b00001,
  0b00001,
  0b00001,
  0b00001
};

byte b2[8] = {
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000
};
byte b3[8] = {
  0b01010,
  0b01011,
  0b01010,
  0b01010,
  0b01011,
  0b01000,
  0b01011,
  0b01111
};
byte b4[8] = {
  0b01010,
  0b10010,
  0b01010,
  0b01010,
  0b10010,
  0b00010,
  0b11010,
  0b11110
};

void setup() {
wdt_enable(WDTO_4S);

sensors.begin();
sensors.getAddress(czuj1, 0);
sensors.getAddress(czuj2, 1);
sensors.getAddress(czuj3, 2);
sensors.setResolution(czuj1, TEMPERATURE_PRECISION);
sensors.setResolution(czuj2, TEMPERATURE_PRECISION);
sensors.setResolution(czuj3, TEMPERATURE_PRECISION);
sensors.setWaitForConversion(false);
lcd.begin(16, 2);
lcd.clear();

lcd.createChar(1, st1);
lcd.createChar(2, st2);
lcd.createChar(3, al);
lcd.createChar(4, b1);
lcd.createChar(5, b2);
lcd.createChar(6, b3);
lcd.createChar(7, b4);

czas = millis();

temp1min = EEPROM.readFloat(1);
temp1max = EEPROM.readFloat(10);
temp2min = EEPROM.readFloat(20);
temp2max = EEPROM.readFloat(30);
temp3min = EEPROM.readFloat(40);
temp3max = EEPROM.readFloat(50);


}

void loop() {

if ((millis()-czas) > 1000){ czas = millis(); klawsek = klawsek + 1; };



// ODCZYT Z A1 I USTALENIE KLAWISZA  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
kwart = analogRead(A1);
if (kwart > 1000 ) {klaw = 4;delay(200);}else
if (kwart > 500 & kwart < 520 ){klaw = 3;delay(200);}else   
if (kwart > 330 & kwart < 350 ){klaw = 2;delay(200);}else   
if (kwart > 240 & kwart < 270 ){klaw = 1;delay(200);} else {klaw = 0;};

if (klaw > 0) {klawsek = 0;};
if (klawsek > 2000){klawsek = 100;};
if (klawsek > 15){menuin = 0;};


// STEROWANIE MENU ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
if (menuin == 0 && klaw == 1){menuin = 1; menu = 0;klaw = 0;lcd.clear();lcd.setCursor(0, 0);  lcd.print(F("Menu"));lcd.setCursor(0, 1);  lcd.print(F("Ustawien"));delay(1000);}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && klaw == 2 && al1 == 0){al1=1;klaw = 0;} else if (menuin == 0 && klaw == 2 && al1 == 1){al1=0;}
if (menuin == 0 && klaw == 3 && al2 == 0){al2=1;klaw = 0;} else if (menuin == 0 && klaw == 3 && al2 == 1){al2=0;}
if (menuin == 0 && klaw == 4 && al3 == 0){al3=1;klaw = 0;} else if (menuin == 0 && klaw == 4 && al3 == 1){al3=0;}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && al1==1) {
if (temp1min > 0 && temp1min >= temp1) {al1min = 1;} else {al1min = 0;};
if (temp1max > 0 && temp1max <= temp1) {al1max = 1;} else {al1max = 0;};
if (al1min == 1 || al1max == 1) {al1stan = 1;} else {al1stan = 0;};
} 


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && al2==1) {
if (temp2min > 0 && temp2min >= temp2) {al2min = 1;} else {al2min = 0;};
if (temp2max > 0 && temp2max <= temp2) {al2max = 1;} else {al2max = 0;};
if (al2min == 1 || al2max == 1) {al2stan = 1;} else {al2stan = 0;};
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && al3==1) {
if (temp3min > 0 && temp3min >= temp3) {al3min = 1;} else {al3min = 0;};
if (temp3max > 0 && temp3max <= temp3) {al3max = 1;} else {al3max = 0;};
if (al3min == 1 || al3max == 1) {al3stan = 1;} else {al3stan = 0;};

} 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


if (menuin == 1){
if (klaw == 0){delay(100); ;}
lcd.clear();

if (klaw == 1 && menu < 9){menuin = 0;lcd.clear();menu = 0;}
if (klaw == 2 && menu < 99){menu = menu-1;}
if (klaw == 3 && menu < 99){menu = menu+1;}
if (klaw == 4 && menu < 99 ){menu = menu*10;klaw = 0;}

if (klaw == 1 && menu > 9){menu = menu/10;}

if (klaw == 1 && menu > 99){menu = menu/10;}
if (klaw == 2 && menu > 99){val = val - 0.1;}
if (klaw == 3 && menu > 99){val = val + 0.1;}

val=constrain(val,0,120);

switch (menu) {
case 0:  
    menu=1;
    break;
case 1:  
    lcd.setCursor(0, 0);  lcd.print(F("1. Ustaw. Al."));  
    lcd.setCursor(0, 1);  lcd.print(F("Termometr 1"));
    break;
    case 9:  
    menu = 10;
    break;
    case 10:  
    lcd.setCursor(0, 0);  lcd.print(F("1.1 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Min     [     ] "));
    lcd.setCursor(9, 1);  lcd.print(temp1min,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 100:  
    val = temp1min;
    menu = 101;
    klaw = 0;
    break;
    case 101:  
    if (klaw == 4 && menu > 99){temp1min = val;menu = menu/10; EEPROM.writeFloat(1,val);}
    lcd.setCursor(0, 0);  lcd.print(F("1.1 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Min     >     < "));
    lcd.setCursor(9, 1);  lcd.print(val,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 11:  
    lcd.setCursor(0, 0);  lcd.print(F("1.2 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Max     [     ] "));
    lcd.setCursor(9, 1);  lcd.print(temp1max,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 110:  
    val = temp1max;
    menu = 111;
    klaw = 0;
    break;
    case 111:  
    if (klaw == 4 && menu > 99){temp1max = val;menu = menu/10;EEPROM.writeFloat(10,val);}
    lcd.setCursor(0, 0);  lcd.print(F("1.2 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Max     >     < "));
    lcd.setCursor(9, 1);  lcd.print(val,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 12:  
    menu = 11;
    break;


case 2:  
    lcd.setCursor(0, 0);  lcd.print(F("2. Ustaw. AL."));  
    lcd.setCursor(0, 1);  lcd.print(F("Termometr 2"));
    break;
    case 19:  
    menu = 20;
    break;
    case 20:  
    lcd.setCursor(0, 0);  lcd.print(F("2.1 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Min     [     ] "));
    lcd.setCursor(9, 1);  lcd.print(temp2min,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 200:  
    val = temp2min;
    menu = 201;
    klaw = 0;
    break;
    case 201:  
    if (klaw == 4 && menu > 99){temp2min = val;menu = menu/10;EEPROM.writeFloat(20,val);}
    lcd.setCursor(0, 0);  lcd.print(F("2.1 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Min     >     < "));
    lcd.setCursor(9, 1);  lcd.print(val,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 21:  
    lcd.setCursor(0, 0);  lcd.print(F("2.2 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Max     [     ] "));
    lcd.setCursor(9, 1);  lcd.print(temp2max,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 210:  
    val = temp2max;
    menu = 211;
    klaw = 0;
    break;
    case 211:  
    if (klaw == 4 && menu > 99){temp2max = val;menu = menu/10;EEPROM.writeFloat(30,val);}
    lcd.setCursor(0, 0);  lcd.print(F("2.2 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Max     >     < "));
    lcd.setCursor(9, 1);  lcd.print(val,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 22:  
    menu = 21;
    break;
    
case 3:  
    lcd.setCursor(0, 0);  lcd.print(F("3. Ustaw. AL."));  
    lcd.setCursor(0, 1);  lcd.print(F("Termometr 3"));
    break;
    case 29:  
    menu = 30;
    break;
    case 30:  
    lcd.setCursor(0, 0);  lcd.print(F("3.1 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Min     [     ] "));
    lcd.setCursor(9, 1);  lcd.print(temp3min,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 300:  
    val = temp3min;
    menu = 301;
    klaw = 0;
    break;
    case 301:  
    if (klaw == 4 && menu > 99){temp3min = val;menu = menu/10;EEPROM.writeFloat(40,val);}
    lcd.setCursor(0, 0);  lcd.print(F("3.1 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Min     >     < "));
    lcd.setCursor(9, 1);  lcd.print(val,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 31:  
    lcd.setCursor(0, 0);  lcd.print(F("3.2 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Max     [     ] "));
    lcd.setCursor(9, 1);  lcd.print(temp3max,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 310:  
    val = temp3max;
    menu = 311;
    klaw = 0;
    break;
    case 311:  
    if (klaw == 4 && menu > 99){temp3max = val;menu = menu/10;EEPROM.writeFloat(50,val);}
    lcd.setCursor(0, 0);  lcd.print(F("3.2 Ustaw. Alarmu."));  
    lcd.setCursor(0, 1);  lcd.print(F("Max     >     < "));
    lcd.setCursor(9, 1);  lcd.print(val,1);
    lcd.setCursor(15, 1); lcd.write(byte(1));
    break;
    case 32:
    menu = 31;
    break;
case 4:  
    menu=3;
    break;


}}

if (menuin == 0){

delay(100);
lcd.clear();



 
//lcd.setCursor(8, 1);  lcd.write(byte(5));
    
if (temp1 > 99) {lcd.setCursor(1, 0);} else {lcd.setCursor(2, 0);}  
lcd.print(temp1,1); 
lcd.setCursor(6, 0);
lcd.write(byte(1));

if (temp2 > 99) {lcd.setCursor(10, 0);} else {lcd.setCursor(11, 0);}
lcd.print(temp2,1); 
lcd.setCursor(15, 0);
lcd.write(byte(1));

if (temp3 > 99) {lcd.setCursor(1, 1);} else {lcd.setCursor(2, 1);}
lcd.print(temp3,1);

lcd.setCursor(6, 1);
lcd.write(byte(1));

//lcd.setCursor(12, 1);
//lcd.print(klawsek);
dzwiek = 0;
if (al1stan == 0 && al1==1) {lcd.setCursor(0, 0);lcd.write(byte(3));};
if (al1stan == 1 && al1==1) {lcd.setCursor(0, 0);lcd.write(byte(2));dzwiek = 1;};

if (al2stan == 0 && al2==1) {lcd.setCursor(9, 0);lcd.write(byte(3));};
if (al2stan == 1 && al2==1) {lcd.setCursor(9, 0);lcd.write(byte(2));dzwiek = 1;};

if (al3stan == 0 && al3==1) {lcd.setCursor(0, 1);lcd.write(byte(3));};
if (al3stan == 1 && al3==1) {lcd.setCursor(0, 1);lcd.write(byte(2));dzwiek = 1;};



if (millis() - previousMillis > 1000)   
 {
   temp1 = sensors.getTempC(czuj1);
   temp2 = sensors.getTempC(czuj2);
   temp3 = sensors.getTempC(czuj3); 
   sensors.setWaitForConversion(false);
   sensors.requestTemperatures();  
   previousMillis = millis(); 
 }

}

if (dzwiek == 1) { if (ton==0){ton=1;tone(10,2000);} else if (ton==1){ton=0;tone(10,1000);};} else {noTone(10);}
wdt_reset();

}




rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

E... tak to wiemy, tu magi żadnej nie ma, jest dokładnie tak jak proponował Cressi, aplikacja w pętli liczy sobie czas dokładnie tutaj

Kod: Zaznacz cały

if (millis() - previousMillis > 1000)   
 {
   temp1 = sensors.getTempC(czuj1);
   temp2 = sensors.getTempC(czuj2);
   temp3 = sensors.getTempC(czuj3);
   sensors.setWaitForConversion(false);
   sensors.requestTemperatures(); 
   previousMillis = millis();
 }
tylko tak,
  • to: sensors.setWaitForConversion(false); bym wywalił do sekcji setup() bo po co tą flagę ustawiać za każdym razem?
  • to: millis() - previousMillis > 1000 to bym zmienił na millis() - previousMillis > 750, bo tak jak jest odświeżanie jest poniżej sekundy, bo komunikacja z trzema czujnikami swoje zajmuje
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

crobe
50
Posty: 68
Rejestracja: niedziela, 21 lut 2016, 19:55
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: crobe »

No faktycznie można dać do setup :oops:

Ale 1000 bym zostawił .

Poza tymi program działa jak ktos chce termometr 3 czujniki.

System menu tez działa :)

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Twoja wola, według specyfikacji czujnika jednak nie jest to potrzebne, zwyczajnie ja bym to zrobił inaczej, najważniejsze że działa i jesteś zadowolony :)
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

Cressi
30
Posty: 35
Rejestracja: czwartek, 3 gru 2009, 18:16
Krótko o sobie: Jestem fajnym człowiekiem:)
Ulubiony Alkohol: Whisky,
Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
Lokalizacja: południowa Wielkopolska
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: Cressi »

Ja wykoncypowalem w tak zwanym miedyczasie cos innego, tylko musze to sprawdzi praktyce (nie mam ze soba Arduino.)
Licznik 1 jest skonfigurowany na generowanie przerwania co 1 sek . W przerwaniu :
odczytuje temperature
zleca kolejna konwersje
Cala reszta to juz zabawa w petli głownej. Jak zweryfikuje dzialanie to sie oczywiście podzielę.

Crobe, jedno pytanie. Widze ze odczytujesz adresy czujnikow bezposrednio w programie. Nie zdaza sie, ze Ci program zamieni czujniki miejscami?

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Nieee.... nie w przerwaniu absolutnie nic nie czytaj i nie zlecaj, przerwanie musi wykonać się szybko. Tam ew. flaga że to już i obsługa w głównej pętli, ale tak to arduino już sobie liczy te milisekundy przy pomocy timera0 i można z tego korzystać tak jak kolega Crobe.

Drugie pytanie w sumie nie do mnie, ale odpowiem. Czujniki nie powinny zamieniać się miejscami, zapewnia to algorytm wyszukiwania zaszyty w czujnikach.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

Cressi
30
Posty: 35
Rejestracja: czwartek, 3 gru 2009, 18:16
Krótko o sobie: Jestem fajnym człowiekiem:)
Ulubiony Alkohol: Whisky,
Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
Lokalizacja: południowa Wielkopolska
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: Cressi »

Tak, tak. Przerwanie ustawia mi tylko flage. Jesli w main wykryje ze jest ustawiona rozpoczynam odczyty,
Troche uproscilem opis.
A chce użyć przerwań z prozaicznej przyczyny - żeby sie ich po prostu nauczyć.

crobe
50
Posty: 68
Rejestracja: niedziela, 21 lut 2016, 19:55
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: crobe »

A może skoro 18b20 powoduje lagi sterowanie grupowe zrobić na dodatkowym attiny i wartość zadawać przez rs232...

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Oj tam DS18B20 nie powoduje lagów tylko jak jest programista jest :dupa: to wstawia tam delay żeby poczekać na zakończenie konwersji. ;) :mrgreen: Regulator można spokojnie wyprodukować na przerwaniach od timera jakiegoś tylko trzeba się upewnić że nie zabijemy konwersji. Na jak dasz detektor zera sieci to można się obejść bez timera w przypadku regulatora grupowego nawet jak w pętli głównej wstawimy chamskie opóźnienie.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

norbert-17
2
Posty: 2
Rejestracja: czwartek, 29 lip 2010, 19:35
Re: Sterownik aabratek LM/VM- arduino

Post autor: norbert-17 »

Witam, trafiłem na ten wątek gdyż szukałem rozwiązania zastosowania silnika krokowego do regulacji odbioru destylatu. Widzę, że kilka osób chciało by mieć choć elektroniczny pomiar temperatury :). Mój projekt własnie na tym etapie spoczywa. W przyszłości mam zamiar (jeśli tylko znajdę trochę wolnego czasu) dołożenie owej regulacji odbioru przy pomocy silnika krokowego (mam już pomysł wraz z kalibracją) oraz sterowania pompką przepływu wody i chłodzenia (obieg zamknięty). Mogę udostępnić schemat wraz z wsadem do procka (.hex), który pozwala na pomiar temperatury w 4 punktach (u mnie to: Keg, 10-półka, OVM, góra) wraz z zobrazowniem tego na wyświetlaczu LCD 4x20.
Koszt kupując częsci w polsce tak na oko:
wyświetlacz - 30zł
procek-10zł
czujniki 4 szt -30zł
pcb, drobne elementy - 30zł
Jak nie patrzyć wyjdzie koło 100zł ;/
Obrazek

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Koniecznie jeszcze jakiś kondensator 100nF (ceramik będzie całkiem ok.) przy nogach AVCC i VCC. Inaczej jak odpalisz sterownik mocy mogą Cię czekać niespodzianki. Ja bym dał jeszcze jakiś elektrolit 1-4,7uF na całą grupę.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

norbert-17
2
Posty: 2
Rejestracja: czwartek, 29 lip 2010, 19:35
Re: Sterownik aabratek LM/VM- arduino

Post autor: norbert-17 »

Cenna uwaga trzeba koniecznie dać elektrolit bo obydwóch stronach stabilizatora. Dzięki Rastro umkneło mi to. Odnośnie AVcc nie będe wykorzystywał raczej wcale (choć może będzie potrzebny przy silniczku krokowym) i nie trzeba go dodatkowo stabilizować.
Gdy uporam się z tym wyzwaniem będę chciał stworzyć drugi projekt tylko tym razem z użyciem czujników PT100. Rozdzielczość wzrosła by do dwóch miejsc po przecinku lecz trzeba by na pewno użyć zewnętrznego ADC oraz stabilnego źródła prądowego.

rastro
2500
Posty: 2557
Rejestracja: wtorek, 15 sty 2013, 15:29
Podziękował: 83 razy
Otrzymał podziękowanie: 297 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: rastro »

Lepiej jednak dać tam ten kondensatorek, koszt żaden a poczucie że jest dobrze bezcenne :D

Do czujnika PT100 polecam ADS1247/8 lub ADS124S06/08, są w zasadzie stworzone specjalnie do obsługi tych czujników, mają wbudowane po dwa przetworniki DAC jako źródło prądowe do zasilania czujnika... tylko że dostępne wyłącznie w obudowach smd z rastrem 0,65 i 0,5 mm.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett

Cressi
30
Posty: 35
Rejestracja: czwartek, 3 gru 2009, 18:16
Krótko o sobie: Jestem fajnym człowiekiem:)
Ulubiony Alkohol: Whisky,
Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
Lokalizacja: południowa Wielkopolska
Podziękował: 2 razy
Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino

Post autor: Cressi »

Kolejna wersja oprogramowania.(tym razem bez obsługi zaworu - TBD)
Obsługa za pomocą dwóch klawiszy.
Program startuje w trybie NO_CONTROL - tylko pomiar temperatury. Po ustabilizowaniu kolumny, odbiorze przedgonów etc. wciskam SET, program zapamiętuje średnia z ostatnich 3 pomiarów jako wartość referencyjną i przechodzi do trybu NORMAL.
W trybie normal program monitoruje wartość temperatury - jeśli średnia za 3 ostatnie pomiary jest wyższa o 0,1 od wartości referencyjnej włączamy buzzer.
Dźwięk buzzera można wyłączyć klawiszem RESET. Kiedy uznam ze temperatura wróciła na miejsce wciskam SET, znów pobierana jest wartość referenyjna i znów wchodzimy w tryb NORMAL
W trybie NORMAL:
SET - pobranie i zapamiętanie nowej temp. referencyjnej
RESET - wyjscie do trybu NO_CONTROL

Bedę wdzięczny za uwagi, sugestie czy wskazanie błędów.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
ODPOWIEDZ

Wróć do „Kontrola procesu destylacji”