Sari la conținut
ELFORUM - Forumul electronistilor

Programare Arduino


Vizitator paulinu

Postări Recomandate

Vizitator paulinu

Vreau sa folosesc un arduino pentru un sistem climatronic la autoturism.

Folosesc:

arduino uno

sensori 2x DS18B20

display 16x2

servo motor towerpro sg90

Acum am nevoie sa scriu sa seteze o valoare minima sau maxima (fara sa arate min si max, ex: 18 - 28) folosind doua push button.

Si in functie de ce temperatura va arata in interiorul masini va controla servo motorul depinzand de temeperatura setata.

Un alt buton va activa un mod AUTO care va regla viteza aerotermei pana ajunge la valoarea temp setate.

Alte doua push button care va regla turatia aerotermei care va fi indicata si pe display ca niste bare.

Pana acum am reusit sa indice cele doua temperaturi.

 

 

 

#include <OneWire.h>#include <DallasTemperature.h>#include <LiquidCrystal.h> #define ONE_WIRE_BUS 7LiquidCrystal lcd(13, 12, 11, 10, 9, 8);OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire); void setup() {  lcd.begin(16, 2);  sensors.begin();} void loop() {  sensors.requestTemperatures();  lcd.setCursor(0, 0);  lcd.print("");  lcd.print(sensors.getTempCByIndex(0));  lcd.setCursor(2, 0);  lcd.print("'C "); lcd.setCursor(0, 1);  lcd.print("");  lcd.print(sensors.getTempCByIndex(1));  lcd.setCursor(2, 1);  lcd.print("'C ");}

 

 

Sunt ocupate 4 caractere pe randul 1 si 4 pe randul 2.

Pe randul 1 coloana 6 sa arate temperatura de setare apoi min bare max.(turatia aerotermei) Astea ar  fi usor de mutat pe display de colo-colo... ce ma omoara pe mine este cod-ul.

Link spre comentariu
  • Răspunsuri 28
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nico_2010

    4

  • core

    4

  • UDAR

    2

  • digix

    2

Top autori în acest subiect

Vizitator paulinu

Programul?? Te referi la codul care este pus in spoiler? Conectivitatea butoanelor... inca nu sunt conectate. Pe arduino au mai ramas pinii liberi pe digital 2, 3, 4, 5, 6 si pe analog 0, 1, 2, 3, 4, 5. Ar mai fi de conectat inca 5 sau daca mai ramane, un loc, 6 butoane. Al sase-lea fiind pentru activare si dezactivare AC.

Senzorii sunt pe un singur pin.

Editat de paulinu
Link spre comentariu

In masina e greu sa nimeresti prea multe butoane cand conduci.

 

Incearca un encoder poti regla ca la un potentiometru sus, jos in plus ai si butonul ok prin apasare ax.

Exista encodere cu iluminare ax, prin led RGB si poti face o reprezentarea vizuala a temperaturii setate prin culoarea afisata (la extreme rosu pentru cald...albastru pentru rece)

 

In ce priveste afisarea arata mult mai bine on OLED 128x64 si are o vizibilitate buna din mai toate unghiurile.

 

In ce masina vrei sa montezi chestia asta ?

Link spre comentariu
Vizitator paulinu

Nu, nu, nu ... nu imi spune de display OLED si, da stiu la ce te referi, buton rotativ, dar la ala mai trebuie inca un  chip ... deja o complici prea mult. Eu deja am display, senzori, butoane, arduino, tot. Doar am nevoie de ajutor la sketch. Incerc si de unul singur sa il fac dar nu gasesc exact ce am nevoie sa scriu.

 

In masina e greu sa nimeresti prea multe butoane cand conduci.

 Pai mod-ul AUTO pentru ce mai este? Ii setez temperatura si el isi regleaza tot, turatie aeroterma, clapeta( creca clapeta este care directioneaza aerul) si compresorul AC.

Pe sandero.

Spuneti va rog ce trebuie sa scriu in sketch ca sa imi arate pe display: set 18 si cand apas pe un buton sa creasca cate unu pana la 30(30 cred ca este prea mult) si pe alt buton sa scada cate unu.

Editat de paulinu
Link spre comentariu

Cred ca tu esti cel mai in masura sa stii ce ar trebui sa scrii in sketch. Noi nu avem un glob de cristal care sa ne arate dorintele tale.

Posteaza ce ai facut pana acum si vei primi ajutor.

Link spre comentariu
Vizitator paulinu

mmm, ok ... cam asta am facut pana acum

 

 

#include <OneWire.h>#include <DallasTemperature.h>#include <LiquidCrystal.h> #define ONE_WIRE_BUS 7LiquidCrystal lcd(13, 12, 11, 10, 9, 8);OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire); void setup() {  lcd.begin(16, 2);  sensors.begin();} void loop() {  sensors.requestTemperatures();  lcd.setCursor(0, 0);  lcd.print("");  lcd.print(sensors.getTempCByIndex(0));  lcd.setCursor(2, 0);  lcd.print("'C ");   lcd.setCursor(0, 1);  lcd.print("");  lcd.print(sensors.getTempCByIndex(1));  lcd.setCursor(2, 1);  lcd.print("'C ");}

 

 

 

 

 

#include <OneWire.h>#include <DallasTemperature.h>#include <LiquidCrystal.h> const int buttonPin1 = A0; const int buttonPin2 = A1; int buttonPushCounter = 18; int buttonPushCounterMin = 18; int buttonPushCounterMax = 30; int buttonState1 = 0; int buttonState2 = 0; int lastButtonState = 0;#define ONE_WIRE_BUS 7LiquidCrystal lcd(13, 12, 11, 10, 9, 8);OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire); void setup() {  lcd.begin(16, 2);  sensors.begin();  lcd.setCursor(4, 0);  lcd.print("Set Temp");  lcd.setCursor(13, 0);  lcd.print(buttonPushCounter);  pinMode(buttonPin1, INPUT);  pinMode(buttonPin2, INPUT);  Serial.begin(9600);} void loop() {  buttonState1 = digitalRead(buttonPin1);  if (buttonState1 != lastButtonState) {    if (buttonState1 == HIGH)    {      buttonPushCounter++;      lcd.setCursor(13, 0);      lcd.print(buttonPushCounter);    }    delay(100);  }  lastButtonState = buttonState1;  buttonState2 = digitalRead(buttonPin2);  if (buttonState2 != lastButtonState) {    if (buttonState2 == HIGH) {      buttonPushCounter-=1;      lcd.setCursor(13, 0);      lcd.print(buttonPushCounter);    }    delay(100);  }  if (buttonPushCounter < buttonPushCounterMin) {    lcd.setCursor(13, 0);    lcd.print("MIN");  }  if (buttonPushCounter > buttonPushCounterMax) {    lcd.setCursor(13, 0);    lcd.print("MAX");  }  lastButtonState = buttonState2;}

 

 

S-a facut cam tarziu, deci maine urmeaza sa le combin.

Sper ca acum va puteti da seama unde vreau sa ajung.

Link spre comentariu
Vizitator paulinu

As avea nevoie de niste sugesti la asta . Nu imi iese. Vreau sa arate ca niste bare, cand apas butonul1 arata prima bara cand iar apas pe acelas buton arata a doua bara s.a.m.d.. Dar problema este ca dispare bara anterioara. Am incercat si fara comanda else dar cand apas pe butonul2 ca sa scada nu dispare din bare.

 

 

#include <LiquidCrystal.h>// initialize the libraryLiquidCrystal lcd(13, 12, 11, 10, 9, 8);const int buttonPin1 = A0;const int buttonPin2 = A1; int buttonPushCounter = 0; int buttonPushCounter0 = 0; int buttonPushCounter1 = 1; int buttonPushCounter2 = 2; int buttonPushCounter3 = 3; int buttonPushCounter4 = 4; int buttonState1 = 0; int buttonState2 = 0; int lastButtonState = 0;  byte BLANK[8] = {  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000 };byte LVL1[8] = {  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b11111,  0b11111};byte LVL2[8] = {  0b00000,  0b00000,  0b00000,  0b00000,  0b11111,  0b11111,  0b11111,  0b11111};byte LVL3[8] = {  0b00000,  0b00000,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111};byte LVL4[8] = {  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111};void setup(){  lcd.setCursor(10 ,1);  lcd.print("-");  lcd.setCursor(15, 1);  lcd.print("+");  pinMode(buttonPin1, INPUT);  pinMode(buttonPin2, INPUT);  lcd.createChar(1, LVL1);  lcd.createChar(2, LVL2);  lcd.createChar(3, LVL3);  lcd.createChar(4, LVL4);  lcd.createChar(5, BLANK);  lcd.begin(16, 2);}void loop() {  lcd.setCursor(10 ,1);  lcd.print("-");  lcd.setCursor(15, 1);  lcd.print("+");  buttonState1 = digitalRead(buttonPin1);  if (buttonState1 != lastButtonState) {    if (buttonState1 == HIGH) {      buttonPushCounter++;    }    delay(200);    lastButtonState = buttonState1;  }  buttonState2 = digitalRead(buttonPin2);  if (buttonState2 != lastButtonState) {    if (buttonState2 == HIGH) {      buttonPushCounter-=1;    }    delay(200);    lastButtonState = buttonState2;  }  if (buttonPushCounter == buttonPushCounter1) {    lcd.setCursor(11, 1);    lcd.write(byte(1));  }  else {    lcd.setCursor(11, 1);    lcd.write(byte(5));  }  if (buttonPushCounter == buttonPushCounter2) {    lcd.setCursor(12, 1);    lcd.write(byte(2));  }  else {    lcd.setCursor(12, 1);    lcd.write(byte(5));  }  if (buttonPushCounter == buttonPushCounter3) {    lcd.setCursor(13, 1);    lcd.write(byte(3));  }  else {    lcd.setCursor(13, 1);    lcd.write(byte(5));  }    if (buttonPushCounter == buttonPushCounter4) {    lcd.setCursor(14, 1);    lcd.write(byte(4));  }  else {    lcd.setCursor(14, 1);    lcd.write(byte(5));  }}

 

 

Si referitor la celalalt post in legatura cu al doilea cod cand ajunge la 30 si apare MAX si scade sub 30 nu dispare X-ul. La fel se intampla si cu MIN, nu dispare N-ul. Trebuie sa fac un refresh la ecran, sau cum?!

Link spre comentariu

sunt 4 butoane, nu doua. Fiecare buton iti arata un simbol de bare, cand il tii apasat, pe o pozitie diferita fiecarui buton.

 

referitor la stergerea lui X sau N, trebuie sa mai scrii un spatiu suplimentar cand scrii cifra. Nu poti sterge 3 caractere cu 2.

Link spre comentariu

incearca lastButtonState diferit pentru fiecare buton.

eventual comaseaza si codul, in partea a doua, sa fie mai citet:

  for ( i = 1; i < 5; i ++ ) {    lcd.setCursor(10 + i, 1);    if (buttonPushCounter == i)      lcd.write(byte(i));    else      lcd.write(byte(5));  }
Link spre comentariu
Vizitator paulinu

Multumesc pentru sfat.... nu prea inteleg cum sa il fac mai citet... Sunt incepator cu arduino, deocamdata il las asa, sa pot intelege cat de cat.

Am rezolvat problema.

Acum apare alta cu cotrol al motor-ului cu PWM. Treptele functioneaza dar cand nu trebuie sa se invarte, se invarte, foarte incet.

 

 

#include <LiquidCrystal.h>LiquidCrystal lcd(13, 12, 11, 10, 9, 8);const int buttonPin1 = A0;const int buttonPin2 = A1; int buttonPushCounter = 0; int buttonPushCounter0 = 0; int buttonPushCounter1 = 1; int buttonPushCounter2 = 2; int buttonPushCounter3 = 3; int buttonPushCounter4 = 4; int buttonState1 = 0; int buttonState2 = 0; int lastButtonState = 0; int motorPin = 3;  byte BLANK[8] = {  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000 };byte LVL1[8] = {  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b11111,  0b11111};byte LVL2[8] = {  0b00000,  0b00000,  0b00000,  0b00000,  0b11111,  0b11111,  0b11111,  0b11111};byte LVL3[8] = {  0b00000,  0b00000,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111};byte LVL4[8] = {  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111};void setup(){  pinMode(buttonPin1, INPUT);  pinMode(buttonPin2, INPUT);  lcd.createChar(1, LVL1);  lcd.createChar(2, LVL2);  lcd.createChar(3, LVL3);  lcd.createChar(4, LVL4);  lcd.createChar(5, BLANK);  lcd.begin(16, 2);}void loop() {  lcd.setCursor(10 ,1);  lcd.print("-");  lcd.setCursor(15, 1);  lcd.print("+");  buttonState1 = digitalRead(buttonPin1);  if (buttonState1 != lastButtonState) {    if (buttonState1 == HIGH) {      buttonPushCounter++;      if (buttonPushCounter > 4) {        buttonPushCounter-=1;      }    }    delay(200);    lastButtonState = buttonState1;  }  buttonState2 = digitalRead(buttonPin2);  if (buttonState2 != lastButtonState) {    if (buttonState2 == HIGH) {      buttonPushCounter-=1;      if (buttonPushCounter < 0) {        buttonPushCounter++;      }    }    delay(200);    lastButtonState = buttonState2;  }  if (buttonPushCounter == buttonPushCounter1) {    lcd.setCursor(11, 1);    lcd.write(byte(1));  }  if (buttonPushCounter == buttonPushCounter2) {    lcd.setCursor(12, 1);    lcd.write(byte(2));  }  if (buttonPushCounter == buttonPushCounter3) {    lcd.setCursor(13, 1);    lcd.write(byte(3));  }  if (buttonPushCounter == buttonPushCounter4) {    lcd.setCursor(14, 1);    lcd.write(byte(4));  }  if (buttonPushCounter < buttonPushCounter1) {    lcd.setCursor(11, 1);    lcd.write(byte(5));  }  if (buttonPushCounter < buttonPushCounter2) {    lcd.setCursor(12, 1);    lcd.write(byte(5));  }  if (buttonPushCounter < buttonPushCounter3) {    lcd.setCursor(13, 1);    lcd.write(byte(5));  }  if (buttonPushCounter < buttonPushCounter4) {    lcd.setCursor(14, 1);    lcd.write(byte(5));  }  if (buttonPushCounter == 0) {    analogWrite(motorPin, 255);  }  if (buttonPushCounter == 1) {    analogWrite(motorPin, 191);  }  if (buttonPushCounter == 2) {    analogWrite(motorPin, 127);  }  if (buttonPushCounter == 3) {    analogWrite(motorPin, 64);  }  if (buttonPushCounter == 4) {    analogWrite(motorPin, 0);  }}

 

 

Folosesc un TIP 127 (PNP Darlington tranzistor) si o dioda.

Probabil trebuie sa pun si schema?

Ei bine este destul de simplu. Baza cu 1kOhm la Pin3 pe arduino, colector la minus baterie si emitor la minus motor. Dioda este pusa de la emiter ->|- plus baterie.

Editat de paulinu
Link spre comentariu

Nu cunosc Arduino dar bănuiesc că acel Pin3 furnizează 0V respectiv 5V . În acest caz nu e bine cum ai legat tranzistorul , nu se blochează niciodată așa. Când Pin3 e în zero tranzistorul este polarizat puternic , când este în 5V este polarizat mai puțin dar este totuși . Ar trebui ca Pin3 să fie de tip OC sau OD și să reziste la 12V . 

Link spre comentariu
Vizitator paulinu

Ma gandeam ca este mai bine sa folosesc un mosfet, dar nu stiam cum sa il leg, nu aveam internet sa verific.

Maine o sa incerc cu un IRF530. N-Channel mosfet.

Mai este servomotor-ul, (sper sa nu imi dea batai de cap...) apoi ....

mai ramane de scris partea  AUTO.

Editat de paulinu
Link spre comentariu

Un Arduin-ist să confirme sau infirme supoziția mea . Dacă e adevărată ai mai multe variante - cu MOSFET canal n , cu darlington npn , cu un inversor inainte , etc. Dar până nu știu sigur nu merg mai departe .

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări