Display code

Dependencies:   mbed reScale RotaryEncoder RPG Adafruit_ST7735 Adafruit_GFX PinDetect Ee24xx08 mRotaryEncoder

Files at this revision

API Documentation at this revision

Comitter:
BETZtechnik
Date:
Fri Feb 08 20:50:00 2019 +0000
Parent:
0:09419d572e90
Child:
2:bbbacfd62773
Commit message:
rs485 working from display to inputs

Changed in this revision

RPG.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RPG.lib	Fri Feb 08 20:50:00 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/canderson199/code/RPG/#0b389c2c21b5
--- a/main.cpp	Sun Jan 06 18:28:18 2019 +0000
+++ b/main.cpp	Fri Feb 08 20:50:00 2019 +0000
@@ -1,6 +1,6 @@
  #include "mbed.h"
 #include "Adafruit_ST7735.h"
-#include "RotaryEncoder.h"
+#include "RPG.h"
 #include "reScale.h"
 #include "Ee24xx08.h"
 
@@ -16,169 +16,442 @@
 #define YELLOW   0xFFE0 
 #define WHITE    0xFFFF
 
-//const int addrW = 0xA2; //1010 0010 write word block B0
-//const int addrR = 0xA2; //1010 0011 read word block B0
-
-long currentSpot = 0;
+#define currentToolAddress 51
+#define numToolsAddress 52
+#define numNozAddress 53
 
 
-DigitalOut myled(LED1);
-//DigitalOut out(D2);
+//DigitalOut myled(P1_13);
+
 
-//I2C i2c(P0_5, P0_4);
-Serial ser(USBTX,USBRX);
 I2C iic(P0_5, P0_4);
+Serial device(P0_14, P0_13, 9600);  // RS 485  TX RX?
+
+DigitalOut dir(P0_21);
+
 
 Ee24xx08 eeprom(&iic);
 
-Adafruit_ST7735 tft(D11, D12, D13, D10, D7, D9); // MOSI, MISO, SCLK, SSEL, TFT_DC, TFT_RST
-
-
-RotaryEncoder knob1(D2, D3, -50, 0, 0);
+Adafruit_ST7735 tft(P0_9, P0_8, P0_6, P0_2, P0_22, P0_7); // MOSI, MISO, SCLK, SSEL, TFT_DC, TFT_RST
 
 reScale servo1Scale(-45,0,750,1800); //19850 is 1.0v from voltage divider at 10k.
 
-//SDFileSystem sd(P1_20, P1_21, P1_22, P1_23, "sd"); // the pinout on the mbed Cool Components workshop board
+ PwmOut myServo(P1_13); //display board
+//PwmOut myServo(D4);
 
+//DigitalIn tUpButton(P2_11);
+//DigitalIn tDownButton(P2_12);
+DigitalIn encoderFalseButton(P0_23); // FALSE!!! push button of knob
+DigitalIn encoderButton(P0_20); // push button of knob
+DigitalIn backButton(P0_15); // back button
 
-PwmOut myServo(D4);
+Timer t;
+int lastBackButton;
+int lastDownButton;
+int lastEncoderButton;
+
+int dirt = 0;
 
 int main() {
-  //  out =1;
+
+// ************************************** SCREEN INIT *************************************************
+
+ tft.initR(INITR_GREENTAB);   // initialize a ST7735S chip, black tab
+      
+  tft.setRotation(3);
+  tft.fillScreen(BLACK);
+  tft.setCursor(30,120);
+  tft.setTextColor(WHITE);
+  tft.setTextWrap(false);
+  tft.printf("AccuBlast v0");
+  
+        tft.setCursor(4, 4);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(2);
+        tft.printf("N1");
+        
+        tft.setCursor(80, 4);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(2);
+        tft.printf("N2");
+        
+        tft.setCursor(4, 28);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(2);
+        tft.printf("T");   
+        
+        tft.setCursor(4, 50);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(1);
+        tft.printf("Nozzle");   
+        
+        tft.setCursor(4, 65);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(1);
+        tft.printf("Res."); 
+        
+        tft.setCursor(4, 80);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(1);
+        tft.printf("Res.");     
+        
+        tft.setCursor(4, 95);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(1);
+        tft.printf("Num Tls");     
+        
+        tft.setCursor(4, 110);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(1);
+        tft.printf("Num Noz");   
+        
+ // **************************************************************************************************************       
+  
+int received = 9;
+  
+  int count = 0;
+  int maxCount = 7; //max number of menu items
+  int lastCount = 99;
+  
+  //************* Pull previous setting from eeprom *******************
+  
+  char tempToolNo = 0;                  // last tool in spindle
+  eeprom.read(currentToolAddress, &tempToolNo);
+  int currentToolNo = (int)tempToolNo;
+  
+  char tempNumTools = 0;                  // number of tools in ATC
+  eeprom.read(numToolsAddress, &tempNumTools);
+  int numTools = (int)tempNumTools;
+  
+  char tempNumNoz = 0;                  // number of nozzles installed
+  eeprom.read(numNozAddress, &tempNumNoz);
+  int numNoz = (int)tempNumNoz;
+  
+  char tempLastAngle = 0;                  // last angle of last tool in spindle
+  eeprom.read(currentToolNo, &tempLastAngle);
+  int lastAngle = (int)tempLastAngle;
+  lastAngle = lastAngle - 45;              // Not storing signed int, so signed value is 45 less than what was stored to memory.
+  
+  //******************** Button debounce *********************************
   
 
-  
-  
-  
+
+ backButton.mode(PullUp);     // button pull up   
+ //tDownButton.mode(PullUp);     // button pull up   
+ encoderButton.mode(PullUp); 
+ encoderFalseButton.mode(PullUp);  
     
-      tft.initR(INITR_GREENTAB);   // initialize a ST7735S chip, black tab
-      
-        tft.setRotation(3);
-      
-        tft.fillScreen(BLACK);
-  tft.setCursor(30,120);
-  tft.setTextColor(WHITE);
-  tft.setTextWrap(true);
-  tft.printf("AccuBlast v0");
+t.start();                   // starts timer 
+lastBackButton = t.read_ms(); 
+lastDownButton = t.read_ms(); 
+lastEncoderButton =  t.read_ms();  
+ 
+ //**************************************************************************** 
   
-  int mode=1; // 0= manual, 1=auto
-  int lastMode=0; // placeholder for changing display.
+  int lastToolNo = 99; 
+  int lastNumTools = -1; // trigger to write eeprom value for number of tools
   
-  int toolNo = 12;
-  int lastToolNo = 99; 
+  int lastNumNoz = 0; //trigger display for number of nozzles after startup
   
-  int n1Pos = 0;
+  int n1Pos = lastAngle;                 //Set servo to last known postition prior to power off
   int lastN1Pos = 150;
   
   int servo1Pos = 0;
   
-    myServo.period_ms(20);
-   // myServo.pulsewidth_us(MID); //NB in microseconds
-   
-   
-   /*
-   char data[2];
-data[0] = 0x01;
-data[1] = 0x01;
-   
+   RPG rpg1(P2_2,P1_20,P0_23);  //  RPG (PinName pA, PinName pB, PinName pPB)P0_23 is unconnected!! ;
+  
+  myServo.period_ms(20);
 
- char cmd[3];
-        cmd[0] = 0x01;
-        cmd[1] = 0x03;
-        i2c.start();
-        i2c.write(addrW, cmd, 2);
-        cmd[0] = 0x00;
-        cmd[1] = 0x00;
-        i2c.write(addrW, cmd, 2);
-        i2c.stop();
-        i2c.start();
-        //i2c.write(addrR);
-        i2c.read(addrR, data, 2);
-       */ 
-     
-       char str[4] = "-45";
-       char str2[12] = "0";
-       char str3[4] = "3";
-    
-
-    eeprom.write(01,str,4);
-    wait(1);
-    eeprom.write(05,str3,4);
-    wait(1);
-    
-    
-    eeprom.read(01,str2,4);
-   // ser.printf("%s\r\n",str);
+/*
+      char t1Ang = 200;
+      char t1Read = 0;
+      
+      eeprom.write(1, t1Ang);
+      wait(1);
+      eeprom.read(1, &t1Read);
       
 
   tft.setCursor(30,110);
   tft.setTextColor(WHITE);
   tft.setTextWrap(true);
-   tft.printf("%s\r\n",str2);
-
-int T1 = int(str2[4]);
-
-  tft.setCursor(30,80);
-  tft.setTextColor(WHITE);
-  tft.setTextWrap(true);
-        tft.printf("%d", T1);
+  // tft.printf("%s\r\n",t1Read);
+          tft.printf("%d", currentTool);
+    */
+    
+      uint8_t c = 0; // for 485 link
+    
     
     while(1) {
         
- n1Pos = knob1.getVal();
+//myled = 1;        
+        
+if (t.read() > 1200){              // timer can only hold 30 min, so reset after 20
+t.reset();
+lastBackButton = t.read_ms();
+lastDownButton = t.read_ms();
+lastEncoderButton = t.read_ms();
+} 
+
+if (backButton == 0){  //Back button was pressed so back to default selection
+     count = 0;
+     }    
+     
+if (encoderButton == 0){
+if (t.read_ms() > (lastEncoderButton + 200)){
+count = count + 1;  //Reset count if PB pressed
+}
+ if (count > maxCount){
+    count = 0;
+    }      
+lastEncoderButton = t.read_ms();
+   
+  if (count > maxCount){
+        count = 0;
+        }  
+        }    
  
-servo1Pos = servo1Scale.from(knob1.getVal());
+ //****************** ENCODER ACTIONS ************************************************
+ if (count == 0){   // knob controls servo value
+dirt = rpg1.dir(); //Get Dir
+n1Pos = n1Pos + dirt; //Ad Dirt to n1pos
+if (n1Pos > 0){
+ n1Pos = 0;
+ }
+ if (n1Pos < -45){
+     n1Pos = -45;
+     }
+     }
+     
+if (count == 2){     //knob controls tool number
+dirt = rpg1.dir(); //Get Dir
+currentToolNo = currentToolNo + dirt; //Ad Dirt to n1pos
+if (currentToolNo > numTools){
+ currentToolNo = numTools;
+ }
+ if (currentToolNo < 1){
+     currentToolNo = 1;
+     }
+     }
+     
+     if (count == 6){     //knob controls tool number
+dirt = rpg1.dir(); //Get Dir
+numTools = numTools + dirt; //Ad Dirt to n1pos
+if (numTools > 50){
+ numTools = 50;
+ }
+ if (numTools < 1){
+     numTools = 1;
+     }
+     }
+     
+     if (count == 7){     //knob controls tool number
+dirt = rpg1.dir(); //Get Dir
+numNoz = numNoz + dirt; //Ad Dirt to n1pos
+if (numNoz> 2){
+ numNoz = 2;
+ }
+ if (numNoz < 1){
+     numNoz = 1;
+     }
+     }     
+     
+ 
+// ************* Rectangles for identifying active selection *****************************
+ 
+if (count == 0){ // N1 adjust
+tft.drawRect(2,2,74,18,GREEN);
+}
+else{
+tft.drawRect(2,2,74,18,WHITE);
+}
+
+if ((count == 1) && (numNoz == 2)){ // N2 adjust
+tft.drawRect(78,2,74,18,GREEN);
+}
+
+if ((count != 1) && (numNoz == 2)){ // N2 adjust
+tft.drawRect(78,2,74,18,WHITE);
+}
+
+
+if (count == 2){ 
+tft.drawRect(20,26,28,18,GREEN);
+}
+else{
+tft.drawRect(20,26,28,18,BLACK);
+}
+ 
+if (count == 3){
+tft.drawRect(53,48,20,12,GREEN);
+}
+else{
+tft.drawRect(53,48,20,12,BLACK);
+} 
+ 
+if (count == 4){
+tft.drawRect(53,63,20,12,GREEN);
+}
+else{
+tft.drawRect(53,63,20,12,BLACK);
+} 
+
+if (count == 5){
+tft.drawRect(53,78,20,12,GREEN);
+}
+else{
+tft.drawRect(53,78,20,12,BLACK);
+} 
+
+if (count == 6){
+tft.drawRect(53,93,20,12,GREEN);
+}
+else{
+tft.drawRect(53,93,20,12,BLACK);
+} 
+
+if (count == 7){
+tft.drawRect(53,108,20,12,GREEN);
+}
+else{
+tft.drawRect(53,108,20,12,BLACK);
+} 
+
+//****************************************************************************************
+ 
+servo1Pos = servo1Scale.from(n1Pos);
 
 myServo.pulsewidth_us(servo1Pos);
 
- if (mode != lastMode) {
-        if (mode==1){
-        tft.fillRect(2, 2, 30, 25, WHITE);      
-        tft.setCursor(8, 4);
-        tft.setTextColor(BLACK);
-        tft.setTextSize(3);
-        tft.printf("A");
-        lastMode = mode;
-        }
-        
-        if (mode == 0){
-        tft.fillRect(2, 2, 40,25, WHITE);      
-        tft.setCursor(4, 4);
+//********************** update display values **********************************************
+
+    
+ if (currentToolNo != lastToolNo){
+       /*
+        tft.fillRect(103, 2, 55,25, BLACK);      
+        tft.setCursor(105, 4);
+        */
+        tft.setCursor(22, 28);
         tft.setTextColor(BLACK);
-        tft.setTextSize(3);
-        tft.printf("M");
-        lastMode=mode;
-        }
-        }
-    
- if (toolNo != lastToolNo){
-        tft.fillRect(103, 2, 55,25, WHITE);      
-        tft.setCursor(105, 4);
-        tft.setTextColor(BLACK);
-        tft.setTextSize(3);
-        tft.printf("T");
-        tft.setCursor(118, 4);
-        tft.printf("%d", toolNo);
-        lastToolNo = toolNo;
+        tft.setTextSize(2);
+        tft.printf("%d", lastToolNo);      
+        tft.setTextColor(WHITE);
+        //tft.setTextSize(2);
+        // tft.printf("T");
+        tft.setCursor(22,28);
+        tft.printf("%d", currentToolNo);
+        tempLastAngle = 0;                  
+        eeprom.read(currentToolNo, &tempLastAngle);
+        lastAngle = (int)tempLastAngle;
+        lastAngle = lastAngle - 45;                       // Not storing signed int, so signed value is 45 less than what was stored to memory.
+        //RotaryEncoder knob1(D2, D3, -45, 45, lastAngle);  //  RotaryEncoder(PinName pin1_name, PinName pin2_name, int min = 0, int max = 100, int val = 50);
+        //knob1.val = lastAngle;
+        n1Pos = lastAngle;
+        eeprom.write(currentToolAddress, currentToolNo);
+        //wait(0.1);
+        lastToolNo = currentToolNo;
         }
        
     
    if (n1Pos != lastN1Pos){     
-        tft.setCursor(80, 100);
+        tft.setCursor(40, 4);
         tft.setTextColor(BLACK);
         tft.setTextSize(2);
         tft.printf("%d", lastN1Pos);
-        tft.setCursor(80, 100);
-        tft.setTextColor(WHITE);
+        tft.setCursor(40,4);
+        tft.setTextColor(GREEN);
         tft.setTextSize(2);
         tft.printf("%d", n1Pos);
+        eeprom.write(currentToolNo, n1Pos + 45);        // store new angle in eeprom, add 45 because its an unsigned value.
+        //wait(0.1); // adjusted from 1
+        dir=1;
+        device.printf("N");
+        device.printf("%d", n1Pos + 145); //send over RS485 add 145 so no negative values and always 3 digits. 1xx for N1, 2xx for nozzle 2
+       //device.printf("N245");  // TEST!!!
+       tft.setCursor(100, 50);
+         tft.setTextSize(2);
+       tft.printf("%d", n1Pos + 145);
+        //wait(0.05);
+        dir=0;
         lastN1Pos = n1Pos;
         }  
-    
-    
-}
+        
+   if (numTools != lastNumTools){     
+        tft.setCursor(55, 95);
+        tft.setTextColor(BLACK);
+        tft.setTextSize(1);
+        tft.printf("%d", lastNumTools);
+        tft.setCursor(55,95);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(1);
+        tft.printf("%d", numTools);
+        eeprom.write(numToolsAddress, numTools);        // store new angle in eeprom, add 45 because its an unsigned value.
+        //wait(0.1); // adjusted from 1
+        lastNumTools = numTools;
+        }          
 
-}
+   if (numNoz != lastNumNoz){     
+        tft.setCursor(55, 110);
+        tft.setTextColor(BLACK);
+        tft.setTextSize(1);
+        tft.printf("%d", lastNumNoz);
+        tft.setCursor(55,110);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(1);
+        tft.printf("%d", numNoz);
+        eeprom.write(numNozAddress, numNoz);        // store new angle in eeprom, add 45 because its an unsigned value.
+        //wait(0.1); // adjusted from 1
+        
+        if (numNoz == 2){
+        tft.setCursor(80, 4);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(2);
+        tft.printf("N2");
+        tft.drawRect(78,2,74,18,WHITE);
+        }
+        if (numNoz == 1){
+        tft.setCursor(80, 4);
+        tft.setTextColor(BLACK);
+        tft.setTextSize(2);
+        tft.printf("N2");
+        tft.drawRect(78,2,74,18,BLACK);        
+        }
+        lastNumNoz = numNoz;
+        }    
 
 
 
+
+   if (count != lastCount){     
+        tft.setCursor(150, 100);
+        tft.setTextColor(BLACK);
+        tft.setTextSize(1);
+        tft.printf("%d", lastCount);
+        tft.setCursor(150,100);
+        tft.setTextColor(RED);
+        tft.setTextSize(1);
+        tft.printf("%d", count);
+        lastCount = count;
+        }                 
+
+//**************************** RS485 link ***************************************
+    
+  //dir =0; // receiver enable  
+    
+if (device.readable())
+            {
+                c = device.getc();
+                if(c=='B'){
+                received = 1;   
+                } 
+}
+
+if (received == 1){
+        tft.setCursor(150, 80);
+        tft.setTextColor(WHITE);
+        tft.setTextSize(1);
+        tft.printf("1"); 
+        }
+
+
+}
+}
--- a/mbed.bld	Sun Jan 06 18:28:18 2019 +0000
+++ b/mbed.bld	Fri Feb 08 20:50:00 2019 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/e95d10626187
\ No newline at end of file
+https://os.mbed.com/users/mbed_official/code/mbed/builds/3a7713b1edbc
\ No newline at end of file