Page 1 of 1

Arduino pradedančiajam

Posted: 2018-07-14 23:38
by tomasrs6
Sveiki! Domina pakonstruoti, paprogramuoti mikrovaldiklius; taip sakant nieko konkretaus, tiesiog susipažinti. Esu tame žalias, tad ar verta pradėti nuo Arduino? O gal reikalinga kita platforma? Susidomėjau šiuo
rinkiniu Gal kas gali patvirtinti ar paneigti.

Re: Arduino pradedančiajam

Posted: 2018-07-15 01:13
by kernel_panikuoja
Sakyciau pradeti nuo Arduino logiska. Siai platformai yra begale mokomosios medziagos internete, yra daug paruostu lib'u ivairoms situacijoms, labai user friendly API. Kiniski klonai pigus. Jei nori kuo paprasciausio varianto kazka imti ir padaryti, Arduino tam tinka bene geriausiai.

Jeigu uzsikabinsi ir po to noresi nuodugniau aiskintis kaip veikia visi "internalai" pas mikrokontrolerius, tada rekomenduociau pradet knisti klasika - 8051/8052 ir po to palaipsniui imti pazangesnius SOC'us.

Re: Arduino pradedančiajam

Posted: 2018-07-15 04:17
by Stipena
Tikrai verta jeigu netingi mokytis programuoti. Aš pats pradėjau nuo ATtiny2313 su AVR Basic programavimu, dabar pats turiu Arduino. Tik kad niekad labai giliai nesiknisdavau tame ir labai retai kažką darau, tai kaskart prisėdus prie kokio projekto tenka mokytis programuoti nuo nulio maždaug :)

Re: Arduino pradedančiajam

Posted: 2018-08-08 23:29
by Stipena
Žodžiu reikia kas 3s nuskaityti temperatūros bei drėgmės parodymus ir iškart juos perduoti į LCD, bet tuo pačiu metu valdyti stepper varikliuką, limit switch'us kurie ciklą prasuka 3 kartus per sekundę. Jeigu "void loop'e" nustatau delay(3000), stepperio ir limit switch'ų ciklas užsidelsia 3s. Gal kas turit įdėjų kaip kodas turėtų atrodyti kad stepper'is veiktų be pertraukimų main loop'e kas ~300ms, o temp nuskaitymas ir lcd update antriniame plane kas 3000ms?

Re: Arduino pradedančiajam

Posted: 2018-08-15 21:29
by Stipena
Pagaliau nebereikia keltis iš lovos kad pridaryti/atidaryti langą jeigu peršalta ar perkaršta kambaryje. Galiu ramiai miegoti nusistatęs reikiamą temp. :mrgreen:
Aišku kodo problemos pilnai išspręsti nepavyko. Duomenų nuskaitymo iš temperatūros daviklio metu yra pertraukiamas žingsninio variklio darbas ~250ms, bet kodas veikia patenkinamai ir kur kas geriau nei tas kuris buvo prieš savaitę. Šiuo metu dadėjau 5 mygtukus lango bei temperatūros reguliavimui. Dar turi parkeliauti iš banggood srieginis strypas su kuriuo bus galima greičiau uždaryti langą, nes šiuo metu naudojamas paprastas strypas su sriegiu yra pernelyg lėtas. Belieka tik atsispausdinti dėžutę viskam sukrauti į vidų.

Image

Re: Arduino pradedančiajam

Posted: 2018-08-15 22:04
by kernel_panikuoja
Nelabai supratau kokios bedos su laikais tau ten. Visada gali sleep'int kad ir po 10ms, ir kazka atlikineti atitinkamai kas N-taja loop'o iteracija. Arba jei reikia imituoti vienu metu keliu task'u daryma, galima naudoti time slot'us, tarkim uzsetinti, kad kazkiek ms pastoviai sautu timer'is ir jo interrupt handler'is atliktu kazkoki "house-keeping'a".

Re: Arduino pradedančiajam

Posted: 2018-08-15 22:36
by Stipena
Na nežinau kernel. Gal tiesiog man reikia atsisakyti Stepper.h library, nes visumoj bandžiau viską daryti kaip StateMachine t.y. nenaudoti delay komandos, tačiau yra stepsPerRevolution dalis kurią ištraukiau iš internetų ir panaudojau ir ten matosi delay funkcija. Jei atsisakysiu stepper.h library, teks pačiam mąstyti kaip čia ką daryti, galvojau apie switch() statement naudojimą su case'ais, bet nelabai dar gaudausi ir kai bandau galvoti tik galva skaudėt pradeda :lol:

Code: Select all

#include <AnalogMultiButton.h>
#include <Stepper.h>
#include "DHT.h"
#include "LiquidCrystal.h"

#define DHTPIN 3
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);

const int BUTTONS_PIN = A0;
const int BUTTONS_TOTAL = 5;
const int BUTTONS_VALUES[BUTTONS_TOTAL] = {0, 289, 452, 555, 627};
const int BUTTON_CLOSE = 0;
const int BUTTON_INCREASE = 1;
const int BUTTON_SET = 2;
const int BUTTON_DECREASE = 3;
const int BUTTON_OPEN = 4;
const int Opened = 12;
const int Closed = 13;
const int stepsPerRevolution = 2048;

unsigned long goTime;
unsigned long goTime2;

int OpenedState = 0 ;
int ClosedState = 0 ;
int interval = 96;  // initial delay for stepper motor rotation
int nextTime = 3000;

float SetTemp = 23.50;
float t;
float h;

Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
AnalogMultiButton buttons(BUTTONS_PIN, BUTTONS_TOTAL, BUTTONS_VALUES);

void setup() {
  
  dht.begin();
  lcd.begin(16, 2);
  pinMode(Opened, INPUT_PULLUP);
  pinMode(Closed, INPUT_PULLUP);
  goTime = millis();
  goTime2 = millis();
  
  myStepper.setSpeed( 0xEFFFFFFFL );  // Just to set the step_delay value to 0, to bypass the delay routine in the Stepper class.
}
/////////////////////////////////////////////////////
void CheckTemperature() {
  // Read temperature as Celsius (the default)
  t = dht.readTemperature();
  
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  h = dht.readHumidity();
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T:");
  lcd.print(t);
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("H:");
  lcd.print(h);
  lcd.print("%");
  lcd.setCursor(9, 0);
  lcd.print("S:");
  lcd.print(SetTemp);
  lcd.print("");
  
  if (OpenedState == LOW && t > SetTemp + 0.10) {
    lcd.setCursor(9,1);
    lcd.print("Opening");
  }
  else if (ClosedState == LOW && t < SetTemp - 0.10) {
    lcd.setCursor(9,1);
    lcd.print("Closing");
  }
 else {
    lcd.setCursor(9,1);
    lcd.print("Normal ");
 }
  //Serial.println(analogRead(BUTTONS_PIN));
  goTime2 += nextTime; 
}

void loop() {
  OpenedState = digitalRead(Opened) ;
  ClosedState = digitalRead(Closed) ;
  int stepsPerRevolution = 0;
  buttons.update();
  
  if (buttons.onPress(BUTTON_CLOSE))  {
      SetTemp = 40.00;
      lcd.clear();
      lcd.setCursor(5,0);
      lcd.print("Closing");
  }

  if (buttons.onPress(BUTTON_INCREASE)) {
      SetTemp = SetTemp + 0.10;
      lcd.clear();
      lcd.setCursor(6,0);
      lcd.print(SetTemp);
  }
  
  if (buttons.onPress(BUTTON_SET))  {
      SetTemp = 23.50;
      lcd.clear();
      lcd.setCursor(4,0);
      lcd.print("Temp Set");
      lcd.setCursor(6,1);
      lcd.print(SetTemp);
  }
  
  if (buttons.onPress(BUTTON_DECREASE)) {
      SetTemp = SetTemp - 0.10;
      lcd.clear();
      lcd.setCursor(6,0);
      lcd.print(SetTemp);
  }
  
  if (buttons.onPress(BUTTON_OPEN)) {
      SetTemp = 10.00;
      lcd.clear();
      lcd.setCursor(5,0);
      lcd.print("Opening");
  }
 
  if (millis() >= goTime2)
    CheckTemperature();
  
  if (OpenedState == LOW && t > SetTemp + 0.10)
    stepsPerRevolution--;
 
  if (ClosedState == LOW && t < SetTemp - 0.10)
    stepsPerRevolution++;
 
  if ( stepsPerRevolution ) {
    myStepper.step(stepsPerRevolution);
    interval /= 1.5;
    if(interval < 2)
    interval = 2;
    delay(interval);
    goTime = millis();
  }

  else {
    interval = 96;
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
  }    
}