Jump to content
ELFORUM - Forumul electronistilor
Guest paulinu

Programare Arduino

Recommended Posts

Guest 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 to comment
Share on other sites

Guest 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.

Edited by paulinu
Link to comment
Share on other sites

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 to comment
Share on other sites

Guest 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.

Edited by paulinu
Link to comment
Share on other sites

Guest 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 to comment
Share on other sites

Guest 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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

Guest 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.

Edited by paulinu
Link to comment
Share on other sites

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 to comment
Share on other sites

Guest 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.

Edited by paulinu
Link to comment
Share on other sites

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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines