Arduino Polska Forum

Pełna wersja: Wykonanie termometru i czujnika przechyłu
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam
Mam nadzieję że wybrałem dobry dział. Szukam pomocy w wykonaniu termometru. Dwa czujniki, jeden oryginalny czujnik temperatury wody, 2 piny, opór od 2.5kOhm do 70Ohm; drugi najprostszy termistor NTC 10k. Temperatura będzie pokazywana na wyświetlaczu, najlepiej obie w tym samym czasie.
Czujnik przechyłu będzie zasilany napięciem 5V i w normalnej pozycji na wyjściu ma 0.4 - 1.4V natomiast po odwróceniu go napięcie wzrasta do 3.7 - 4.4V i w tym momencie musi włączyć się przekaźnik aż do resetu arduino.
Próbuję sam coś przy tym dłubać ale nie ukrywam że kończy mi się czas i wolałbym zapłacić jakiś rozsądny pieniądz za napisanie czegoś takiego.
Układ zmontuję sam.

Dziękuję i pozdrawiam serdecznie
Po pierwsze potrzebujesz zmapować sobie czujniki , ponieważ są analogowe a charakterystyka może być nieliniowa to może być to spory kłopot . Wymieniłbym je na cyfrowe lub zwykłe LM35 . czujnik przechyłu to prostrzej funkcji chyba niema . Tu masz przykład na 3 czujnikach analogowych i 1 przekaźnik .

Kod:
// A2 - czujnik temp 2
// A1 - czujnik temp 1
// A0 - czujnik przechylenia
// D10 - przekaźnik

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {

  lcd.begin(16, 2);
  pinMode(10,OUTPUT);
  
}

void loop() {
  
  if (analogRead(A0) < 500){digitalWrite(10,HIGH);}
  
  int temp1 = map(analogRead(A1),0,1023,-50,50);
  int temp2 = map(analogRead(A2),0,1023,-50,50);
  
  
  lcd.setCursor(2,0);
  lcd.print(temp1);lcd.print(" C");
  lcd.setCursor(2,1);
  lcd.print(temp2);lcd.print(" C");
  
}
Najmocniej dziękuję za odpowiedź. Tak jak powiedziałeś, czujnik ma nieliniową charakterystykę jednak chciałbym go wykorzystać żeby nie modyfikować niepotrzebnie układu chłodzenia.
Tu masz mniej więcej jak sobie poradzić z nieliniowością ale będziesz musiał grzać czujniki , zrobić wykres i powstawiać sobie dane do zmiennych a1,b1,c1,d1 . Jakbyś nie zrozumiał to pytaj bo jest 3 w nocy i nie bardzo już mi się chce rozpisywać .

Kod:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int a1[7] = { 0,0,100,200,300,400,500 }; // zakres poziom niski
int b1[7] = { 0,100,200,300,400,500,600 }; // zakes poziom wysoki
int c1[7] = { 0,-20,-10,0,10,20,30 }; // przedział temperatury od
int d1[7] = { 0,-10,0,10,20,30,40 }; // przedział temperatury do
byte ac;

void setup() {

  lcd.begin(16, 2);
  pinMode(10,OUTPUT);
  
}

void loop() {
  
  if (analogRead(A0) < 500){digitalWrite(10,HIGH);}
  
  int term1 = analogRead(A1);
  int term2 = analogRead(A2);
  
  if (term1 == 0 and term1 <= 100 ){ac = 1;} // odczyt temp 1 i pzydzielenie zakresu 1
  if (term1 > 100 and term1 <= 200 ){ac = 2;} // odczyt temp 1 i pzydzielenie zakresu 2
  if (term1 > 200 and term1 <= 300 ){ac = 3;} // odczyt temp 1 i pzydzielenie zakresu 3
    
  int a = a1[ac];int b = b1[ac]; // przeliczenia zakresów
  int c = c1[ac];int d = d1[ac]; //
  
int temp1 = map(term1,a,b,c,d); // mapowanie wedłóg ustalonych zakresów
int temp2 = map(term2,a,b,c,d);
  
  lcd.setCursor(2,0);
  lcd.print(temp1);lcd.print(" C"); // wynik
  lcd.setCursor(2,1);
  lcd.print(temp2);lcd.print(" C");
  
}