Esetleg az ic-re nem lehet rákeresni hogy milyen usb illesztő kell hozzá? Csak egy tipp, mert a kínai arduinora is más drivert kellet az illesztő miatt ha jól rémlik ott CH340 driver kellet itt is lehetséges hogy valami hasonló a probléma!
Köszönöm a tanácsokat. Karácsony környékén eljön az az állapot, hogy nem dolgozok reggeltől estig. Tart kb. egy hétig. Szerintem még az a hét is kevés lesz, hogy önállóan ilyen programokat írjak. Ezért kutakodtam a NET-en, hátha találok megoldást a feladatra. Mindenhol "csak" a gombot nyomva tartót találtam.
edig ami verziot probáltam kék(miniusbs)/felete mind igy kezdi ha feldugom win alá több alap lapin is "USB Device Not Recognised" ehez nemtud füzni ilesztöt a wun sem mert nincs vid/pid usb port azonosito sem ami a hadwer/ driver azonositás történik win usb eszközné "unknow driver van rendszer alat csak! neked hogy sikerült müködésre birni?
három dolgot javasolnék aminek érdemes utánanézni ha ügyesebben akarsz programozni: - aszinkronitás (polling és callback vezérelt események) - állapotgépek - párhuzamosság
Az aszinkronitás azért kell, mert egy feladatot pl egy tengely mozgatást alapvetően nem úgy akarsz megoldani, hogy ott állsz a progival és figyeled meg várod, hanem csak megjelölöd pl egy változóban, hogy akarsz valamit, a program majd a hatterben figyeli, hogy mikor van epp ezzel a feladattal kapcsolatban valami es megcsinálja és te csak néha kérdezgeted, hogy mi az állapota a feladatnak. Ide fontos kifejezes a pollozas es callback. A pollozasnal kerdezgeted X időnként, mig a callback eseten egy esemeny (pl interrupt) tortenik ami indit egy fugvenyhivast feled es jelzi hogy kesz van vagy valami tortent.
Allapotgep egy nagyszeru dolog arra, hogy egy komplex feladatot lebonts kisebb reszekre. Pl felhuzom a kimeneti labat es inditok egy timert. Atmegyek a kovetkezo allapotba ahol csak varom hogy a timer mikor jar le, de ezt csak idonkent pollozva vizsgalom meg (vagy ha interrupt van az interrupt billent tovabb masik allapotba), majd ha lejart a timer akkor lehuzom a labat es csinalok valami mast es igy tovabb. Akar lehet egy tengely ide oda mozgatasara hasznalni, hiszen a tengelynel varakozni kell arra, hogy elejren az egyik vegebe, ott elinditani a masik iranyba es megint varakozni.
Parhuzamossag azert jo mert a programoddal egyszerre tobb dolgot csinalhatsz. Ehhez viszont az kell, hogy sehol ne legyen a programban olyan hogy varakozol sok-sok milliszekundomokat. Nyilvan abbol indulok ki, hogy nincs operacios rendszered amivel taszkokat kezelsz. Amint valahol sokat varakozol, elveszed a CPU-t mas feladatok elol. Viszont ha nincs varakozas akkor kelleni fog neked egy uj eszkoztar arra hogy leprogramozd amit szeretnel: Ez pedig a fent emlitett par dolog lesz.
szivesen most nézem esetleg timert sem ártana használni mert akkor sokkal gyorsabb lesz a progi, legalább is a léptető mocihoz, ne függjön a sebessége a program futásától és a végállásokat is hamarabb észreveszi a progi, ha a főprogram nem időzítésekkel van tele...
switch (irany) { case 1: valamit csinálsz irany=2; break;
case 2: valamit csinálsz irany=1; break;
// kezdéskor meg eldöntöd merre menjen, az iranyt meg a kapcsolók váltják
if (pin1) { irany=1;}
if (pin2) { irany=2;}
azért ne másold be, csak úgy szerkesztő nélkül gépeltem... a break -ot ne felejtsd le a case végéről mert különben nem ugrik ki a switch ből, hanem mindent végignéz..
Egy uno-val kellene két végállás közt (folyamatosan) mozgatnom egy tengelyt. Tápra kapcsolva el kellene indulnia, majd a végállásra futva irányt váltani. Ezt ismételni, a két végállás közt, míg a tápról le nem kapcsolom. Találtam egy programot, amivel azt tudtam elérni, hogy a végállások nyomógombjait nyomva tartva (hol az egyiket, hol a másikat) a megfelelő irányba mozogjon. "Önerőből" nem tudom elérni, hogy a nyomógombok egy impulzusára történjen az irányváltás. Ebben kérek segítséget.
// define a constant value named stepPin and assign the value 9 to it - this value will not change during our code // this assumes digital pin 9 of your Arduino is attached to the step input of your driver #define stepPin 9
// define a constant value named dirPin and assign the value 8 to it - this value will not change during our code // this assumes digital pin 8 of your Arduino is attached to the step input of your driver #define dirPin 8
// define the pins on which we've put our N.O. buttons #define button1 2 #define button2 3
// setup() loop, the Arduino only runs through this once void setup() { // digital pins on the Arduino can only be either set as an output or input - in our case we want to send data to the driver, so we choose output pinMode(stepPin , OUTPUT); pinMode(dirPin , OUTPUT);
// define our button pins as input pullup type - see http://arduino.cc/en/Tutorial/DigitalPins#.Uyphr4WN7q4 pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP);
// let's set an initial value of low to both our step and dir pins, we could easily write false or 0 instead of LOW digitalWrite(stepPin , LOW); digitalWrite(dirPin , LOW); }
// loop() loop, the Arduino continuously cycles through this as fast as it can void loop() {
if (digitalRead(button1) == LOW && digitalRead(button2) == HIGH) { // if button1 is pressed and button2 is not pressed digitalWrite(dirPin, LOW); // move in the LOW direction } else if (digitalRead(button1) == HIGH && digitalRead(button2) == LOW) { // if btton1 is not pressed and button2 is pressed digitalWrite(dirPin, HIGH); // move in HIGH direction }
if (digitalRead(button1) == LOW || digitalRead(button2) == LOW) { // if either button is pressed
// set a HIGH value to our step pin, this turns the voltage on for that pin digitalWrite(stepPin , HIGH);
// let's wait here for 50 milliseconds; note the units, this means 0.05s delay(0.1);
// let's set our step pin to false, this turns the voltage off for that pin and gives us the on/off cycle we need digitalWrite(stepPin , LOW);
// wait another 50 milliseconds after which time we loop back to the beginning of the loop() loop delay(0.1);
} }
frob | 2276
2017-11-07 11:25:58
[762]
a második hiba még se hiba csak félig, rossz szám megadás volt és mégse a hosszt hanem az addig jelöli, csak nem hje a help
ha az ember leírja hamarabb meglátja a hibát ami 2 is volt 1 töröltem a változót mielőtt feldolgoztam volna és a második szám a hossz, nem pedig hogy meddig...
frob | 2276
2017-11-07 11:11:39
[760]
Sziasztok
Mi lehet a hiba amiért nem jön meg aminek kellene? szam=inputString.substring(0,2).toInt()
A bemenet pl "001" de 111 re sem ad vissza semmit...
lcd.setCursor(0,0); lcd.print(analogRead(0)); lcd.print(" "); lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over lcd.print(millis()/1000); // display seconds elapsed since power-up
// select the pins used on the LCD panel LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// define some values used by the panel and buttons int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5
// read the buttons int read_LCD_buttons() { adc_key_in = analogRead(0); Serial.println(adc_key_in); delay(10); // read the value from the sensor // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result // For V1.1 us this threshold if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT;
// For V1.0 comment the other threshold and use the one below: /* if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 195) return btnUP; if (adc_key_in < 380) return btnDOWN; if (adc_key_in < 555) return btnLEFT; if (adc_key_in < 790) return btnSELECT; */
return btnNONE; // when all others fail, return this... }
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2); // start the library lcd.setCursor(0,0); lcd.print("Push the buttons"); // print a simple message }
void loop() { lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over lcd.print(millis()/1000); // display seconds elapsed since power-up
lcd.setCursor(0,1); // move to the begining of the second line lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { lcd.print("RIGHT "); break; } case btnLEFT: { lcd.print("LEFT "); break; } case btnUP: { lcd.print("UP "); break; } case btnDOWN: { lcd.print("DOWN "); break; } case btnSELECT: { lcd.print("SELECT"); break; } case btnNONE: { lcd.print("NONE "); break; } }
}
Törölt felhasználó
2017-10-17 19:36:54
[743]
ez sorosportra kiirja azt a nyomogomb értékétet amit lenyomsz!
//Sample using LiquidCrystal library #include <LiquidCrystal.h>
// select the pins used on the LCD panel LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// define some values used by the panel and buttons int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5
// read the buttons int read_LCD_buttons() { adc_key_in = analogRead(0); Serial.println(adc_key_in); delay(10); // read the value from the sensor // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result // For V1.1 us this threshold if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT;
// For V1.0 comment the other threshold and use the one below: /* if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 195) return btnUP; if (adc_key_in < 380) return btnDOWN; if (adc_key_in < 555) return btnLEFT; if (adc_key_in < 790) return btnSELECT; */
return btnNONE; // when all others fail, return this... }
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2); // start the library lcd.setCursor(0,0); lcd.print("Push the buttons"); // print a simple message }
void loop() { lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over lcd.print(millis()/1000); // display seconds elapsed since power-up
lcd.setCursor(0,1); // move to the begining of the second line lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { lcd.print("RIGHT "); break; } case btnLEFT: { lcd.print("LEFT "); break; } case btnUP: { lcd.print("UP "); break; } case btnDOWN: { lcd.print("DOWN "); break; } case btnSELECT: { lcd.print("SELECT"); break; } case btnNONE: { lcd.print("NONE "); break; } }
Nem vagyok duinos ezért pszeudó kód: Define b as byte define sum as integer
.....
sum:=0; For b:=1 to 4 sum=sum+getadc(0); delay(5) next sum:=sum/4 print sum
....
Ez egy kicsit megszűri az ad értékeit, és kiírja. Ezután végignyomkodva a gombokat látod hol mi jön vissza. Így annak alapján tudod a gomb kiválasztás határértékeit a gombok értékei közé középre állítani.
Analog benenet érték 0...1023 értéken mozog 0...5v az elenálás létra fesz osztóként müxik
pl ha rosz az elenálás érték a pcb verzion akor rosz a definiált érték határ a kodban is ezért reagálhat is rosszul! pl if (adc_key_in < 195) return btnUP; lehet ez lesz helyes if (adc_key_in < 250) return btnUP;
Így már más a leányzó fekvése én tényleg a mátrixra gondoltam de mint az előttem szóló írta használj prellmentesítést , én a picben úgy csinálnám hogy nem értéket hanem tartományt adnék meg majd a beolvasás után figyelném hogy az adc mikor ment 0 ra és onnan indítanám a következő mérést
Csináld azt hogy néhányszor végzel egymás után ad konverziót pár mS késleltetéssel majd az átlagot használod fel, vagy addig olvasod az AD-t amíg három egymás utáni konverzió nem tér el egy limit értéknél jobban.
int lcd_key = 0; int adc_key_in = 0; int addr = 0;
byte E; byte H;
int read_LCD_buttons() { adc_key_in = analogRead(0); if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 195) return btnUP; if (adc_key_in < 380) return btnDOWN; if (adc_key_in < 555) return btnLEFT; if (adc_key_in < 790) return btnSELECT; return btnNONE; // when all others fail, return this...
A gomb beolvasás például:
case btnLEFT: //4. case { { H = H + 1; if ( H > E ) (E = E + 1 ); // H értéke nem haladhatja meg E-ét lcd.setCursor(8, 0); lcd.print(" "); lcd.setCursor(8, 0); lcd.print(E); lcd.setCursor(8, 1); lcd.print(" "); lcd.setCursor(8, 1); lcd.print(H); EEPROM.write(1, H); delay(200); break; }
Sajnos kénytelen vagyok ezt használni, a keypad shield tartalmazza az ellenállásokat és a gombokat. Nem maradt elég bemenet mind az 5 gombnak egyesével.