|
|
Elektronika.lt portalo forumas
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 02 02, 11:46. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Programavimas » Arduino pwm value to screen?
|
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
|
|
|
Puslapis 1 iš 4 Pereiti prie 1, 2, 3, 4 Toliau |
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 17, 21:44 |
|
|
|
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
// ----------------------- RTC Library -----------------------
#include <Wire.h>
#include "RTClib.h"
#include "ChannelManager.h"
// ----------------------- 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
// ----------------------- Variables -----------------------
RTC_DS1307 RTC;
DateTime CurrentTime;
// ----------------------- Lights -----------------------
// Example:
// Channels[0].AddPoint(8, 0, 0);
// Channels[0].AddPoint(8, 30, 255);
// Channels[0].AddPoint(11, 0, 255);
// ...
//
// Explanation:
// 00:00 - 08:00 -> Light OFF
// 08:00 - 08:30 -> Increment light towards Fully ON
// 08:30 - 11:00 -> Light Fully ON
//
// Min intensity value: 0 (OFF)
// Max intensity value: 255 (Fully ON)
//
// If only 1 point is added, channel always maintains value of that point
Channel Channels[MaxChannels];
Point Points[MaxChannels][MaxPoints];
void InitializeChannels(int channels) {
// Channel 0:
int channelNo = 0; // Currently editing channel 0
int pin = 10; // Channel 0 uses pin 10
Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]); // Initialize channel and choose FadeMode
Channels[channelNo].AddPoint(8, 0, 0); // Add Point (can also use decimal values ranging from 0 to 1 if you prefer)
Channels[channelNo].AddPoint(9, 0, 255);
Channels[channelNo].AddPoint(19, 30, 255);
Channels[channelNo].AddPoint(20, 0, 0);
// Channel 1:
channelNo = 1; // Currently editing channel 1
pin = 11; // Channel 1 uses pin 11
Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
Channels[channelNo].AddPoint(8, 0, 0);
Channels[channelNo].AddPoint(8, 30, 150);
Channels[channelNo].AddPoint(11, 0, 255);
Channels[channelNo].AddPoint(11, 15, 0);
Channels[channelNo].AddPoint(12, 30, 0);
Channels[channelNo].AddPoint(12, 45, 255);
Channels[channelNo].AddPoint(19, 30, 150);
Channels[channelNo].AddPoint(20, 0, 0);
}
// ----------------------- 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 ;
}
// ----------------------- Setup -----------------------
void setup() {
// Initialize channel schedules
InitializeChannels(MaxChannels);
// 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();
// Update lights
UpdateLights(CurrentTime);
}
|
|
|
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 18, 21:28 |
|
|
|
Saulix rašo: |
Tikrai būtų labai šaunu, jei kas nors paprotintų |
Citata: |
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? |
|
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 18, 22:00 |
|
|
|
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.
Šitam visam ilgam kode, tarkim čia:
Kodas: |
Channels[channelNo].AddPoint(8, 0, 0);
Channels[channelNo].AddPoint(8, 30, 150); |
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 |
|
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 18, 22:20 |
|
|
|
Saulix rašo: |
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.
Šitam visam ilgam kode, tarkim čia:
Kodas: |
Channels[channelNo].AddPoint(8, 0, 0);
Channels[channelNo].AddPoint(8, 30, 150); |
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. |
|
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 18, 23:02 |
|
|
|
A kita vertus AddPoint yra aprašyta chanelmanager.cpp faile:
Kodas: |
// Add Point to first available position (wrapper function)
void Channel::AddPoint(int h, int m, float intensity)
{
Point p = Point(h, m, intensity); |
ir jeigu prie visų serialprint-ų parašau papildomą eilutę:
Kodas: |
Serial.print(Intensity());
|
gaunu klaidą: "error: 'Intensity' was not declared in this scope"
vienžo - man čia misija neįmanoma.... |
|
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 18, 23:10 |
|
|
|
Saulix rašo: |
A kita vertus AddPoint yra aprašyta chanelmanager.cpp faile:
Kodas: |
// Add Point to first available position (wrapper function)
void Channel::AddPoint(int h, int m, float intensity)
{
Point p = Point(h, m, intensity); |
ir jeigu prie visų serialprint-ų parašau papildomą eilutę:
Kodas: |
Serial.print(Intensity());
|
gaunu klaidą: "error: 'Intensity' was not declared in this scope"
vienžo - man čia misija neįmanoma.... |
Tai kad intensity yra kintamasis, o kodel tu nori isvesti funkcijos (kuri neegzistuoja) rezultata? |
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 18, 23:15 |
|
|
|
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? |
|
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 18, 23:19 |
|
|
|
Saulix rašo: |
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. |
|
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 18, 23:26 |
|
|
|
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). |
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 19, 05:48 |
|
|
|
Saulix rašo: |
Pasimėginau - neveikia |
Funkcijai nieko neperdavei, tai ji nieko ir negrazino Pavyzdyje ten perduoda parametra kintamuoju "now". |
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 19, 12:33 |
|
|
|
Citata: |
Channels[channelNo].AddPoint(8, 0, 0);
Channels[channelNo].AddPoint(8, 30, 150); |
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); |
|
|
|
|
|
Arduino pwm value to screen? |
Parašytas: 2016 01 19, 12:39 |
|
|
|
Citata: |
Jei iš čia parašytau: Serial.print(GetLightlntensitylnt()); |
Serial.print( Channels[channel].GetLightIntensityInt(now) ); |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
|
|