Reagera inom + - ett värde - Arduino UNO

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av fosfor »

Johano:

Din första kodsnutt fungerar fint.
Men den du rekomemnderar "Du vill istället göra:"
Får jag inte till att fungera.

Min variabel står längre upp som float f = 0.00f; //Variable to store data read from EEPROM.
Så jag antar f?

Har lagt in

Kod: Markera allt

          f = EEPROM.get(0, f);   // strax ovanför koden som är nedanför där jag testat runt en del

          // if(PulseCount >= f-10 && PulseCount <= f+10) Kodsnutten från forumtråden med min variabel f
             if( PulseCount >= EEPROM.get(f-10 && PulseCount <= f+10))
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av johano »

Nu är det förvirrat på många plan här...

Är det verkligen en float du stoppar in i EEPROM:et??
Och din if-sats är helt tokig, vill du verkligen ha hela uttrycket "f-10 && PulseCount <= f+10" i anropet(!) till EEPROM.get()??

Kan du posta hela ditt program så kan vi börja reda ut det här.

/j
Borre
Inlägg: 4564
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av Borre »

Ja och förtydliga vilken kod det är du använder, den du kommenterat bort är ju det Johan föreslår och den undre något annat konstigt.
Likaså att säga "inte fungerar", det säger väldigt lite om vad som faktiskt inte fungerar eller eventuella felmeddelanden.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av adent »

Ett tips!

Gör saker sakta och fint i början, krångla inte till det! Är det svårt att läsa är det svårt att förstå!
Divide and conquer heter det! (med reservation för felstavning).

Gör en sak i taget och bygg på!

Det johano och Mr Andersson skriver är vettigt, läs deras inlägg igen!

Lätt och begripligt:

Kod: Markera allt

if(a > 55)
{
  dosomething();
}
Fortfarande ganska begripligt:

Kod: Markera allt

float limit = 55;

if(a > limit)
{
  dosomething();
}

Sakta sakta Bara som exempel nu parenteser för säkerhets skull är alltid bra!:
a måste alltså vara större än limit OCH skiljt från 0.

Kod: Markera allt

float limit = 55;

if( (a > limit) && (a != 0) )
{
  dosomething();
}
Vi bygger på med vettiga gränser och närmar oss målet!:
Man måste inte göra så här med massa variabler, men jag tror det underlättar. En sak i taget.

Kod: Markera allt

float limit = 55;

float upperlimit = limit + 10;
float lowerlimit = limit - 10;

if( (a > lowerlimit ) && (a < upperlimit) )
{
  dosomething();
}
Vi bygger på med vettiga gränser och närmar oss målet!:
Kanske ännu bättre om vi inte blandar skapandet av variablerna med tilldelningen.

Kod: Markera allt

float limit;
float upperlimit;
float lowerlimit;

limit = 55;
upperlimit = limit + 10;
lowerlimit = limit - 10;

if( (a > lowerlimit ) && (a < upperlimit) )
{
  dosomething();
}
Ännu bättre där vi kan sätta avvikelsen på ett ställe istället för hårdkoda 10.
Behöver vi bara ändra på ett ställe. OBS! med #define skapar man något INNAN kompilatorn körs
Preprocessorn kommer alltså att byta ut alla förekomster av TOLERANCE mot 10 innan det kompileras.
Ur kompilatorns perspektiv är detta samma som att skriva 10 där det står TOLERANCE. Behöver du
kunna ändra toleransen under drift gör du en variabel istället!

Kod: Markera allt

#define TOLERANCE 10    

float limit;
float upperlimit;
float lowerlimit;

limit = 55;
upperlimit = limit + TOLERANCE;
lowerlimit = limit - TOLERANCE;

if( (a > lowerlimit ) && (a < upperlimit) )
{
  dosomething();
}
Sen behöver du bara ersätta limit = 55; med en utläsning från eeprom istället! Men det är bra att testa små ändringar i taget.

Vet inte om jag bidrog så mycket, men fråga på!

edit: rättat ett fel och byggt på.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av fosfor »

Aloha!
Här kommer koden.
Keep in mind, detta är min absolut första kod, förstår att den antagligen ser helt horribel ut i mångas ögon :P :vissla:
Det jag försöker göra är en liten typ lift jag ska ha där jag kan spara en position nångång ibland, och kunna ta bort denna position om man vill.
Den har sensorer som känner både högst och lägst positioner och stoppar.
Den har en display som visar lite info, och den har en motor rotary disc encoder, samt en H-brygga innan den.
Allting fungerar :bravo: (har det uppkopplat till en rigg med knappar). Jag kan spara position som den stannar vid när den passerar.
MEN det som inte fungerar här, det är att när jag tar bort positionen ur minnet så tas den inte bort helt utan verkar hamna på någon
annan siffra/position ett par hundra pulser ifrån. Det verkar vara lite random också. Så lite buggigt beteende. :humm:

Kod: Markera allt


//  ---- MOTOR CONST INTARNA  - DESSA GÅR TILL H-BRYGGAN ----
const int controlPin1 = 7;
const int controlPin2 = 6;
const int enablePin = 9;


#include <Wire.h>                   // Tillåter I2C kommunikation - Pins A4 (SDA), A5 (SCL)
#include <LiquidCrystal_I2C.h>      // Denna aktiverar LCD
#include <EEPROM.h>                 // Denna aktiverar EEPROM minnet



// ---- Dessa används för sparning i EEPROM - 2018-04-16 ---------------------
struct MyObject{
  float field1;
  byte field2;
  char name[10];
};




// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
char lineText[] = "  Hoy! Denna text syns ingenstans.  ";
int sensor01;
int sensor02;
int stepOld;
int step;
long PulseCount;


// ---- MOTOR TEST INT ---------------------------------------------------------------------------------
int intest1Pin = 4;        // KNAPP 1   -  Kabel GRÅ    - Går åt plus hållet    - UPP
int intest2Pin = 5;        // KNAPP 2   -  Kabel GRÖN   - Går åt minus hållet   - NER
int intest3Pin = 10;       // KNAPP 3   -  Kabel SVART  - SPARA POSITION        - Minnet SPARA
int intest4Pin = 11;       // KNAPP 4   -  Kabel BLÅ    - VISA SPARAD POSITION  - Minnet LÄS
int stopsensor1Pin = 12;   // SENSOR 1  -  Kabel GRÖN   - Enskild sensor - STOPPAR NER
int stopsensor2Pin = 8;    // SENSOR 2  -  Kabel GRÅ    - Enskild sensor - STOPPAR UPP
int stopsensor3Pin = 15;   // SENSOR 3  -  Kabel ROSA   - Enskild sensor - TOTALSTOPP
int val = 0;
int tonePin = 13;          // --- BEEPER ---

// ---- Dessa används för sparning i EEPROM - 2018-04-16 ---------------------
  float f = 0.00f;        //Variable to store data read from EEPROM.
  int eeAddress = 0;      //EEPROM address to start reading from



// ---- TEST 17 april 2018 - Verkar inte behövas
 // int setValue = EEPROM.get(0, eeAddress);


// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN - I2C - initialize the library with the numbers of the interface pins
// 0x27 adressen hittades via I2C scanner på den med svart tejp - De andra hade 0x3F
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Aktivera denna rad, och av-avaktivera den ovanför, om någon av de andra I2C displayerna ska användas
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);




// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
#define SENSOR_A 3
#define SENSOR_B 2

void checkState()
{
  sensor01 = digitalRead(SENSOR_A);
  sensor02 = digitalRead(SENSOR_B);

  if (sensor01 == 1 && sensor02 == 1) {
    step = 0;
    if (stepOld == 1) {
      PulseCount--;
    }
    if (stepOld == 3) {
      PulseCount++;
    }
    stepOld = 0;
  }

  if (sensor01 == 0 && sensor02 == 1) {
    step = 1;
    if (stepOld == 2) {
      PulseCount--;
    }
    if (stepOld == 0) {
      PulseCount++;
    }
    stepOld = 1;
  }

  if (sensor01 == 0 && sensor02 == 0) {
    step = 2;
    if (stepOld == 3) {
      PulseCount--;
    }
    if (stepOld == 1) {
      PulseCount++;
    }
    stepOld = 2;
  }

  if (sensor01 == 1 && sensor02 == 0) {
    step = 3;
    if (stepOld == 0) {
      PulseCount--;
    }
    if (stepOld == 2) {
      PulseCount++;
    }
    stepOld = 3;
  }
}








// VOID SETUP - KÖRS BARA EN GÅNG I BÖRJAN, EN FÖRBEREDELSE, LOOP ÄR EXEKVERING OCH GÖR DET MESTA JOBBET
// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN

void setup()
{

  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");

  attachInterrupt(0, checkState, CHANGE);
  attachInterrupt(1, checkState, CHANGE);

  PulseCount = 0;





  // TEST MOTOR  - VOID SETUP ---------------------------------------------------------------------------------
  pinMode(intest1Pin, INPUT);         //Declarar denna som input  UNO input är 4    Knapp 1   Grå     UPP
  pinMode(intest2Pin, INPUT);         //Declarar denna som input  UNO input är 5    Knapp 2   Grön    NER
  pinMode(intest3Pin, INPUT);         //Declarar denna som input  UNO input är 10   Knapp 3   Svart   SPARA POSITION
  pinMode(intest4Pin, INPUT);         //Declarar denna som input  UNO input är 11   Knapp 4   Blå     TA BORT POSITION

  pinMode(stopsensor1Pin, INPUT);     //Declarar denna som input  UNO input är 12         grön
  pinMode(stopsensor2Pin, INPUT);     //Declarar denna som input  UNO input är 8          grå
  pinMode(stopsensor3Pin, INPUT);     //Declarar denna som input  UNO input är 15 (A1)    rosa

  pinMode(tonePin, OUTPUT);           // Högtalare


  //  ---- LCD start presentationen
  {

    lcd.setCursor(2, 0);
    lcd.print("PROTOTYPE");
    Serial.println("Boot initialized");
    delay(500);
    // lcd.clear();

    lcd.setCursor(11, 1);
    lcd.print("9");
    delay(100);

    lcd.setCursor(11, 1);
    lcd.print("90");
    delay(100);

    lcd.setCursor(11, 1);
    lcd.print("90E");
    delay(900);
    lcd.clear();

    lcd.setCursor(2, 0);
    lcd.print("Prototype 1.0");
    delay(200);

    lcd.setCursor(0, 1);
    lcd.print("www.");
    delay(100);

    lcd.setCursor(12, 1);
    lcd.print(".se");
    delay(100);

    lcd.setCursor(0, 1);
    lcd.print("www.PROTOTYPE.se");
    delay(250);

    lcd.setCursor(0, 1);
    lcd.print("www.PROTOTYPE.se");
    Serial.println("Unit is active");

    delay(800);
    lcd.clear();

  }
}





void loop()

{
  // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  // LCD set the cursor to column 0, line 1 (note: line 1 is the second row, since counting begins with 0):

  lcd.setCursor(0, 0);

  lcd.print("Pulses:");
  if (PulseCount > -1) {
    lcd.print(" ");
  }

  if (PulseCount < 10 && PulseCount > -10) {
    lcd.print(" ");
  }

  if (PulseCount < 100 && PulseCount > -100) {
    lcd.print(" ");
  }

  lcd.print(PulseCount);
  if (sensor01 == 1) {
    lcd.print(" HIGH");
  }
  else {
    lcd.print(" LOW ");
  }

  lcd.setCursor(0, 1);

  if (sensor02 == 1) {
    lcd.print("            HIGH");
  }
  else {
    lcd.print("            LOW ");
  }


  // -- INTEST PIN 3 - SPARAR
  // -- SPARAR POSITION TILL EEPROM - FUNGERAR! ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  // -- Denna använder knapp 3 på breadboard
  
  {
    val = digitalRead(intest3Pin);         // Knapp 3 - Denna ska spara position i minnet
    if (val == HIGH) {                     // Kollar om knappen är tryckt
      EEPROM.put(0, PulseCount);           // Skriver PulseCount numret till minnet, adressen är 0
      lcd.setCursor(0, 1);                 // Dessa två rader skriver till LCD, i detta fall är 0,1 rad 2
      lcd.print(PulseCount);
      delay(750);
      lcd.setCursor(0, 1);
      lcd.print("Pos. SAVED");
      Serial.println("Saving liftposition to memory");
      delay(750);
    }
  }


  // -- INTEST PIN 4 - RADERAR
  // -- Denna ska radera positionen som finns i EEPROM minnet
  // -- Den fungerar inte riktigt - Den tar bort nuvarande position, men det hamnar en ny position lite random i närheten istället
    {
      val = digitalRead(intest4Pin);         // Knapp 4 - Ska radera minnet
      if (val == HIGH) {                     // Kollar om knappen är tryckt
        EEPROM.write(0, 0);          // 
        lcd.setCursor(0, 1);                 // Dessa två rader skriver till LCD, i detta fall är 0,1 rad 2
        lcd.print("Pos. erased");
        Serial.println("Erasing position from memory");
        delay(1000);
      }
    }



      // -- FUNGERAR! Dessa rader stoppar motorn 1 sek när den är inom värdet, gäller både UPP och NED
{ 
          if( PulseCount >= EEPROM.get(0, eeAddress)-15 && PulseCount <= EEPROM.get(0, eeAddress)+15)

          {
          digitalWrite(controlPin1, LOW);
          digitalWrite(controlPin2, LOW);
          lcd.setCursor(0, 1);
          lcd.print("Users Stop");
          Serial.println("Users programmed STOP activated");
          delay(1500); 
          
          // -- Dessa tre rader nedanför gör pipljudet när användarens programmerade stopp aktiveras
          // tone(tonePin, 600);
          // delay(50);
          // tone(tonePin, 950);
          // delay(70);
          // tone(tonePin, 800, 125);
          // delay(800);
          // noTone(tonePin);
          // delay(1500);
        }
      }       //Går till raderna ovan




  //  ---- MOTORNS VOID LOOP  - KNAPPSTYRNINGEN TILL MOTORERNA ----

  // intest 1 ÅKER UPP
  // intest 2 ÅKER NER
  // stopsensor1Pin heter stoppsensorn som hindrar UPP
  // stopsensor2Pin heter stoppsensorn som hindrar NED
  // stopsensor3Pin heter stoppsensorn som ska hindra UPP eller NED

  {

    // ---- ÅKER UPP ----
    val = digitalRead(intest1Pin);         // UPP - Läser input värde
    if (val == HIGH)                       // Checkar om knappen trycks
    {
      digitalWrite(controlPin1, HIGH);
      digitalWrite(controlPin2, LOW);




      // -- DESSA TRE TILLHÖR SENSORN SOM SKA STOPPA BÅDE UPP OCH NER
      {
        val = digitalRead(stopsensor3Pin);
        if (val == HIGH) {
          digitalWrite(controlPin1, LOW);

          // -- Dessa 3 rader visar USER STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("User Stop");
          Serial.println("User removeable module defined stop 1");
          delay(50);

          // -- Dessa tre rader nedanför gör pipljudet när UPP & NER stopsensorn (ovan) täcks
          tone(tonePin, 600);
          delay(50);
          tone(tonePin, 950);
          delay(70);
          tone(tonePin, 800, 125);
          delay(800);
          noTone(tonePin);
        }
      }

      // -- Detta är sensorn som, om täcks, hindrar motorn från att åka upp
      {
        val = digitalRead(stopsensor2Pin);         // Sensor 2 som stoppar motorn, likaså sensor 3 vars uppgift är att stoppa både upp och ner
        if (val == HIGH) {
          digitalWrite(controlPin1, LOW);

          // -- Dessa 3 rader visar UPSTOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("Up Stop");
          Serial.println("Upper security sensor reached ⮏ Can only go down");
          delay(50);

          // -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks påvägen UPP
          tone(tonePin, 880);
          delay(125);
          tone(tonePin, 400, 125);
          delay(650);
          noTone(tonePin);
        }


        // -- Dessa 3 rader visar UP när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
        lcd.setCursor(0, 1);
        lcd.print("Up");
        Serial.println("Lift going up at full speed");
        delay(50);


      }
    }


    // ---- ÅKER NER ----
    else {
      val = digitalRead(intest2Pin);         // NER - Läser input värde
      if (val == HIGH) {                     // Checkar om knappen trycks
        digitalWrite(controlPin1, LOW);
        digitalWrite(controlPin2, HIGH);


        // -- DESSA TRE TILLHÖR SENSORN SOM SKA STOPPA BÅDE UPP OCH NER
        {
          val = digitalRead(stopsensor3Pin);         // TEST
          if (val == HIGH) {
            digitalWrite(controlPin2, LOW);

            // -- Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
            lcd.setCursor(0, 1);
            lcd.print("User Stop");
            Serial.println("User removeable module defined stop 2");
            delay(50);

            // -- Dessa tre rader nedanför gör pipljudet när UPP & NER stopsensorn (ovan) täcks
            tone(tonePin, 600);
            delay(50);
            tone(tonePin, 950);
            delay(70);
            tone(tonePin, 800, 125);
            delay(800);
            noTone(tonePin);
          }
        }


        // -- Detta är sensorn som, om täcks, hindrar motorn från att åka ner
        {
          val = digitalRead(stopsensor1Pin);         // Sensorn 1 som stoppar motorn, likaså sensor 3 vars uppgift är att stoppa både upp och ner
          if (val == HIGH) {
            digitalWrite(controlPin2, LOW);


            // -- Dessa 3 rader visar DOWN STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
            lcd.setCursor(0, 1);
            lcd.print("Down Stop");
            Serial.println("Lower security sensor reached Can only go up");
            delay(50);

            // -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks påvägen ner
            tone(tonePin, 880);
            delay(125);
            tone(tonePin, 400, 125);
            delay(650);
            noTone(tonePin);
          }

          // -- Dessa 3 rader visar DOWN när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("Down");
          Serial.println("Lift going down at full speed");
          delay(50);
        }

        // -- Dessa två rader stoppar motorn när man släpper knappen
      }  else
      {
        digitalWrite(controlPin1, LOW);
        digitalWrite(controlPin2, LOW);
      }

      
    } // Går till Åker ner
  } // Går till Åker upp
} // Går till puls o grafikräkning - Högst upp





Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av fosfor »

adent:
Tackar! Mycket intressant!
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av SeniorLemuren »

fosfor skrev:Johano:

Din första kodsnutt fungerar fint.
Men den du rekomemnderar "Du vill istället göra:"
Får jag inte till att fungera.

Min variabel står längre upp som float f = 0.00f; //Variable to store data read from EEPROM.
Så jag antar f?

Har lagt in

Kod: Markera allt

          f = EEPROM.get(0, f);   // strax ovanför koden som är nedanför där jag testat runt en del

          // if(PulseCount >= f-10 && PulseCount <= f+10) Kodsnutten från forumtråden med min variabel f
             if( PulseCount >= EEPROM.get(f-10 && PulseCount <= f+10))
I den sista koden jag visade använder jag int eeAddress = 0; i stället för som du float f = 0.00f;
och på följande rad hämtar jag in det sparade värdet till variabeln eepromValue på adressen eeAddress:
"EEPROM.get( eeAddress, eepromValue ); "
Sedan använder jag det hämtade värdet eepromValue från EEPROMET i if-satsen
" if(pulseCount >= eepromValue -10 && pulseCount <= eepromValue + 10){ "


pulseCount som är det värde du får från din pulsräknare är ju ett heltal och det är helt onödigt att använda float . Använd int. För att det skall fungera så måste du även spara värdet till EEPROM som int.
I mitt exempel har jag satt ett fast värde (340) på pulseCount men det tar du naturligtvis bort i din skarpa version.

Kod: Markera allt

#include <EEPROM.h>
int eepromValue ;
int pulseCount  = 340;  
  
void setup(){ 
  int eeAddress = 0; //EEPROM address att starta läsning från
  Serial.begin( 9600 );  
  EEPROM.get( eeAddress,  eepromValue ); 
  Serial.print( "Låga gränsvärdet från eeprom: " );
  Serial.println( eepromValue);   
  Serial.print( "PulseCount: " );  
  Serial.println( pulseCount );
  if(pulseCount >=  eepromValue - 10 && pulseCount <=  eepromValue + 10){ 
    Serial.println("Pulsecount inom intervall");
    }else{
      Serial.println("Pulsecount utanför intervall");
  }
}
Användarvisningsbild
papabear
Inlägg: 821
Blev medlem: 14 mars 2004, 03:27:12
Ort: Eskilstuna
Kontakt:

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av papabear »

Jag gissar att det blir en random position efter du nollar EEPROM för att du skriver en nolla, vilket jag antar går som en int, och då kanske inte skriver över hela minnet (pulsecount är ju long). Eller för att du i ena fallet skriver med put och andra med write. Eller en kombination.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av johano »

Ok, mina små förslag på ändringar:

1. Lägg till en variabel "long UserStopPulseCount" överst i programmet (t.ex. alldeles under PulseCount)
2. Initiera denna i setup() med "EEPROM.get(0, UserStopPulseCount);"
3. I koden som sätter "userstop" lägg till tilldelning av UserStopPulseCount _förutom_ att skriva till EEPROM:

Kod: Markera allt

  // -- INTEST PIN 3 - SPARAR
  // -- SPARAR POSITION TILL EEPROM - FUNGERAR! ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  // -- Denna använder knapp 3 på breadboard

  {
    val = digitalRead(intest3Pin);         // Knapp 3 - Denna ska spara position i minnet
    if (val == HIGH) {                     // Kollar om knappen är tryckt
      UserStopPulseCount = PulseCount;
      EEPROM.put(0, UserStopPulseCount);           // Skriver PulseCount numret till minnet, adressen är 0
   ...
4. Koden som ska stoppa motorn om den befinner sig inne i "userstop"-intervallet ändras att kolla mot UserStopPulseCount

Kod: Markera allt

      // -- FUNGERAR! Dessa rader stoppar motorn 1 sek när den är inom värdet, gäller både UPP och NED
     { 
          if( UserStopPulseCount!=0 && PulseCount >= UserStopPulseCount-15 && PulseCount <= UserStopPulseCount+15 )
     ...
5. Ändra koden som ska radera "userstop" till att skriva en Long istället för en int och samtidigt nollställa UserStopPulseCount

Kod: Markera allt

  // -- INTEST PIN 4 - RADERAR
  // -- Denna ska radera positionen som finns i EEPROM minnet
  // -- Den fungerar inte riktigt - Den tar bort nuvarande position, men det hamnar en ny position lite random i närheten istället
    {
      val = digitalRead(intest4Pin);         // Knapp 4 - Ska radera minnet
      if (val == HIGH) {                     // Kollar om knappen är tryckt
        UserStopPulseCount = 0;
        EEPROM.put(0, UserStopPulseCount);          // 
     ...
Det borde funka med ovanstående ändringar tycker jag.
Det kan naturligtvis sen göras på en massa andra olika sätt efter tycke o smak-

/K
Senast redigerad av johano 18 april 2018, 18:13:04, redigerad totalt 1 gång.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av johano »

Sen kan man ju fundera på vilket värde EEPROM.get() returnerar i de fall man aldrig sparat något? Är minnet garanterat 0 innan det skrivits något?

/K
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av fosfor »

Johano:

Tack för förslaget! Jag har lagt in den nu, men får tyvärr felmeddelandet
"exit status 1
expected initializer before 'void'' och den markerar void setup()

Har testat att flytta runt de olika kodsnuttarna lite men det verkar inte hjälpa alls :humm:
Har dubbelcheckat så att allt stämmer med texten du skrev, förstår inte alls varför det gått snett.
Någon idé?
Här ligger den nu:

Kod: Markera allt

void setup()
{

  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");

  attachInterrupt(0, checkState, CHANGE);
  attachInterrupt(1, checkState, CHANGE);

  PulseCount = 0;

// --- Johanos förslag ---- 2018-04-19
EEPROM.get(0, UserStopPulseCount);

johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av johano »

Semikolon efter deklarationen av UserStopPulseCount kanske?
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av fosfor »

Johano:

Så var det förstås.... Klant-Jag.
Kollade flera ggr utan att se det, men nu efter att jag käkat och tagit en kaffe så märktes det ju :doh:

Grymt, det har passerat kompileringen nu.
Ska testa nu, återkommer med resultat :)
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av fosfor »

Johano:
Du ÄR en hjälte! Jättetack! Detta löste hela problemet.
Om det är något du behöver hjälp med kanske jag kan återgälda dig på något vis?

Och till er andra, stort tack för hjälpen. Vet att flera av er varit med och bistått med vital info
med tidigare problem. Ni är också hjältar!

α *reser mig upp och* :bravo: Ω
:)

Jag kommer säkerligen snart komma på något nytt problem, eller någon ny funktion som jag vill ha in.
Så jag återkommer nog rätt snart :D
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Reagera inom + - ett värde - Arduino UNO

Inlägg av johano »

:tumupp:
Skriv svar