Follow along with the video below to see how to install our site as a web app on your home screen.
Huomio: This feature may not be available in some browsers.
Onpahan varaa ajaa vähän kovempaa Kelloa tosiaan ajattelin samaan näyttöön, pitää nyt kattoa miten tuota ohjailee.Ja neljällä merkillä nopeus siltävaralta että äänivalli murtuu?
Löytyisköhän vinkkejä seuraavaan probleemaan arduino tietäjiltä vai onnistuukohan jollain valmiilla ratkaisulla helpommin:
Auton kierroslukumittari haluaa jännitettä 0-12V jonka perusteella tietää kierrokset, mutta moottorin ja vaihdelaatikon vaihdon myötä uudempiin saatava signaali tulee välillä 0-5V, puhe tasavirrasta. Olisiko jotain keinoa skaalata tuo 0-5 volttia arduinolla tuolle 0-12v välille vai olisikohan joku helpompikin ratkaisu olemassa. Harrastajakaveri vaan kyseli niin ajattelin, että tältä foorumilta voisi löytyä vinkkiä. Autossahan on se n.12v jännite saatavilla, eli onnistuisiko jonkunlainen PWM toteutus jännitteen kontrolloimiseksi esimerkiksi. 0-5V signaali on analoginen eli vain jännitettä.
Tarkoitus on siis 0-5v referenssillä tuottaa 0-12vJos haluaa tarkan niin arduinon perään DAC ja sen perään jännitteenmuunnin esimerkiksi sopivalla operaatiovahvistimella jos DAC ei suoraan pysty 12V lähtöön.
Saattaa olla että pwm- toteutuksella saa myös melkein 0-5V jonkä jälkeen pitää kuitenkin suodattaa ja vahvistaa.
Tarkoitus on siis 0-5v referenssillä tuottaa 0-12v
Onko joku mahdollisesti käyttänyt arduinolla magneettiteippiä lukevaa sensoria?
Esim. Tuollaista.
Magnetic sensor LS100
Tarkoitus olisi jos saisi itse tehtyä tuollaiseen koodin. 0.1mm tarvitsisi tarkkuuden.
Saakohan rotary encoderin koodia sovellettua?
Joo tosiaan ei ole sekään 12v kun selvitin, kysessä RDS3115 moottori.Servot kestää yleensä max 5-7.4v jos tuollaisista harraste servoista puhutaan mikä kuvassakin on ei voi siis liittää suoraan 12v eikö suoraan 9volttiinkaan. Servo vaatii luultavasti oman regunsa tai dc-dc muuntimensa että saa riittävästi virtaa riippuen toki servon mallista.
Arduinolle laittaisin jonkun kunnollisen regun esim 7805 ja siihen vielä jonkinlaista suodatusta mahd. konkkien muodossa.
Joo tosiaan ei ole sekään 12v kun selvitin, kysessä RDS3115 moottori.
Löytyykö Arduino IDE:ssä muitakin toimivia kuin nämä siellä olevilla kirjastoilla?--> attiny, atmega, esp32, esp8266, stm32, msp430
Virallisessa näköisessä listassa ei näy noita esp vermeitä--> List of Arduino boards and compatible systems - Wikipedia
Mietin vain noita pieninpiä ja halvimpia..muistaakseni ATtiny13A oli juuri tälläinen.
Ainakin esp8266 pitäisi löytyä, muistaakseni piti lisätä ideen url ja sitten löytyy.
Tinyt on sen verran pieniä että kannattaa unohtaa arduino- frame ja tehdä suoraan C:llä, muuten ei riitä muisti paljon vilkkua pidemmälle
Visual studio ja visual micro on hyvä yhdistelmä jos haluaa paremman iden ja arduino framen.
Atmel studio ilman framea itse tehden
Jaa no ei sitten ole tullut mitään uutta. Katselin vain, että olisi jotain kiinalaisia prossuja, mutta ne ei sitten kait --> Embedded Processors & Controllers Online Ordering | LCSC
Arduino Ide vaan tavallaan helposti lähestyttävämpi ja netti täynnä ohjeitakin.
Jos en väärin muista niin ainakin stm:lle oli ihan oma kehitysympäristö.
Sitten kun olet käyttänyt hetken sellaista joka pitää projektin tiedostot hanskassa, täydentää muuttujia ja antaa pomppia määrityksiin katsomaan miten se olikaan tehty et ehkä halua palata arduino ideen... vähän vastaava ero kuin kirjoittaisi kirjaa notepadilla eikä wordillä
Suosittelen jos aikoo tehdä vähänkin enemmän, säästää hermoja ja aikaa.
Kaikkiin löytyy nykyään ohjeita, ainoa mitä olisin joskus tarvinnut mutta ei löytynyt kuin arduino idelle oli crash reporter tai siihen suuntaan
Onhan niille kaikille omat kehitysympäristönsä. Taisi stm32:lle olla vaan demo se, että sai ledin vilkkumaan Arduino IDE:ssäkin. Stm8:lle ei ollut.
Hirveästi ei näillä pienillä esim. attiny13A lastuilla pääse oikein mitään tekemään, kun esimerkkejä niukasti. Vaikuttaisi siltä, että etenkin esp32:lle on ne huikeimmat projektit niin kuin nyt esim. esp32-cam eli saa tehtyä vakoilukameran. Onhan se toki valmis viritelmä, mutta kameroineen jonkun 7 euroa vain. Tehoissakin esp32 parhain ja hintakaan ei paha.
Kuinka helposti arduino ide koodin pystyisi kääntämään vempainten alkuperäiselle kehitysympäristölle? Esim. tämä--> ESP32-CAM Video Streaming and Face Recognition with Arduino IDE | Random Nerd Tutorials
Paitsi ei haisua edes mikä näiden esp8266 & esp32 alkuperäinen kehitysympäristö on. Jos se niitä ihmeellisiä AT + komentoja niin ei kiitos. ESP32 - Wikipedia Espressif IoT Development Framework – official Espressif development framework for ESP32 <-- kertaakaan en ole kokeillut. Olisko tuo .NET nanoFramework tutumpi?
Ohjelmoinnissahan voi tuollaista pickit 2/3/4:a käyttää ja hinta näyttää olevan kympin luokkaa. Tosiaan hieman jopa kaipailisin tuollaista alustaa mihin ei olisi kaikkia maailman mahdollisia kirjastoja jo joku tehnyt valmiiksi, vaan joutuisi hieman käyttää aikaa itse ohjelmoinninkin opiskeluun.
Mulla on sama näyttö ja 5V löytyy tuosta mistä sullakin.Hei
Olen uusi foorumilla ja haen täältä tukea uuteen harrastukseeni arduinon parissa.
Sen verran taustaa, että jäykemmän sähkön puoli on aikalailla tuttua kauraa, mutta tässä viimeiset kuukaudet yrittänyt päästä sisälle elektroniikan ja eritoten arduino maailmaan..
Olen tilannut kaikki aiheeseen liittyvät tavarat klooneina ebaysta ja tehnyt jo joitakin onnistuneita rakennelmia.
Nyt sain käsiini LCD näytön 1602A valmistaja on QAPASS.
Epäilen että se on viallinen, mutta kun toistakaan näyttöä ei ole tässä testattavaksi niin en ole tästä varma.
Olen alkanut rakentaa kytkentää koekytkentälevylle ja maan/GND olen yhdistänyt näytön pinneihin VSS,RW ja K
+5V menee pinneille VDD ja (vastuksen läpi) A.lle
Ongelma tulee kontrastin säätöpinnin (V0) kanssa.
-V0 pinnin ja maan väliltä löytyy mitatessa 5v jännite, onko tämä normaalia?
-Jos asennan kytkentäkaavion mukaan säätöpotentiometrin ohjaamaan kontrastia, niin ääriasentoon kääntäminen saa arduinon kyykkäämään kun jännite putoaa nolliin.
Sama ilmiö tapahtuu, kun kytken V0 pinnin suoraan kytkentälangalla maahan (GND), tällä kytkennällä pitäisi kontrastin olla maksimilla.
Olisiko jonkun esim mahdollista mitata löytyykö normikytkennällä V0 pinnistä tuo 5V jännite?
Kiitoksia jo etukäteen!
#include <SPI.h>
#include <Wire.h>
#include <SD.h>
#include <U8g2lib.h>
//Kaikki reprap full graphic smart controlleriin liittyvä
#define ENC_DAT 31
#define ENC_CLK 33
#define ENC_NAPPI 35
#define SD_DETECT_PIN 49
#define SDSS 53
#define BUZZER_PIN 37
#define STOP_PIN 41
int laskuri = 0;
int laskuriAiemmin = 0;
int sivu = 1;
int Ready = 1;
int alimenu = 0;
int tila_Aiemmin;
int tila;
int enc_CLK;
int enc_DATA;
int painettu = 0;
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* SCK=*/ 23 /* A4 */ , /* MOSI=*/ 17 /* A2 */, /* CS=*/ 16 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
void setup() {
Serial.begin(9600);
u8g2.begin();
pinMode (ENC_DAT, INPUT_PULLUP);
pinMode (ENC_CLK, INPUT_PULLUP);
pinMode (ENC_NAPPI, INPUT_PULLUP);
// Luetaan datapinnin tila ensimmäisen kerran
tila_Aiemmin = digitalRead(ENC_DAT);
u8g2.firstPage();
do {
//all graphics commands have to appear within the loop body.
u8g2.setFont(u8g2_font_helvR14_tf);
u8g2.drawStr(10, 20, "Johtoleikkuri");
u8g2.drawStr(10, 50, "Versio: 0.3");
} while ( u8g2.nextPage() );
}
void loop() {
enkooderi();
//Serial.print(laskuri); //Seurannut tällä encoderin toimintaa
//Valikot alkavat tästä
if ((laskuriAiemmin > laskuri) || (laskuriAiemmin < laskuri) || painettu) {
Ready = 1;
//Päävalikko. Valikon ensimmäinen sivu
if (alimenu == 0) {
if (0 <= laskuri && laskuri < 5) {
u8g2.clear();
u8g2.firstPage();
do {
u8g2.drawUTF8(25, 15, "Päävalikko");
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(0, 40, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli
u8g2.drawStr(25, 40, "Johto");
u8g2.drawStr(25, 60, "Kutiste");
} while ( u8g2.nextPage() );
sivu = 1;
}
if (5 <= laskuri && laskuri < 10) {
u8g2.clear();
u8g2.firstPage();
do {
u8g2.drawUTF8(25, 15, "Päävalikko");
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(0, 60, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli
u8g2.drawStr(25, 40, "Johto");
u8g2.drawStr(25, 60, "Kutiste");
} while ( u8g2.nextPage() );
sivu = 2;
}
}//Päävalikko loppuu.
//Päävalikosta seuraava. Tarkoituksena saada tämä johtojen kohdalle.
if (alimenu == 1)
{
if (0 <= laskuri && laskuri < 5)
{
u8g2.clear();
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(0, 15, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli
u8g2.drawStr(25, 15, "5 wire");
u8g2.drawStr(25, 40, "4 wire");
} while ( u8g2.nextPage() );
sivu = 1;
}
if (5 < laskuri && laskuri < 10)
{
u8g2.clear();
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(0, 40, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli
u8g2.drawStr(25, 15, "5 wire");
u8g2.drawStr(25, 40, "4 wire");
} while ( u8g2.nextPage() );
sivu = 2;
}
}//Johtovalikko loppuu tähän
//Päävalikosta seuraava. Kutistesukan kohdalle.
if (alimenu == 2)
{
if (0 <= laskuri && laskuri < 5)
{
u8g2.clear();
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(0, 15, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli
u8g2.drawStr(25, 15, "Paksu kutiste");
u8g2.drawStr(25, 40, "Ohut kutiste");
} while ( u8g2.nextPage() );
sivu = 1;
}
if (5 < laskuri && laskuri < 10)
{
u8g2.clear();
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(0, 40, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli
u8g2.drawStr(25, 15, "Paksumpi kutiste");
u8g2.drawStr(25, 40, "Ohkaisempi kutiste");
} while ( u8g2.nextPage() );
sivu = 2;
}
}//Kutistesukkien valikko loppuu tähän
}//Tähän loppuu valikot
laskuriAiemmin = laskuri; //Tallennetaan viimeisin laskurin tila
//Havaitaan encoderin napin painallus
if (digitalRead(ENC_NAPPI) == LOW)
{
if (alimenu == 1)
{
if (sivu == 1)
{
alimenu = 0;
laskuri = 1;
painettu = 0;
Ready = 0;
u8g2.clear();
u8g2.firstPage();
do {
u8g2.drawStr(10, 15, "Montako 5 wire");
} while ( u8g2.nextPage() );
delay(2000);
}
if (sivu == 2)
{
alimenu = 0;
laskuri = 0;
painettu = 0;
Ready = 0;
u8g2.clear();
u8g2.firstPage();
do {
u8g2.drawStr(25, 15, "Montako 4 wire");
} while ( u8g2.nextPage() );
delay(2000);
}
}
if (alimenu == 2)
{
if (sivu == 1)
{
alimenu = 0;
laskuri = 1;
painettu = 0;
Ready = 0;
u8g2.clear();
u8g2.firstPage();
do {
u8g2.drawStr(10, 15, "Montako paksua");
} while ( u8g2.nextPage() );
delay(2000);
}
if (sivu == 2)
{
alimenu = 0;
laskuri = 0;
painettu = 0;
Ready = 0;
u8g2.clear();
u8g2.firstPage();
do {
u8g2.drawStr(25, 15, "Montako ohutta");
} while ( u8g2.nextPage() );
delay(2000);
}
}
if (alimenu == 0 && Ready == 1)
{
if (sivu == 1)
{
alimenu = 1;
laskuri = 0;
painettu = 1;
}
if (sivu == 2)
{
alimenu = 2;
laskuri = 0;
painettu = 1;
}
}//
}
//Minimi- ja maksimiarvot laskurille.
if (laskuri > 20)
{
laskuri = 20;
}
if (laskuri < 0)
{
laskuri = 0;
}
}
void enkooderi() {
tila = digitalRead(ENC_DAT);
//Onko tila muuttunut setupin jälkeen
if (tila != tila_Aiemmin) {
//Myötäpäivään
if (digitalRead(ENC_CLK) != tila) {
laskuri++;
} else {
laskuri--;
}
}
tila_Aiemmin = tila; // Tallennetaan viimeisin tila
}
Löytyykö suosituksia current shunt amplifierille? Tarkoitus käyttää Arduino Nanon ja pienen oled näytön kanssa.
Parhain/helpoin/järkevin valinta mitä itse löysin olisi tämä:
Tai enemmän tarkkuutta sisältävä B-versio:
Datasheet:
Shunttina tarkoitus käyttää 100A/75mV mallia, jännite tulee olemaan noin 11-14v ja virrat siellä 0-60A.
Tarkoitus olisi laskea virrankulutus mAh:na ja saada se näytettyä tuolla Oled näytöllä. Ei pitäisi olla varsinkaan tolla INA219 (i2C) vehkeellä vaikeaa kun sen pitäisi tarjota suoraan jännite, virta ja watit ulos tuolta väylästä. Toki ei tarvisi kun tuon virran ja jännitteen.
Onnistuuko kohtuu tarkka mittaaminen ilman RTC piiriä vai vaatiiko sen että "kello" on tarpeeksi tarkka että saadaan oikea mAh kulutus?
Tarkkaa speksiä mAh tarkkuudelle en nyt osaa antaa, mutta jos nyt oltaisiin vaikka 20Ah käytön jälkeen siellä 100-400mAh tarkkuudessa.
Kaikki info ja tieto otetaan mielellään vastaan.
@SShadow Kiitos näin parin kuukauden viiveellä . Unohtui kiittää aiemmin... Tuo projekti onkin jo kuopattu, kun tuolle ei enää duunissa tapahtuneiden muutoksien myötä ole tarvetta. Ihan hyvä etten ehtinyt aloittamaan/hommaamaan tuohon mitään rompetta kun olisi jäänyt tarpeettomaksi.
Olisi seuraavakin projekti ihan työn alla ja nyt on pakko kysellä vinkkejä täältä, kun ei tunnu pääsevän tässä yhtään eteenpäin. Ihan ensiksi sanon sen verran, että en todellakaan ole mikään haka ohjelmoinnin/arduinojen kanssa, eli en varmasti tiedä liikaa, joten kaikki vinkit, palaute ja runtukin on tervetullutta. Pitkään on kiehtonut tämä osa elektroniikka-maailmasta, mutta ongelmana ollut mielenkiintoisen projektin löytyminen itselle, että pääsee kunnolla opettelemaan. Nyt kun sen viimein keksin niin päätin tietenkin hypätä sitten suoraan altaan syvään päähän .
Hieman näiden tyylistä laitetta siis suunnittelun alla, mutta toivon että tässä matkan varrella kun tätä työstää ja oppii uutta, niin olisi mahdollista leikata tuollaisen videoissa käytetyn ohuen johdon lisäksi, paksumpaa monesta (max. viidestä(5)) tuollaisesta yhteenkiedotusta ohkaisesta koostuvaa johtoa ja mieluusti myös kutistesukkaa. Johtoja ei tarvitsisi kuoria vaan pelkkä katkaisu riittäisi omaan tarpeeseen.
Tätä alla olevaa videota olen käyttänyt pääsääntöisesti apuna kun olen perehtynyt encoderin ja valikon rakenteen toimintaan. Omien muokkauksieni kanssa tosin.
Eli tuollaista johto+kutistesukkaleikkuria päätin ruveta työstämään. Tuli hommattua jos jonkinnäköistä rompetta jo tätä laitetta varten eli perääntyminen ei ole enää mahdollista ilman rahallisia tappioita. Ramps 1.4 oletin passaavan tähän hommaan, pari nema 17 moottoria, leikkuuteriä, Geeetechin 12V/5A virtalähde jne. Kotelointia varten löytyy 3d-tulostin ja pientä ei-muovista suunnitelmaa on koko laitteen kotelointiinkin, mutta ne sitten aikanaan jos sinne asti pääsee.
Ajattelin ja olenkin lähtenyt nyt aluksi liikkeelle siitä, että "suunnittelen" lcd-valikon jossa olisi edes jonkinlaista toiminnallisuutta. Ja suunnittelulla tietenkin tarkoitan sitä, että googletan toisten ihmisten projekteja ja yritän apinoida koodia omaan käyttötarkoitukseen.
Tällä hetkellä valikko toimii mielestäni "riittävän hyvin" ainakin näin protoiluvaiheessa, eli navigointi encoderin avulla toimii ja napin painallus toimii myös. Itselle ei nyt aukene se, että miten saisin tuon toimimaan niin, että valikon rakenne olisi kutakuinkin tämä: Päävalikko -> Johto -> Eri johto vaihtoehdot -> Esim 5/4/3/2/1 wire valittu -> Valitse leikattavan pätkän pituus -> Montako kappaletta. Eli valikkoon pitäisi saada "syvyyttä", mutta itse en kyllä hiffaa että miten se menisi. Toki asiaan ei varmaan auta jatkuva suunnittelukaljojen lipitys .
Hävettää laittaa tämäkin saatanan räpellys, mutta pakko se varmaan on. Kaikki vinkit ovat tervetulleita.
C++:#include <SPI.h> #include <Wire.h> #include <SD.h> #include <U8g2lib.h> //Kaikki reprap full graphic smart controlleriin liittyvä #define ENC_DAT 31 #define ENC_CLK 33 #define ENC_NAPPI 35 #define SD_DETECT_PIN 49 #define SDSS 53 #define BUZZER_PIN 37 #define STOP_PIN 41 int laskuri = 0; int laskuriAiemmin = 0; int sivu = 1; int Ready = 1; int alimenu = 0; int tila_Aiemmin; int tila; int enc_CLK; int enc_DATA; int painettu = 0; U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* SCK=*/ 23 /* A4 */ , /* MOSI=*/ 17 /* A2 */, /* CS=*/ 16 /* A3 */, /* reset=*/ U8X8_PIN_NONE); void setup() { Serial.begin(9600); u8g2.begin(); pinMode (ENC_DAT, INPUT_PULLUP); pinMode (ENC_CLK, INPUT_PULLUP); pinMode (ENC_NAPPI, INPUT_PULLUP); // Luetaan datapinnin tila ensimmäisen kerran tila_Aiemmin = digitalRead(ENC_DAT); u8g2.firstPage(); do { //all graphics commands have to appear within the loop body. u8g2.setFont(u8g2_font_helvR14_tf); u8g2.drawStr(10, 20, "Johtoleikkuri"); u8g2.drawStr(10, 50, "Versio: 0.3"); } while ( u8g2.nextPage() ); } void loop() { enkooderi(); //Serial.print(laskuri); //Seurannut tällä encoderin toimintaa //Valikot alkavat tästä if ((laskuriAiemmin > laskuri) || (laskuriAiemmin < laskuri) || painettu) { Ready = 1; //Päävalikko. Valikon ensimmäinen sivu if (alimenu == 0) { if (0 <= laskuri && laskuri < 5) { u8g2.clear(); u8g2.firstPage(); do { u8g2.drawUTF8(25, 15, "Päävalikko"); u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawGlyph(0, 40, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli u8g2.drawStr(25, 40, "Johto"); u8g2.drawStr(25, 60, "Kutiste"); } while ( u8g2.nextPage() ); sivu = 1; } if (5 <= laskuri && laskuri < 10) { u8g2.clear(); u8g2.firstPage(); do { u8g2.drawUTF8(25, 15, "Päävalikko"); u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawGlyph(0, 60, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli u8g2.drawStr(25, 40, "Johto"); u8g2.drawStr(25, 60, "Kutiste"); } while ( u8g2.nextPage() ); sivu = 2; } }//Päävalikko loppuu. //Päävalikosta seuraava. Tarkoituksena saada tämä johtojen kohdalle. if (alimenu == 1) { if (0 <= laskuri && laskuri < 5) { u8g2.clear(); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawGlyph(0, 15, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli u8g2.drawStr(25, 15, "5 wire"); u8g2.drawStr(25, 40, "4 wire"); } while ( u8g2.nextPage() ); sivu = 1; } if (5 < laskuri && laskuri < 10) { u8g2.clear(); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawGlyph(0, 40, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli u8g2.drawStr(25, 15, "5 wire"); u8g2.drawStr(25, 40, "4 wire"); } while ( u8g2.nextPage() ); sivu = 2; } }//Johtovalikko loppuu tähän //Päävalikosta seuraava. Kutistesukan kohdalle. if (alimenu == 2) { if (0 <= laskuri && laskuri < 5) { u8g2.clear(); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawGlyph(0, 15, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli u8g2.drawStr(25, 15, "Paksu kutiste"); u8g2.drawStr(25, 40, "Ohut kutiste"); } while ( u8g2.nextPage() ); sivu = 1; } if (5 < laskuri && laskuri < 10) { u8g2.clear(); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawGlyph(0, 40, 0x21d2); //Tällä tehdään lcd-valikossa näkyvä nuoli u8g2.drawStr(25, 15, "Paksumpi kutiste"); u8g2.drawStr(25, 40, "Ohkaisempi kutiste"); } while ( u8g2.nextPage() ); sivu = 2; } }//Kutistesukkien valikko loppuu tähän }//Tähän loppuu valikot laskuriAiemmin = laskuri; //Tallennetaan viimeisin laskurin tila //Havaitaan encoderin napin painallus if (digitalRead(ENC_NAPPI) == LOW) { if (alimenu == 1) { if (sivu == 1) { alimenu = 0; laskuri = 1; painettu = 0; Ready = 0; u8g2.clear(); u8g2.firstPage(); do { u8g2.drawStr(10, 15, "Montako 5 wire"); } while ( u8g2.nextPage() ); delay(2000); } if (sivu == 2) { alimenu = 0; laskuri = 0; painettu = 0; Ready = 0; u8g2.clear(); u8g2.firstPage(); do { u8g2.drawStr(25, 15, "Montako 4 wire"); } while ( u8g2.nextPage() ); delay(2000); } } if (alimenu == 2) { if (sivu == 1) { alimenu = 0; laskuri = 1; painettu = 0; Ready = 0; u8g2.clear(); u8g2.firstPage(); do { u8g2.drawStr(10, 15, "Montako paksua"); } while ( u8g2.nextPage() ); delay(2000); } if (sivu == 2) { alimenu = 0; laskuri = 0; painettu = 0; Ready = 0; u8g2.clear(); u8g2.firstPage(); do { u8g2.drawStr(25, 15, "Montako ohutta"); } while ( u8g2.nextPage() ); delay(2000); } } if (alimenu == 0 && Ready == 1) { if (sivu == 1) { alimenu = 1; laskuri = 0; painettu = 1; } if (sivu == 2) { alimenu = 2; laskuri = 0; painettu = 1; } }// } //Minimi- ja maksimiarvot laskurille. if (laskuri > 20) { laskuri = 20; } if (laskuri < 0) { laskuri = 0; } } void enkooderi() { tila = digitalRead(ENC_DAT); //Onko tila muuttunut setupin jälkeen if (tila != tila_Aiemmin) { //Myötäpäivään if (digitalRead(ENC_CLK) != tila) { laskuri++; } else { laskuri--; } } tila_Aiemmin = tila; // Tallennetaan viimeisin tila }
Joko valikkokoodi on edennyt?
Yksi helpohko tapa on antaa jokaiselle näytölle oma numero ja loopissa vain switch-case jossa näytetään oikea ruutu.
Tämän lisäksi tietyssä näytössä ollessa eteen/taakse/jonnekin vaikuttaa siihen mikä on seuraava ruutu johon mennään.
Navigoinnin voi hoitaa vaikka tauluko(i)lla josta löytyy nykyisen numerolla esim seuraava/edellinen jolloin switch-caset vähenee koodissa.
^ Nyt on stm32 blue pill käytössä, pari nappulaa ja i2c lcd-näyttö. Yritän näillä toteuttaa tuon ylempänä esittämäni idean... Jos jotakuta sattuu kiinnostamaan
Joo ajattelin nyt ainakin aluksi käyttää nappeja valikossa liikkumiseen ja ohjaukseen, koska vaihtui tuo rampsin 128x64 lcd tuollaiseen 16x2 lcd-näyttöön. Tuossa rampsin näytössä on encoderi mukana. Otan mielelläni matskua ja tietoa vastaan jos joku osaa näyttää suuntaa hyvän valikkorakenteen toteutukseen.Päivittele ihmeessä miten projekti lähtee etenemään. Meinasitko napeilla siis ohjata valikkoa tällä kertaa?
/* | |
* Contains code from: | |
* ESP8266 Remote Controlled Sockets | Random Nerd Tutorials | |
* bruhautomation.io | |
* Arduino - Sweep | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except | |
* in compliance with the License. You may obtain a copy of the License at: | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed | |
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License | |
* for the specific language governing permissions and limitations under the License. | |
*/ | |
#include <ESP8266WiFi.h> | |
#include <WiFiClient.h> | |
#include <ESP8266WebServer.h> | |
#include <ESP8266mDNS.h> | |
#include <Servo.h> | |
#define WLAN_SSID "YOUR WIFI SSID" //change to your Wifi SSID | |
#define WLAN_PASS "YOUR WIFI PASSWORD" //change to your Wifi Password | |
MDNSResponder mdns; | |
ESP8266WebServer server(80); | |
int servoPin = 0; //Servo on GPIO0 or NODEMCU pin D3 | |
const int buttonPin = 12; //manual button on GPIO12 or NODEMCU pin D6 | |
int buttonState = 0; | |
int direction = 0; | |
int setting = 0; //Startup with blinds closed | |
int position = 90; | |
Servo servoA; | |
String webPage = ""; | |
void setup(void) { | |
WiFi.mode(WIFI_STA); | |
webPage += "<h1>ESP8266 Web Server</h1><p>Blinds<br>"; | |
webPage += "<a href=\"0\"><button>0</button></a><br>"; | |
webPage += "<a href=\"10\"><button>10</button></a><br>"; | |
webPage += "<a href=\"20\"><button>20</button></a><br>"; | |
webPage += "<a href=\"30\"><button>30</button></a><br>"; | |
webPage += "<a href=\"40\"><button>40</button></a><br>"; | |
webPage += "<a href=\"50\"><button>50</button></a><br>"; | |
webPage += "<a href=\"60\"><button>60</button></a><br>"; | |
webPage += "<a href=\"70\"><button>70</button></a><br>"; | |
webPage += "<a href=\"80\"><button>80</button></a><br>"; | |
webPage += "<a href=\"90\"><button>90</button></a><br>"; | |
webPage += "<a href=\"100\"><button>100</button></a><br>"; | |
delay(1000); | |
pinMode(buttonPin, INPUT_PULLUP); | |
Serial.begin(9600); | |
delay(500); | |
Serial.println("Blind Startup Sequence"); | |
delay(500); | |
Serial.println(); | |
Serial.print("Connecting to "); | |
Serial.println(WLAN_SSID); | |
WiFi.begin(WLAN_SSID, WLAN_PASS); | |
// Set a static IP (optional) | |
//IPAddress ip(10,0,1,50); | |
//IPAddress gateway(10,0,1,1); | |
//IPAddress subnet(255, 255, 255, 0); | |
//WiFi.config(ip, gateway, subnet); | |
// End of set a static IP (optional) | |
delay(500); | |
int i = 0; | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
ESP.wdtFeed(); | |
if (i > 40) // Try 40 times to connect to Wifi | |
Serial.print("Restarting Wifi"); ESP.reset(); // Reset Wifi stack if more than 40 trys | |
i++; | |
WiFi.begin(WLAN_SSID, WLAN_PASS); | |
// Set a static IP retry (optional) | |
//IPAddress ip(10,0,1,50); | |
//IPAddress gateway(10,0,1,1); | |
//IPAddress subnet(255, 255, 255, 0); | |
//WiFi.config(ip, gateway, subnet); | |
// End of set a static IP retry (optional) | |
} | |
Serial.println(); | |
Serial.println("WiFi connected"); | |
Serial.println("IP address: "); Serial.println(WiFi.localIP()); | |
if (mdns.begin("esp8266", WiFi.localIP())) { | |
Serial.println("MDNS responder started"); | |
} | |
server.on("/", []() { server.send(200, "text/html", webPage); }); | |
server.on("/100", []() { server.send(200, "text/html", webPage); setting = 180; }); | |
server.on("/99", []() { server.send(200, "text/html", webPage); setting = 180; }); | |
server.on("/98", []() { server.send(200, "text/html", webPage); setting = 180; }); | |
server.on("/97", []() { server.send(200, "text/html", webPage); setting = 171; }); | |
server.on("/96", []() { server.send(200, "text/html", webPage); setting = 171; }); | |
server.on("/95", []() { server.send(200, "text/html", webPage); setting = 171; }); | |
server.on("/94", []() { server.send(200, "text/html", webPage); setting = 171; }); | |
server.on("/93", []() { server.send(200, "text/html", webPage); setting = 171; }); | |
server.on("/92", []() { server.send(200, "text/html", webPage); setting = 162; }); | |
server.on("/91", []() { server.send(200, "text/html", webPage); setting = 162; }); | |
server.on("/90", []() { server.send(200, "text/html", webPage); setting = 162; }); | |
server.on("/89", []() { server.send(200, "text/html", webPage); setting = 162; }); | |
server.on("/88", []() { server.send(200, "text/html", webPage); setting = 162; }); | |
server.on("/87", []() { server.send(200, "text/html", webPage); setting = 153; }); | |
server.on("/86", []() { server.send(200, "text/html", webPage); setting = 153; }); | |
server.on("/85", []() { server.send(200, "text/html", webPage); setting = 153; }); | |
server.on("/84", []() { server.send(200, "text/html", webPage); setting = 153; }); | |
server.on("/83", []() { server.send(200, "text/html", webPage); setting = 153; }); | |
server.on("/82", []() { server.send(200, "text/html", webPage); setting = 144; }); | |
server.on("/81", []() { server.send(200, "text/html", webPage); setting = 144; }); | |
server.on("/80", []() { server.send(200, "text/html", webPage); setting = 144; }); | |
server.on("/79", []() { server.send(200, "text/html", webPage); setting = 144; }); | |
server.on("/78", []() { server.send(200, "text/html", webPage); setting = 144; }); | |
server.on("/77", []() { server.send(200, "text/html", webPage); setting = 135; }); | |
server.on("/76", []() { server.send(200, "text/html", webPage); setting = 135; }); | |
server.on("/75", []() { server.send(200, "text/html", webPage); setting = 135; }); | |
server.on("/74", []() { server.send(200, "text/html", webPage); setting = 135; }); | |
server.on("/73", []() { server.send(200, "text/html", webPage); setting = 135; }); | |
server.on("/72", []() { server.send(200, "text/html", webPage); setting = 126; }); | |
server.on("/71", []() { server.send(200, "text/html", webPage); setting = 126; }); | |
server.on("/70", []() { server.send(200, "text/html", webPage); setting = 126; }); | |
server.on("/69", []() { server.send(200, "text/html", webPage); setting = 126; }); | |
server.on("/68", []() { server.send(200, "text/html", webPage); setting = 126; }); | |
server.on("/67", []() { server.send(200, "text/html", webPage); setting = 117; }); | |
server.on("/66", []() { server.send(200, "text/html", webPage); setting = 117; }); | |
server.on("/65", []() { server.send(200, "text/html", webPage); setting = 117; }); | |
server.on("/64", []() { server.send(200, "text/html", webPage); setting = 117; }); | |
server.on("/63", []() { server.send(200, "text/html", webPage); setting = 117; }); | |
server.on("/62", []() { server.send(200, "text/html", webPage); setting = 108; }); | |
server.on("/61", []() { server.send(200, "text/html", webPage); setting = 108; }); | |
server.on("/60", []() { server.send(200, "text/html", webPage); setting = 108; }); | |
server.on("/59", []() { server.send(200, "text/html", webPage); setting = 108; }); | |
server.on("/58", []() { server.send(200, "text/html", webPage); setting = 108; }); | |
server.on("/57", []() { server.send(200, "text/html", webPage); setting = 99; }); | |
server.on("/56", []() { server.send(200, "text/html", webPage); setting = 99; }); | |
server.on("/55", []() { server.send(200, "text/html", webPage); setting = 99; }); | |
server.on("/54", []() { server.send(200, "text/html", webPage); setting = 99; }); | |
server.on("/53", []() { server.send(200, "text/html", webPage); setting = 99; }); | |
server.on("/52", []() { server.send(200, "text/html", webPage); setting = 90; }); | |
server.on("/51", []() { server.send(200, "text/html", webPage); setting = 90; }); | |
server.on("/50", []() { server.send(200, "text/html", webPage); setting = 90; }); | |
server.on("/49", []() { server.send(200, "text/html", webPage); setting = 90; }); | |
server.on("/48", []() { server.send(200, "text/html", webPage); setting = 90; }); | |
server.on("/47", []() { server.send(200, "text/html", webPage); setting = 81; }); | |
server.on("/46", []() { server.send(200, "text/html", webPage); setting = 81; }); | |
server.on("/45", []() { server.send(200, "text/html", webPage); setting = 81; }); | |
server.on("/44", []() { server.send(200, "text/html", webPage); setting = 81; }); | |
server.on("/43", []() { server.send(200, "text/html", webPage); setting = 81; }); | |
server.on("/42", []() { server.send(200, "text/html", webPage); setting = 72; }); | |
server.on("/41", []() { server.send(200, "text/html", webPage); setting = 72; }); | |
server.on("/40", []() { server.send(200, "text/html", webPage); setting = 72; }); | |
server.on("/39", []() { server.send(200, "text/html", webPage); setting = 72; }); | |
server.on("/38", []() { server.send(200, "text/html", webPage); setting = 72; }); | |
server.on("/37", []() { server.send(200, "text/html", webPage); setting = 63; }); | |
server.on("/36", []() { server.send(200, "text/html", webPage); setting = 63; }); | |
server.on("/35", []() { server.send(200, "text/html", webPage); setting = 63; }); | |
server.on("/34", []() { server.send(200, "text/html", webPage); setting = 63; }); | |
server.on("/33", []() { server.send(200, "text/html", webPage); setting = 63; }); | |
server.on("/32", []() { server.send(200, "text/html", webPage); setting = 54; }); | |
server.on("/31", []() { server.send(200, "text/html", webPage); setting = 54; }); | |
server.on("/30", []() { server.send(200, "text/html", webPage); setting = 54; }); | |
server.on("/29", []() { server.send(200, "text/html", webPage); setting = 54; }); | |
server.on("/28", []() { server.send(200, "text/html", webPage); setting = 54; }); | |
server.on("/27", []() { server.send(200, "text/html", webPage); setting = 45; }); | |
server.on("/26", []() { server.send(200, "text/html", webPage); setting = 45; }); | |
server.on("/25", []() { server.send(200, "text/html", webPage); setting = 45; }); | |
server.on("/24", []() { server.send(200, "text/html", webPage); setting = 45; }); | |
server.on("/23", []() { server.send(200, "text/html", webPage); setting = 45; }); | |
server.on("/22", []() { server.send(200, "text/html", webPage); setting = 36; }); | |
server.on("/21", []() { server.send(200, "text/html", webPage); setting = 36; }); | |
server.on("/20", []() { server.send(200, "text/html", webPage); setting = 36; }); | |
server.on("/19", []() { server.send(200, "text/html", webPage); setting = 36; }); | |
server.on("/18", []() { server.send(200, "text/html", webPage); setting = 36; }); | |
server.on("/17", []() { server.send(200, "text/html", webPage); setting = 27; }); | |
server.on("/16", []() { server.send(200, "text/html", webPage); setting = 27; }); | |
server.on("/15", []() { server.send(200, "text/html", webPage); setting = 27; }); | |
server.on("/14", []() { server.send(200, "text/html", webPage); setting = 27; }); | |
server.on("/13", []() { server.send(200, "text/html", webPage); setting = 27; }); | |
server.on("/12", []() { server.send(200, "text/html", webPage); setting = 18; }); | |
server.on("/11", []() { server.send(200, "text/html", webPage); setting = 18; }); | |
server.on("/10", []() { server.send(200, "text/html", webPage); setting = 18; }); | |
server.on("/9", []() { server.send(200, "text/html", webPage); setting = 18; }); | |
server.on("/8", []() { server.send(200, "text/html", webPage); setting = 18; }); | |
server.on("/7", []() { server.send(200, "text/html", webPage); setting = 9; }); | |
server.on("/6", []() { server.send(200, "text/html", webPage); setting = 9; }); | |
server.on("/5", []() { server.send(200, "text/html", webPage); setting = 9; }); | |
server.on("/4", []() { server.send(200, "text/html", webPage); setting = 9; }); | |
server.on("/3", []() { server.send(200, "text/html", webPage); setting = 9; }); | |
server.on("/2", []() { server.send(200, "text/html", webPage); setting = 0; }); | |
server.on("/1", []() { server.send(200, "text/html", webPage); setting = 0; }); | |
server.on("/0", []() { server.send(200, "text/html", webPage); setting = 0; }); | |
server.begin(); | |
Serial.println("HTTP server started"); | |
} | |
void loop() { | |
buttonState = digitalRead(buttonPin); | |
if(buttonState == LOW && setting <= 180 && direction == 0){ | |
setting++; | |
delay(0); | |
if(setting == 180){ | |
direction = 1; | |
} | |
} | |
if(buttonState == LOW && setting >= 0 && direction == 1){ | |
setting--; | |
delay(0); | |
if(setting == 0){ | |
direction = 0; | |
} | |
} | |
if(position < setting){ | |
servoA.attach(servoPin); | |
servoA.write(position++); | |
delay(5); | |
Serial.print("Setting: "); | |
Serial.println(setting); | |
Serial.print("Position: "); | |
Serial.println(position); | |
} | |
if(position > setting){ | |
servoA.attach(servoPin); | |
servoA.write(position--); | |
delay(5); | |
Serial.print("Setting: "); | |
Serial.println(setting); | |
Serial.print("Position: "); | |
Serial.println(position); | |
} | |
if(position == setting){ | |
servoA.detach(); | |
} | |
server.handleClient(); | |
} |
if (i > 40) // Try 40 times to connect to Wifi
Serial.print("Restarting Wifi"); ESP.reset(); // Reset Wifi stack if more than 40 trys
if (i > 40) { // Try 40 times to connect to Wifi
Serial.print("Restarting Wifi");
ESP.reset(); // Reset Wifi stack if more than 40 trys
}
bool initWIFI() {
WiFi.mode(WIFI_STA);
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
unsigned long startmillis = millis();
while (millis() - startmillis <= 10000) {
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WIFI Connected.")
return true;
}
delay(500);
Serial.print(".");
ESP.wdtFeed();
}
Serial.println("Connection failed.");;
return false;
}