Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 03 10, 13:48. Visos datos yra GMT + 2 valandos.
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
Sveiki, reik pagalbos visiškai žaliam pradedančiam "programeriui".
Valdikliukas arduino uno. Interneto platybėse buvo rastas toks (mano manymu gan paprastas ir pradedančiam suprantamas) ledų pwm valdymui sketch-as. Įkėliau į arduiną - veikia. Dabar šiek tiek aš jį patobulinau - tiek geležį tiek sketch-ą: pajungiau i2c lcd ir DHT22 - datą ir laiką rodo, temperatųrą ir drėgmę - taip pat. Tiek dar ir pats sugebėjau pasidaryti, bet reikia pagalbos. Ant 10 pin-o pasijungiau dioduką per varžą - viskas vyksta pagal programą lyg ir - švelniai užsižiebia ir užgęsta. Ką padaryti, kad ekrane matyčiau ir PWM lygį%?
Tikriausia turėtų būti kažkas panašaus kaip čia:
Kodas:
int pct = map(10,0,255,0,100); //Calculate PWM percentage
lcd.setCursor(0,3); // set cursor to column 0, row 4
lcd.print("Light intensity "); // Light intensity
if (pct() < 10) lcd.print("0"); // kad butu 01 ir t.t.
lcd.print(pct);
lcd.print("%");
Pats išeitinis kodas buvo toks:
Kodas:
* Author: User "benjaf" at plantedtank.net forums
* URL: https://github.com/benjaf/LightController
// ----------------------- Constants -----------------------
const int MaxChannels = 2; // Max number of channels, change if more or less are required
const int MaxPoints = 10; // Max number of light intensity points, change if more or less are required
// ----------------------- Functions -----------------------
long lastUpdateTime = 0;
// Update light intensity values
void UpdateLights(DateTime currentTime)
{
long now = Seconds(currentTime.hour(), currentTime.minute(), currentTime.second()); // Convert current time to seconds since midnight
if(now != lastUpdateTime) // Perform update only if there is a perceivable change in time (no point wasting clock cycles otherwise)
{
for(int channel = 0; channel < MaxChannels; channel++) // For each Channel
{
analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); // Get updated light intensity and write value to pin (update is performed when reading value)
}
}
lastUpdateTime = now;
}
// Convert HH:mm:ss -> Seconds since midnight
long Seconds(int hours, int minutes, int seconds) {
return ((long)hours * 60 * 60) + (minutes * 60) + seconds ;
}
// Clock
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Set RTC time to sketch compilation time, only use for 1 (ONE) run. Will reset time at each device reset!
}
// ----------------------- Loop -----------------------
void loop() {
// Get current time
CurrentTime = RTC.now();
int pct = map(10,0,255,0,100); //Calculate PWM percentage
lcd.setCursor(0,3); // set cursor to column 0, row 4
lcd.print("Light intensity "); // Light intensity
if (pct() < 10) lcd.print("0"); // kad butu 01 ir t.t.
lcd.print(pct);
lcd.print("%");
Tavo "pct" yra kintamasis, o ne funkcija. Kompiliatorius klaidos nemeta?
Siaip ilgas kodas ten zemiau, tad neskaiciau. Taip pat neaisku ka daro ta funkcija map(). Ir ar isvis ten funkcija?
Ne, tai kompiliatorius tai aišku, kad mes klaidą. Šios pabaigos net nedėjau į sketch-ą.
Šiaip tai visiškai neturu žalio supratimo, kaip ir iš kur pasiimti pwm lygį, kuris bus 10 pin.
O tas map, tai gal owm reikšmes 0-255 perskaičiuoja į 0-100.
Ne, tai kompiliatorius tai aišku, kad mes klaidą. Šios pabaigos net nedėjau į sketch-ą.
Šiaip tai visiškai neturu žalio supratimo, kaip ir iš kur pasiimti pwm lygį, kuris bus 10 pin.
O tas map, tai gal owm reikšmes 0-255 perskaičiuoja į 0-100.
pwm reikšmė nuo 8:00 iki 8:30 pakyla nuo 0 iki 150 (t.y nuo 0 iki ~50%). Štai šį kitimą aš ir norėčiau ekrane natyti, tik nežinau kaip
Tau reikia ieskoti kas yra tu f-ju viduj.
Pradziai susirask kur yra aprasyta struktura, o joje bus funkcija AddPoint(). Toliau is ten ieskok kur aprasyta ta fuinkcija ir kaip ji veikia.
O tai ką nan reikia išvesti?
Ekrane norėčiau matyti, kaip kinta intensity realiu laiku.
Noriu taip pat, kaip dht22 temperatūrąvir drėgmę taip ir intensity matyt realiy laiku.
Rašiau kad žalias esu arduine ir nežinau ką išvesti žinau tik tai ką noriu rezultate matyti.
Tai ką man reikia išvesti?
O tai ką nan reikia išvesti?
Ekrane norėčiau matyti, kaip kinta intensity realiu laiku.
Noriu taip pat, kaip dht22 temperatūrąvir drėgmę taip ir intensity matyt realiy laiku.
Rašiau kad žalias esu arduine ir nežinau ką išvesti žinau tik tai ką noriu rezultate matyti.
Tai ką man reikia išvesti?
As tau nesakysiu konkreciai, kitaip pazinojimo dziaugsmas nebus toks saldus
Inzinieriai shortcut'u neturi. Viskas visada gaunama sunkesniu keliu.
1. intensity yra kintamasis, o ne funkcija, todel tau ir reikia ten isvesti kaip kintamaji.
2. Nezinau kaip ten ta funkcija veikia, bet panasu, kad AddPoint() f-joje intensity bus perduodamas tik viena karta. Gal tau to ir reikia - neaisku.
Na gerai - tame ilgajame kode yra tokius reikaliux:
Kodas:
analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); // Get updated light intensity and write value to pin (update is performed when reading value)
Jei iš čia parašytau:
Serial.print(GetLightlntensitylnt());
Suveiktų?
Gaila dabar neprieinu prie PC, negaliu pasimėginti (tapšnoklį baksnoju ir dėl to iš anksto atsiprašau už klaidas).
Tai 3 parametras ir yra tavo PWM reikšmė. Jis fiksuotas 0 ir 150. Tai po kiekviena tokia eilute gali ir išvesti alia print("0"). Atitinkamai ir kitose vietose, kur keičiamas PWM.
Jeigu nori matyti rėžius ne 0-255, tai gali panaudoti tą "pct = map(X,0,255,0,100); " Vietoje X įrašai PWM reikšmę ir perskaičiuos proporcingai į 0-100%. Tada print(pct);