Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of g3_waterplay by
Tank.cpp
00001 /* 00002 * G3: WATERPLAY 00003 */ 00004 00005 #include "Printer.h" 00006 #include "Tank.h" 00007 #include "mbed.h" 00008 00009 Tank::Tank( 00010 Printer &printer, 00011 DRV8825 &salinitySyringe, 00012 DRV8825 &waterSyringe, 00013 Ping &pinger 00014 ): 00015 _printer(printer), 00016 _salinitySyringe(salinitySyringe), 00017 _waterSyringe(waterSyringe), 00018 _pinger(pinger), 00019 _previous_direction_salt(-1), 00020 _previous_direction_pure(-1), 00021 _position_salt(14), 00022 _position_pure(27) 00023 { 00024 } 00025 00026 bool Tank::is_proximity_ok() 00027 { 00028 int range = 0; 00029 char buffer[32]; 00030 00031 _pinger.Send(); 00032 wait(0.1); 00033 range = _pinger.Read_cm(); 00034 00035 range = range/2; 00036 sprintf( 00037 buffer, 00038 "Range in cm: %d", 00039 range 00040 ); 00041 _printer.toBoth(buffer); 00042 00043 if (range >= 12) { 00044 _printer.toBoth("Proximity ok"); 00045 return true; 00046 } 00047 return false; 00048 } 00049 00050 void Tank::add(int type, int mililiters, int direction) 00051 { 00052 for (int i = 25; i < MAX_SPEED; i+=20) { 00053 if (type == TYPE_SALT) 00054 _salinitySyringe.settings(1/MICROSTEPS_PER_STEP, direction, i); 00055 else 00056 _waterSyringe.settings(1/MICROSTEPS_PER_STEP, direction, i); 00057 } 00058 00059 //fix the changing of directions for pure 00060 if (type == TYPE_PURE) { 00061 //mililiters = mililiters * 2.0; 00062 if (_previous_direction_pure != direction) 00063 mililiters = mililiters + 1.0; 00064 } 00065 00066 //fix the changing of directions for salt 00067 if (type == TYPE_SALT) { 00068 //mililiters = mililiters * 2.0; 00069 if (_previous_direction_salt != direction) 00070 mililiters = mililiters + 1.0; 00071 //if (_previous_direction_salt == DIRECTION_PULL) 00072 //mililiters = mililiters + 0.5; 00073 } 00074 00075 //move with constant speed 00076 for (int i = 1; i < (MOVEMENT + (int)floor(((mililiters - 1.0)*STEP_EXTRA))); i+=1) { 00077 if (type == TYPE_SALT) 00078 _salinitySyringe.settings(1/MICROSTEPS_PER_STEP, direction, MAX_SPEED); 00079 else 00080 _waterSyringe.settings(1/MICROSTEPS_PER_STEP, direction, MAX_SPEED); 00081 00082 //if ((i - MOVEMENT) % STEP_EXTRA == 0 && !proximity_ok()) 00083 // break; 00084 } 00085 00086 //de-accelerate 00087 for (int i = MAX_SPEED; i > 0; i-=20) { 00088 if (type == TYPE_SALT) 00089 _salinitySyringe.settings(1/MICROSTEPS_PER_STEP, direction, i); 00090 else 00091 _waterSyringe.settings(1/MICROSTEPS_PER_STEP, direction, i); 00092 } 00093 00094 //remember previous direction 00095 if (type == TYPE_SALT) { 00096 _previous_direction_salt = direction; 00097 } else { 00098 _previous_direction_pure = direction; 00099 } 00100 } 00101 void Tank::react(double salinity) 00102 { 00103 char buffer[32]; 00104 sprintf( 00105 buffer, 00106 "salinity: %3.2F", 00107 salinity 00108 ); 00109 _printer.toBothln(buffer); 00110 00111 //this->add(TYPE_PURE, 2.0, DIRECTION_PUSH); 00112 //wait(2); 00113 //this->add(TYPE_PURE, 4.0, DIRECTION_PULL); 00114 }
Generated on Tue Jul 12 2022 21:07:58 by
1.7.2
