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
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.
(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.
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