Electrokit Buggfix Plus
Aktuellt datum och tid: 17.08 2018-09-23

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 25 inlägg ]  Gå till sida 1, 2  Nästa
Författare Meddelande
InläggPostat: 15.13 2018-03-02 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 197
Hej!

Jag har ett program där sensorer räknar hur många pulser min motor snurrar åt ena eller andra hållet.
Så jag kan få på min 2x16 LCD en siffra vart motorn är någonstans pulsmässigt. Motorn snurrar sålänge knappen hålls ned.

Jag skulle vilja spara en position. T.ex. om jag stannar på puls 588, spara den position med en knapptryckning, och sedan när jag passerar den siffran igen, eller kör över den siffran så att säga, så ska motorn stanna tillfälligt. :humm:
Antingen att den stannar någon sekund, eller att den stannar och att man måste lyfta 'kör' knappen och trycka ner den igen.

Skulle vara tacksam om någon har ett tips, eller kan peka mig i rätt riktning.

Önskar alla en trevlig fredag och helg. :)
Mvh F


Senast redigerad av fosfor 15.38 2018-03-02, redigerad totalt 2 gånger.

Upp
 Profil  
 
InläggPostat: 15.28 2018-03-02 
Admin
Användarvisningsbild

Blev medlem: 14.59 2003-05-26
Inlägg: 7439
Ort: Solna
Får jag se ditt program så går det lättare.
Låter som en enkel grej att fixa.


Upp
 Profil  
 
InläggPostat: 15.33 2018-03-02 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 197
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1.  
  2.  
  3. //  ---- MOTOR CONST INTARNA  ----
  4. const int controlPin1 = 7;
  5. const int controlPin2 = 6;
  6. const int enablePin = 9;
  7.  
  8.  
  9. #include <Wire.h>
  10. #include <LiquidCrystal_I2C.h>
  11.  
  12.  
  13. // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  14. char lineText[]="  Hoy!  ";
  15. int sensor01;
  16. int sensor02;
  17. int stepOld;
  18. int step;
  19. long PulseCount;
  20.  
  21.  
  22. // ---- MOTOR TEST INT ---------------------------------------------------------------------------------
  23. int intest1Pin = 4;        // KNAPP  -  GRÅ   - Går åt plus hållet    - UPP
  24. int intest2Pin = 5;        // KNAPP  -  GRÖN  - Går åt minus hållet   - NER
  25. int intest3Pin = 10;       // KNAPP  -  SVART - Ej något än
  26. int intest4Pin = 11;       // KNAPP  -  BLÅ   - Ej något än
  27. int stopsensor2Pin = 8;    // SENSOR -  GRÅ   - Enskild sensor - UPP STOPP
  28. int stopsensor1Pin = 12;   // SENSOR -  GRÖN  - Enskild sensor - NER STOPP
  29. int val = 0;
  30.  
  31. int tonePin = 13;          // ---- HÖGTALARE
  32.  
  33.  
  34.  
  35. // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN - I2C
  36. // initialize the library with the numbers of the interface pins
  37. // 0x27 adressen hittades via I2C scanner på den med svart tejp - De andra hade 0x3F
  38. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  39.  
  40. // Aktivera denna rad, och av-avaktivera den ovanför, om någon av de andra displayerna ska användas
  41. // LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  42.  
  43.  
  44. // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  45. #define SENSOR_A 3
  46. #define SENSOR_B 2
  47.  
  48. // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  49. void checkState()
  50. {
  51.   sensor01 = digitalRead(SENSOR_A);
  52.   sensor02 = digitalRead(SENSOR_B);
  53.  
  54.   if(sensor01 == 1 && sensor02 == 1){
  55.     step = 0;
  56.     if(stepOld == 1){
  57.       PulseCount--;
  58.     }
  59.     if(stepOld == 3){
  60.       PulseCount++;
  61.     }
  62.     stepOld = 0;
  63.   }
  64.  
  65.   if(sensor01 == 0 && sensor02 == 1){
  66.     step = 1;
  67.     if(stepOld == 2){
  68.       PulseCount--;
  69.     }
  70.     if(stepOld == 0){
  71.       PulseCount++;
  72.     }
  73.     stepOld = 1;
  74.   }
  75.  
  76.   if(sensor01 == 0 && sensor02 == 0){
  77.     step = 2;
  78.     if(stepOld == 3){
  79.       PulseCount--;
  80.     }
  81.     if(stepOld == 1){
  82.       PulseCount++;
  83.     }
  84.     stepOld = 2;
  85.   }
  86.  
  87.   if(sensor01 == 1 && sensor02 == 0){
  88.     step = 3;
  89.     if(stepOld == 0){
  90.       PulseCount--;
  91.     }
  92.     if(stepOld == 2){
  93.       PulseCount++;
  94.     }
  95.     stepOld = 3;
  96.   }
  97. }
  98.  
  99.  
  100. // VOID SETUP - KÖRS BARA EN GÅNG I BÖRJAN, EN FÖRBEREDELSE, LOOP ÄR EXEKVERING OCH GÖR DET MESTA JOBBET
  101. // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  102.  
  103. void setup()
  104. {
  105.   // set up the LCD's number of columns and rows:
  106.   lcd.begin(16, 2);
  107.   // Print a message to the LCD.
  108.   lcd.setCursor(0, 0);
  109.   lcd.print("                ");
  110.   lcd.setCursor(0, 1);
  111.   lcd.print("                ");
  112.  
  113.   attachInterrupt(0, checkState, CHANGE);
  114.   attachInterrupt(1, checkState, CHANGE);
  115.  
  116.   PulseCount = 0;
  117.  
  118.  
  119.  
  120.  
  121.  
  122.   // TEST MOTOR  - VOID SETUP ---------------------------------------------------------------------------------
  123.   pinMode(intest1Pin, INPUT);         //Declarar denna som input  UNO input är 4    grå
  124.   pinMode(intest2Pin, INPUT);         //Declarar denna som input  UNO input är 5    grön
  125.   pinMode(intest3Pin, INPUT);         //Declarar denna som input  UNO input är 10   blå
  126.   pinMode(intest4Pin, INPUT);         //Declarar denna som input  UNO input är 11   blå
  127.   pinMode(stopsensor1Pin, INPUT);     //Declarar denna som input  UNO input är 12   grön
  128.   pinMode(stopsensor2Pin, INPUT);     //Declarar denna som input  UNO input är 8    grå
  129.  
  130.   // Högtalare
  131.   pinMode(tonePin, OUTPUT);
  132.  
  133.  
  134. //  ---- LCD start presentationen
  135. {
  136.  
  137. lcd.setCursor(2, 0);
  138. lcd.print("PRO");
  139. delay(500);
  140. // lcd.clear();
  141.  
  142. lcd.setCursor(11, 1);
  143. lcd.print("9");
  144. delay(100);
  145.  
  146. lcd.setCursor(11, 1);
  147. lcd.print("90");
  148. delay(100);
  149.  
  150. lcd.setCursor(11, 1);
  151. lcd.print("90E");
  152. delay(900);
  153. lcd.clear();
  154.  
  155. lcd.setCursor(2, 0);
  156. lcd.print("Prototype 1.0");
  157. delay(200);
  158.  
  159. lcd.setCursor(0, 1);
  160. lcd.print("www.");
  161. delay(100);
  162.  
  163. lcd.setCursor(12, 1);
  164. lcd.print(".se");
  165. delay(100);
  166.  
  167. lcd.setCursor(0, 1);
  168. lcd.print("www.PRO");
  169. delay(250);
  170.  
  171. lcd.setCursor(0, 1);
  172. lcd.print("www.PRO");
  173. delay(800);
  174. lcd.clear();
  175.  
  176.   }
  177. }
  178.  
  179.  
  180.  
  181.  
  182.  
  183. void loop()
  184.  
  185.  
  186. {
  187.  
  188.   // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  189.   // LCD set the cursor to column 0, line 1 (note: line 1 is the second row, since counting begins with 0):
  190.  
  191.   lcd.setCursor(0, 0);
  192.  
  193.   lcd.print("Pulses:");
  194.   if(PulseCount > -1){
  195.     lcd.print(" ");
  196.   }
  197.  
  198.   if(PulseCount < 10 && PulseCount > -10){
  199.     lcd.print(" ");
  200.   }
  201.  
  202.   if(PulseCount < 100 && PulseCount > -100){
  203.     lcd.print(" ");
  204.   }
  205.  
  206.   lcd.print(PulseCount);
  207.   if(sensor01 == 1){
  208.     lcd.print(" HIGH");
  209.   }
  210.   else{
  211.     lcd.print(" LOW ");
  212.   }
  213.  
  214.   lcd.setCursor(0, 1);
  215.  
  216.   if(sensor02 == 1){
  217.     lcd.print("            HIGH");
  218.   }
  219.   else{
  220.     lcd.print("            LOW ");
  221.   }
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228. //  ---- MOTORNS VOID LOOP  - KNAPPSTYRNINGEN TILL MOTORERNA ----
  229.  
  230. // intest 1 ÅKER UPP
  231. // intest 2 ÅKER NER
  232. // stopsensor1Pin heter stoppsensorn
  233. // stopsensor2Pin heter stoppsensorn
  234.  
  235. {
  236.  
  237. // ---- ÅKER UPP ----
  238.   val = digitalRead(intest1Pin);         // UPP - Läser input värde
  239.   if (val == HIGH)                       // Checkar om knappen trycks
  240.   {                    
  241.   digitalWrite(controlPin1, HIGH);      
  242.   digitalWrite(controlPin2, LOW);
  243.  
  244. // -- Detta är sensorn som, om täcks, hindrar motorn från att åka ner
  245.   {
  246.   val = digitalRead(stopsensor2Pin);         // Sensorn som stoppar motorn
  247.   if (val == HIGH) {                    
  248.   digitalWrite(controlPin1, LOW);
  249.  
  250. // -- Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
  251.     lcd.setCursor(0, 1);
  252.     lcd.print("STOP");
  253.     delay(50);
  254.  
  255. // -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks
  256.   tone(tonePin, 880, 125);
  257.   delay(650);
  258.   noTone(tonePin);
  259.   }
  260.  
  261.  
  262. // -- Dessa 3 rader visar text när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
  263.   lcd.setCursor(0, 1);
  264.   lcd.print("Up");
  265.   delay(50);
  266.   }
  267.   }
  268.  
  269.  
  270.  
  271.  
  272. // ---- ÅKER NER ----
  273.   else {
  274.   val = digitalRead(intest2Pin);         // NER - Läser input värde
  275.   if (val == HIGH) {                     // Checkar om knappen trycks
  276.   digitalWrite(controlPin1, LOW);      
  277.   digitalWrite(controlPin2, HIGH);
  278.  
  279. // -- Detta är sensorn som, om täcks, hindrar motorn från att åka ner
  280.   {
  281.   val = digitalRead(stopsensor1Pin);         // Sensorn som stoppar motorn
  282.   if (val == HIGH) {                    
  283.   digitalWrite(controlPin2, LOW);
  284.  
  285. // -- Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
  286.     lcd.setCursor(0, 1);
  287.     lcd.print("STOP");
  288.     delay(50);
  289.  
  290. // -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks
  291.   tone(tonePin, 880, 125);
  292.   delay(650);
  293.   noTone(tonePin);
  294.   }
  295.  
  296. // -- Dessa 3 rader visar DOWN när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
  297.     lcd.setCursor(0, 1);
  298.     lcd.print("Down");
  299.     delay(50);
  300.   }
  301.  
  302.  
  303. // -- Dessa två rader stoppar motorn när man släpper knappen
  304.   }  else
  305.   {
  306.   digitalWrite(controlPin1, LOW);        
  307.   digitalWrite(controlPin2, LOW);      
  308.   }
  309.  
  310.  
  311. }
  312. }
  313. }
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  


Upp
 Profil  
 
InläggPostat: 10.34 2018-03-05 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 197
NÅT tips?


Upp
 Profil  
 
InläggPostat: 15.45 2018-03-05 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4316
Ort: Jönköping
Man kan spara parametrar i EEPROM. Vissa mcu har en liten mängd EEPROM inbyggt.


Upp
 Profil  
 
InläggPostat: 15.52 2018-03-05 
Användarvisningsbild

Blev medlem: 17.06 2017-04-15
Inlägg: 553
Ort: Malmö
Du hittar det du behöver på denna sida: https://www.arduino.cc/en/Reference/EEPROM
Tänk bara på att för många writes till samma position kommer att förstöra cellen så småningom.


Upp
 Profil  
 
InläggPostat: 15.56 2018-03-05 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 36767
Ort: Söderköping
Behöver den "minnas" positionen även om utrustningen stängs av?
Om inte så kan du ju bara spara det i en variabel i programmet. Om
det måste sparas över omstarter så får det bli EEPROM.


Upp
 Profil  
 
InläggPostat: 19.49 2018-03-05 
Användarvisningsbild

Blev medlem: 11.03 2007-09-10
Inlägg: 9074
Ort: Alingsås
Det är inte du själv som har skrivit programmet?
Citera:
Så jag kan få på min 2x16 LCD en siffra vart motorn är någonstans pulsmässigt.

Var i programmet har du raden som skriver ut den siffran?

EDIT: ok, rad 206 : PulseCount...


OK.... du har funktionen checkState() som verkar ligga som ett interrupt. Det är där variabeln PulseCount räknar upp eller ner.
jag föreslår att du ändrar i koden på två (eller tre) ställen....

Först, i huvudloopen, läser du in tillståndet på den knapp du ska trycka på för att registrera motorns läge. När tillståndet ÄNDRAS från icke-nedtryckt till nedtryckt sätter du en flagga (en global boolsk variabel som deklarerats som volatile).
Flaggan läser du av i slutet av interruptrutinen (alltså i CheckState). Om flaggan är etta så nollställer du flaggan samt sparar PulseCount i en annan global (volatile) variabel.
För att kolla vad som händer kan du ju i huvudloopen skriva ut värdet av den sparade variabeln, så ser du om det funkar.

Nästa steg är att i slutet av samma interruptrutin INNAN du kollar flaggan, jämför du det sparade värdet med PulseCount. Om de är lika så triggar du en annan global volatile flagga (dvs sätter till etta, eller true) som du sedan läser av i huvudloopen - där nollställer du flaggan och utför vad som ska göras (t.ex. stoppa motorn).

kanske var det en ledtråd?


Upp
 Profil  
 
InläggPostat: 09.20 2018-03-07 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 197
Tack för svar!

Det vore bra om en position kan sparas så att den är kvar även när maskinen ska startas igen.
Det ska inte sparas många positioner, egentligen bara en enda, eller max två. Då skulle jag vara i mål.
De sparas inte ofta heller, egentligen räcker det med att man spar dom en gång så kan det räcka månader sen.
Så inget ständigt read/write eller så.

Vill helt enkelt bara kunna spara en position för att få motorn att kunna köra dit när man vill.


Upp
 Profil  
 
InläggPostat: 09.52 2018-03-07 
Användarvisningsbild

Blev medlem: 10.07 2008-01-22
Inlägg: 1721
Ort: Sollentuna
Vad är egentligen frågan?
jesse har ju beskrivit stegen som skall till för att göra det. Andra har nämnt eeprom för att lagra data persistent mellan omstarter.
Kombinera dessa två så är du hemma.

/K


Upp
 Profil  
 
InläggPostat: 10.20 2018-03-07 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 197
Ursäkta
Jag är nybörjare, det vore toppen om det finnas några exempel jag kan titta på?
Så att jag har än mer att gå på utöver de fina beskrivningarna jag fått här.
Jag hänger ibland inte med på slangen och benämningarna för olika saker.


Upp
 Profil  
 
InläggPostat: 10.37 2018-03-07 

Blev medlem: 11.20 2009-05-26
Inlägg: 5235
Ort: Kristinehamn
The EEPROM size on the Arduino Uno is 1024 bytes
https://www.arduino.cc/en/Reference/EEPROM


Upp
 Profil  
 
InläggPostat: 11.27 2018-03-07 
Användarvisningsbild

Blev medlem: 10.07 2008-01-22
Inlägg: 1721
Ort: Sollentuna
fosfor skrev:
Ursäkta
Jag är nybörjare, det vore toppen om det finnas några exempel jag kan titta på?
Så att jag har än mer att gå på utöver de fina beskrivningarna jag fått här.
Jag hänger ibland inte med på slangen och benämningarna för olika saker.


Det var absolut inte meningen att vara dryg med min kommentar.
Men, det ter sig för mig väldigt konstigt om du inte kan lägga till dessa
nya funktioner med tanke på att du redan snickrat ihop det tämligen komplexa
program du postade tidigare(!?)

/j


Upp
 Profil  
 
InläggPostat: 09.14 2018-03-09 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 197
Håller med. Jag är nästan lite förvånad själv att jag fått det fungera.
Det har blivit en hel del trial and error :lol:
En nackdel är att jag då och då måste göra annat, så själva "helhetsbilden" som jag ibland
nästan har fingret lite på då hinner glömmas bort, så det blir lite börja om från början när jag ska sätta mig igen med den.
Läsa om vad det vad kommandon betydde osv.
Bästa hade ju varit om man kunnat sitta med den varje dag från start till stopp. :roll:


Upp
 Profil  
 
InläggPostat: 09.38 2018-03-09 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23081
Ort: Kristinehamn
fosfor: jag har själv - pga. mina handikapp - problem med att överskåda helheten i projekt.

Jag bryter därför ner projekt i delar.

Gammalt exempel: (mitt första kommersiella program)
3 elektriska ugnar ska styras efter var sin temperaturkurva.
I grunden x°C/timme till inställd värde (t.ex. 1100°C), hålla tempen ett tag, sedan sänka med y°C/timme - men kan vara mer komplicerat.

Input-media:
4*4 t-bord.
Output-medie:
Monitor.

Då jag satt o tittade på det fick jag lite panik: hur fan skulle jag skruva ihop detta?

Men logiken sa att jag MÅSTE ha:
* En tidsräknare.
* En t-bords avkänning.
* En utskriftsrutin.
* En uträkning av vilken temperatur som det ska vara baserat på tiden och start-temperatur samt var i tabellen man är.
* Ett koll av var i tabellen man är för att sekvensera genom det hela.
* En inläsning av temperaturer.
Det var nog lite mer småkrafs...

Jag gjorde sedan en sak åt gången klar och testade varje del.

Sedan hade jag ett ramverk som tog hand om allt det "tråkiga" och efter att ha sytt ihop de funktioner på det enda sätt jag kunde se det skulle fungera på testade vi systemet.

Första testen skarpt fungerade utan problem.

Så del upp ditt projekt, klura ut vilka funktioner du behöver och sedan sätter du dig vid datorn och börjar.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 25 inlägg ]  Gå till sida 1, 2  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
    Electrokit
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010