Arduino pradedančiajam

Diskusijos susijusios su įvairiu programavimu
Post Reply
tomasrs6
Posts: 55
Joined: 2010-11-28

Arduino pradedančiajam

Post by tomasrs6 » 2018-07-14 23:38

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.

kernel_panikuoja
Posts: 242
Joined: 2016-12-18

Re: Arduino pradedančiajam

Post by kernel_panikuoja » 2018-07-15 01:13

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.

User avatar
Stipena
Posts: 1448
Joined: 2011-01-12
Location: Klaipėda
Contact:

Re: Arduino pradedančiajam

Post by Stipena » 2018-07-15 04:17

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 :)
Ryzen 1600X Be quiet Dark Rock Pro 4, Gigabyte B350 Gaming 3, RX Vega 56 Morpheus II Be quiet Silent Wings 3, 16GB DDR4, SM951 256GB NVMe, 850EVO 500GB, MX500 1TB, Be quiet Straight Power 11 750W, FD Define S, BenQ XL2730Z 27" 1440p 144Hz Freesync, Steelseries (M800, Sensei Wireless, Siberia 840), Logitech Z-5500

User avatar
Stipena
Posts: 1448
Joined: 2011-01-12
Location: Klaipėda
Contact:

Re: Arduino pradedančiajam

Post by Stipena » 2018-08-08 23:29

Ž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?
Ryzen 1600X Be quiet Dark Rock Pro 4, Gigabyte B350 Gaming 3, RX Vega 56 Morpheus II Be quiet Silent Wings 3, 16GB DDR4, SM951 256GB NVMe, 850EVO 500GB, MX500 1TB, Be quiet Straight Power 11 750W, FD Define S, BenQ XL2730Z 27" 1440p 144Hz Freesync, Steelseries (M800, Sensei Wireless, Siberia 840), Logitech Z-5500

User avatar
Stipena
Posts: 1448
Joined: 2011-01-12
Location: Klaipėda
Contact:

Re: Arduino pradedančiajam

Post by Stipena » 2018-08-15 21:29

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
Ryzen 1600X Be quiet Dark Rock Pro 4, Gigabyte B350 Gaming 3, RX Vega 56 Morpheus II Be quiet Silent Wings 3, 16GB DDR4, SM951 256GB NVMe, 850EVO 500GB, MX500 1TB, Be quiet Straight Power 11 750W, FD Define S, BenQ XL2730Z 27" 1440p 144Hz Freesync, Steelseries (M800, Sensei Wireless, Siberia 840), Logitech Z-5500

kernel_panikuoja
Posts: 242
Joined: 2016-12-18

Re: Arduino pradedančiajam

Post by kernel_panikuoja » 2018-08-15 22:04

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

User avatar
Stipena
Posts: 1448
Joined: 2011-01-12
Location: Klaipėda
Contact:

Re: Arduino pradedančiajam

Post by Stipena » 2018-08-15 22:36

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);
  }    
}
Ryzen 1600X Be quiet Dark Rock Pro 4, Gigabyte B350 Gaming 3, RX Vega 56 Morpheus II Be quiet Silent Wings 3, 16GB DDR4, SM951 256GB NVMe, 850EVO 500GB, MX500 1TB, Be quiet Straight Power 11 750W, FD Define S, BenQ XL2730Z 27" 1440p 144Hz Freesync, Steelseries (M800, Sensei Wireless, Siberia 840), Logitech Z-5500

Post Reply