├── LabVIEW Basics Examples ├── LabVIEW Basics #1 - Arduino Blinking LED │ └── LabVIEW Basics #1 - Arduino Blinking LED.vi ├── LabVIEW Basics #10 - Controlling a DC motor in LabVIEW (LINX) with a L298N H-Bridge IC and Relay │ ├── DC_Motor_Control.ino │ └── Motor Control.vi ├── LabVIEW Basics #11 - Pan and Tilt Servos │ ├── LabVIEW Basics #10 - Mouse and Keyboard Control.vi │ ├── LabVIEW Basics #10 - Servo Control.vi │ ├── MapCoordinates_SUBVI.vi │ └── pan_tilt.ino ├── LabVIEW Basics #2 - Servo Control │ └── LabVIEW Basics #2 - Servo Control.vi ├── LabVIEW Basics #3 - Servo Sweep │ ├── LabVIEW Basics #3 - Servo Sweep.vi │ └── SubVIs │ │ └── Generate Array (SubVI).vi ├── LabVIEW Basics #4 - Ultrasonic Sensor DAQ │ ├── LabVIEW Basics #4 - Ultrasonic Sensor DAQ.vi │ └── SubVIs │ │ ├── Generate Array (SubVI).vi │ │ └── Theta (SubVI).vi ├── LabVIEW Basics #5+6 - Radar Sweep │ ├── Examples │ │ ├── IntensityRadarPlot_LV86.zip │ │ ├── Main_RadarPlot.vi │ │ ├── Radar (1).vi │ │ ├── Radar Plot - Sinan.vi │ │ ├── Radar.vi │ │ ├── Radar2.vi │ │ ├── Radar2_rev1.vi │ │ ├── Radar3.vi │ │ ├── Sensor HC-SR04 │ │ │ ├── HC-SR04.fzpz │ │ │ ├── HC-SR04_fritzing.png │ │ │ └── sensor HC-SR04.vi │ │ ├── Sonar_test.vi │ │ ├── gui_svi_replace_dataline_segment_in_radar_plot.vi │ │ ├── polar.vi │ │ └── wind-rotor-ratio-3.vi │ ├── LabVIEW Basics #5 - Radar Sweep.vi │ └── SubVIs │ │ ├── Generate Array (SubVI).vi │ │ ├── Plot Grid (SubVI).vi │ │ ├── Plot Line (SubVI).vi │ │ ├── Plot Point (SubVI).vi │ │ ├── Rect (SubVI).vi │ │ └── Theta (SubVI).vi ├── LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client │ ├── ESP8266 ESP-01 Schematic.SchDoc │ ├── ESP8266 ESP-01 Schematic.pdf │ ├── TCP - Client.vi │ ├── TCP_Socket │ │ └── TCP_Socket.ino │ └── __Previews │ │ └── ESP8266 ESP-01 Schematic.SchDocPreview ├── LabVIEW Basics #8 - LINX Custom Firmware │ ├── ESP8266_Wifi_DHCP_Configuration │ │ └── ESP8266_Wifi_DHCP_Configuration.ino │ ├── LINX-dev-esp8266-cfg-2.1.zip │ ├── LinxESP8266WifiListener.cpp │ └── LinxESP8266WifiListener.h ├── LabVIEW Basics #9 - LINX Doesn't Work With Virtual COM Ports (Arduino Serial Communication) │ ├── Serial_switch_LEDs │ │ └── Serial_switch_LEDs.ino │ └── Simple Serial.vi └── LabvIEW BASics #12 - Stepper Motor Control │ └── Stepper Motor Control.vi └── README.md /LabVIEW Basics Examples/LabVIEW Basics #1 - Arduino Blinking LED/LabVIEW Basics #1 - Arduino Blinking LED.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #1 - Arduino Blinking LED/LabVIEW Basics #1 - Arduino Blinking LED.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #10 - Controlling a DC motor in LabVIEW (LINX) with a L298N H-Bridge IC and Relay/DC_Motor_Control.ino: -------------------------------------------------------------------------------- 1 | // Motor A connections 2 | int enA = 9; 3 | int in1 = 8; 4 | int in2 = 7; 5 | // Motor B connections 6 | int enB = 3; 7 | int in3 = 5; 8 | int in4 = 4; 9 | 10 | void setup() { 11 | // Set all the motor control pins to outputs 12 | pinMode(enA, OUTPUT); 13 | pinMode(enB, OUTPUT); 14 | pinMode(in1, OUTPUT); 15 | pinMode(in2, OUTPUT); 16 | pinMode(in3, OUTPUT); 17 | pinMode(in4, OUTPUT); 18 | 19 | // Turn off motors - Initial state 20 | digitalWrite(in1, LOW); 21 | digitalWrite(in2, LOW); 22 | digitalWrite(in3, LOW); 23 | digitalWrite(in4, LOW); 24 | } 25 | 26 | void loop() { 27 | directionControl(); 28 | delay(1000); 29 | speedControl(); 30 | delay(1000); 31 | } 32 | 33 | // This function lets you control spinning direction of motors 34 | void directionControl() { 35 | // Set motors to maximum speed 36 | // For PWM maximum possible values are 0 to 255 37 | analogWrite(enA, 255); 38 | analogWrite(enB, 255); 39 | 40 | // Turn on motor A & B 41 | digitalWrite(in1, HIGH); 42 | digitalWrite(in2, LOW); 43 | digitalWrite(in3, HIGH); 44 | digitalWrite(in4, LOW); 45 | delay(2000); 46 | 47 | // Now change motor directions 48 | digitalWrite(in1, LOW); 49 | digitalWrite(in2, HIGH); 50 | digitalWrite(in3, LOW); 51 | digitalWrite(in4, HIGH); 52 | delay(2000); 53 | 54 | // Turn off motors 55 | digitalWrite(in1, LOW); 56 | digitalWrite(in2, LOW); 57 | digitalWrite(in3, LOW); 58 | digitalWrite(in4, LOW); 59 | } 60 | 61 | // This function lets you control speed of the motors 62 | void speedControl() { 63 | // Turn on motors 64 | digitalWrite(in1, LOW); 65 | digitalWrite(in2, HIGH); 66 | digitalWrite(in3, LOW); 67 | digitalWrite(in4, HIGH); 68 | 69 | // Accelerate from zero to maximum speed 70 | for (int i = 0; i < 256; i++) { 71 | analogWrite(enA, i); 72 | analogWrite(enB, i); 73 | delay(20); 74 | } 75 | 76 | // Decelerate from maximum speed to zero 77 | for (int i = 255; i >= 0; --i) { 78 | analogWrite(enA, i); 79 | analogWrite(enB, i); 80 | delay(20); 81 | } 82 | 83 | // Now turn off motors 84 | digitalWrite(in1, LOW); 85 | digitalWrite(in2, LOW); 86 | digitalWrite(in3, LOW); 87 | digitalWrite(in4, LOW); 88 | } 89 | -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #10 - Controlling a DC motor in LabVIEW (LINX) with a L298N H-Bridge IC and Relay/Motor Control.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #10 - Controlling a DC motor in LabVIEW (LINX) with a L298N H-Bridge IC and Relay/Motor Control.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #11 - Pan and Tilt Servos/LabVIEW Basics #10 - Mouse and Keyboard Control.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #11 - Pan and Tilt Servos/LabVIEW Basics #10 - Mouse and Keyboard Control.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #11 - Pan and Tilt Servos/LabVIEW Basics #10 - Servo Control.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #11 - Pan and Tilt Servos/LabVIEW Basics #10 - Servo Control.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #11 - Pan and Tilt Servos/MapCoordinates_SUBVI.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #11 - Pan and Tilt Servos/MapCoordinates_SUBVI.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #11 - Pan and Tilt Servos/pan_tilt.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | Servo panServo; // Create a servo object for the pan (horizontal) servo 4 | Servo tiltServo; // Create a servo object for the tilt (vertical) servo 5 | 6 | void setup() 7 | { 8 | panServo.attach(5); // Use pin 5 PWM output for horizontal servo 9 | tiltServo.attach(6); // Use pin 6 PWM output for vertical servo 10 | panServo.write(90); //Initially put the servos both 11 | tiltServo.write(90); //at 90 degress. 12 | } 13 | 14 | void loop() 15 | { 16 | // loop panServo from 1-179 degrees: 17 | for (int counter = 1; counter < 179; counter++) 18 | { 19 | // turn the pin on: 20 | panServo.write(counter); 21 | delay(50); 22 | } 23 | 24 | // loop tiltServo from 1-179 degrees: 25 | for (int counter = 1; counter < 179; counter++) 26 | { 27 | // turn the pin on: 28 | tiltServo.write(counter); 29 | delay(50); 30 | } 31 | 32 | // loop tilt+panServo from 1-179 degrees: 33 | for (int counter = 1; counter < 179; counter++) 34 | { 35 | // turn the pin on: 36 | tiltServo.write(counter); 37 | panServo.write(179-counter); 38 | delay(50); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #2 - Servo Control/LabVIEW Basics #2 - Servo Control.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #2 - Servo Control/LabVIEW Basics #2 - Servo Control.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #3 - Servo Sweep/LabVIEW Basics #3 - Servo Sweep.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #3 - Servo Sweep/LabVIEW Basics #3 - Servo Sweep.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #3 - Servo Sweep/SubVIs/Generate Array (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #3 - Servo Sweep/SubVIs/Generate Array (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #4 - Ultrasonic Sensor DAQ/LabVIEW Basics #4 - Ultrasonic Sensor DAQ.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #4 - Ultrasonic Sensor DAQ/LabVIEW Basics #4 - Ultrasonic Sensor DAQ.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #4 - Ultrasonic Sensor DAQ/SubVIs/Generate Array (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #4 - Ultrasonic Sensor DAQ/SubVIs/Generate Array (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #4 - Ultrasonic Sensor DAQ/SubVIs/Theta (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #4 - Ultrasonic Sensor DAQ/SubVIs/Theta (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/IntensityRadarPlot_LV86.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/IntensityRadarPlot_LV86.zip -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Main_RadarPlot.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Main_RadarPlot.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar (1).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar (1).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar Plot - Sinan.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar Plot - Sinan.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar2.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar2.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar2_rev1.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar2_rev1.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar3.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Radar3.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Sensor HC-SR04/HC-SR04.fzpz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Sensor HC-SR04/HC-SR04.fzpz -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Sensor HC-SR04/HC-SR04_fritzing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Sensor HC-SR04/HC-SR04_fritzing.png -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Sensor HC-SR04/sensor HC-SR04.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Sensor HC-SR04/sensor HC-SR04.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Sonar_test.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/Sonar_test.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/gui_svi_replace_dataline_segment_in_radar_plot.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/gui_svi_replace_dataline_segment_in_radar_plot.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/polar.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/polar.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/wind-rotor-ratio-3.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/Examples/wind-rotor-ratio-3.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/LabVIEW Basics #5 - Radar Sweep.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/LabVIEW Basics #5 - Radar Sweep.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Generate Array (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Generate Array (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Plot Grid (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Plot Grid (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Plot Line (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Plot Line (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Plot Point (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Plot Point (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Rect (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Rect (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Theta (SubVI).vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #5+6 - Radar Sweep/SubVIs/Theta (SubVI).vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client/ESP8266 ESP-01 Schematic.SchDoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client/ESP8266 ESP-01 Schematic.SchDoc -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client/ESP8266 ESP-01 Schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client/ESP8266 ESP-01 Schematic.pdf -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client/TCP - Client.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client/TCP - Client.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client/TCP_Socket/TCP_Socket.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * Create a TCP Server on ESP8266. 3 | * TCP Socket Server Send Receive Demo 4 | * 5 | * Written by SIN Consulting 2019 6 | */ 7 | 8 | #include 9 | 10 | int port = 8888; // Define port number 11 | WiFiServer server(port); // Creates a server that listens for incoming connections on the specified port 12 | 13 | //Server connect to WiFi Network 14 | const char *ssid = "Sinan"; // WIFI SSID 15 | const char *password = "0431186166aA"; // WIFI Password 16 | 17 | int count=0; 18 | 19 | //===================================================================================================================================== 20 | 21 | void setup() 22 | { 23 | Serial.begin(115200); // Opens serial port, then sets data rate (bps) 24 | 25 | WiFi.mode(WIFI_STA); // Set ESP8266 to Station (STA) mode 26 | WiFi.begin(ssid, password); // Connect to WiFi 27 | 28 | // Wait for connection 29 | Serial.println("Connecting to Wifi"); 30 | while (WiFi.status() != WL_CONNECTED) // While not connected, print ... to serial monitor 31 | { 32 | delay(500); 33 | Serial.print("....."); 34 | delay(500); 35 | } 36 | 37 | // Once connected, print to serial monitor WiFi details 38 | Serial.println(""); 39 | Serial.print("Connected to "); 40 | Serial.println(ssid); 41 | 42 | Serial.print("IP address: "); 43 | Serial.println(WiFi.localIP()); 44 | 45 | // Start listening for clients 46 | server.begin(); 47 | Serial.print("Open Telnet and connect to IP:"); 48 | Serial.print(WiFi.localIP()); 49 | Serial.print(" on port "); 50 | Serial.println(port); 51 | } 52 | 53 | //===================================================================================================================================== 54 | 55 | void loop() 56 | { 57 | // listen for incoming clients 58 | WiFiClient client = server.available(); 59 | 60 | if (client) { 61 | //Client handling code 62 | if(client.connected()) 63 | { 64 | Serial.println("Client Connected"); 65 | } 66 | 67 | while(client.connected()){ 68 | while(client.available()>0) 69 | { 70 | // read data from the connected client 71 | char client_message = client.read(); 72 | Serial.write(client_message); 73 | } 74 | 75 | delay(10); //small delay between polling 76 | 77 | //send data to the connected client 78 | while(Serial.available()>0) 79 | { 80 | char server_message = Serial.read(); 81 | client.write(server_message); 82 | } 83 | } 84 | 85 | //close the connection to the client 86 | client.stop(); 87 | Serial.println("Client disconnected"); 88 | 89 | } 90 | } 91 | //=================================================================================================================================== 92 | -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #7 - ESP8266 TCP Socket + LabVIEW TCP Client/__Previews/ESP8266 ESP-01 Schematic.SchDocPreview: -------------------------------------------------------------------------------- 1 | [Preview] 2 | LargeImageOriginalSize=666000 3 | LargeImageWidth=500 4 | LargeImageHeight=333 5 | LargeImage=789CEDDDD9771CD781DFF1FB07E46D9E9287D827798C27B295285E3423F821339387CCF84C269963C723895AA85DD64ED332DCD4CCD8A3D51AD9A62C2AA645DAA12C5AA67659122180CD0D24008200419020F6C6BEAF24408A43E730F5BBC46D169ADD400368A0FAA2BE3CE773BAABFA56DD5B5560FDFAD6D65BB66C315B000080B792C9A4294D6C319FFDE13262846D1E2FDADE6CF378617BC78F329DED1E3F6CF37821CFE387ED1D3FE4793CB1CDE3853C8F1FB677FC90E7F1C4368F17F23C7ED8DEF1439EC713DB3C5EC8F3F8617BC70F791E4F6CF37821CFE387ED1D3FE4793CB1CDE3853C8F1FB677FC90E7F1C4368F17F23C7ED8DEF1936F9EDF545292DE2700C06A603F535C7E1C78E6A187CDE64D9B236FCB523DFBE043E6D9226847A1E8FF46A1F23C9F3200B0126E3F53B1FF9099F9EC923979BAD93A5A536BDA533D6674F2ECBCF2A33DFD66A8ADC3CCCC5CB066CF5F34A3DD7DA6B7A1D14C0E8D9A54558DE9A96B3023C1B4DDB5F5A63F98975EDD67832DEDA6FD60A5D577F294E9AD3F694EEE79DB0E9F0FEAEF098647BB7AED672DE5FBEC784DA3F9B5056D1CEEE80A5E0F9A8160BE32D8DC66CE4E9D335D417BCF9D9D357D8D4DB67ECDA775DF7E3B7F8DD374F67D305FCDB3F744A369DE5B9E9EB76B4FAAEA986DE7D4F8946DB3A61908EA989E98B6C39A8FD683CAAB1E8D5799D31F7E64865AAFAC172D6FAAFA982D1F2EA776761F3F11B4ADC12EABE6A36572F353BDFDA79ACC4867777A1D6A9CDAA56570EB71B1BAF5BA50DD6E5BAAEEEE6375761D741C3A92DE3EA9A335F6FD707BCACECFB56F7C60D8CE47D30D34B5CCDB765A9703675AED34FA7BD0B6D136717F07AE3D9A87962F57BBDDDF46AE766B7A7D96ABDDDA3E1A76EDD6F058F037DB13CC436DD6B891AE1E33353A61DBE4EA19EB1DB0DBDE6D8FB1BE41F3C6E39BAED41FCC4BF3B7DB618E9BD7130F3C409E03280A6E3F73F868B5190AF671FDC13EAE2DD8DFB604FBE5BA86536632C8C870F9DE609CF6BBCA23E5A7F68BD341F60DB575DA57ED6F27948341B9EEE3F5761F7F767AC64C07DF0BF4D9E4C8F895FD7990A7FA6EA071FD4DCD765865B4DFD6FC9505CD7B3FBD325EB9A5F9CDEDF3355EB9A1FDB1EA551B34ACF9B8B6689FDE963C10ECBB7BED3E596DD23EDA664DD02695ED3F75263D6FBD577B54876DE7F0986D8FFD4E1264AC965DF351B6EBBDC6AB1EBD57F9AE63C7837D7E5BFA3BC9C4E0889D87CA2933D46E8D6F3F5469B363229846D37606EB5D39A48CD07C6CDD415BF5AA76697DE933FBBD656E3DAEB46EB72D55B7BE1BD93C0BD68DDB3EAA5FAFCA42D5E9CA6ADDAA7E6599DBD66A575790AD5A7F93C3A3B61DAA5BDB58DBA4EFE4E979EDD6BC545FAE76AB8CEACAD56ED5AB32B9DA3D31B7EE5CBBD506B525555D6BC787FF96352F574FE7912AFBB9DB1EFA3B7CF97FFDAD6D5BFFE933F6EFC87EC79A7B75F3DAFCF0C3E43980A2E0F633C9A04FD419E4D9B4F232C88AB341BF5B32CB6B1FAA4CD43E5B79EE725AF9A2F1B373D3B857ED0FF55EE5F4AA6171DF09F4AA727A551965B3E6A37E9BDEBBCF35ADFA6DE1F1A28C75C70934BDF6E9FA2EA0CC51B9707BDC34AE4DAE8F1C6ED778900F6E5EA24C53CEABDC78FF90CD07BDEFAA399ECE54CD53EF35BDD68F324EEB4619A7729D955576BCFA94EA032ACBB58C9AD61E1708FADEAE4D6E7E6E58B48CE2DAB558DD43ED9D0BD6EDEAD167CA26379FF07AC8DC8E1D9547EDBA08AF73B76DB4AC6E5DEAD57DCF0ACFC3B5DBFD1DE56AB7CAA8AE5CEDB6C74C1A1A176CB7A3CFEDF1027D6F0CB69D6BAFA3BF0F578FBEE3A98CDB1E7D8DA7CDAF1E7DDC2E5BC7E123767EFA4EE15EDDBC9EB9F34EF21C4051E0FC39901DE7CF01F8C4ED674E05FDA3CEA0CFD813F483D43F6FEFEAB5FDF56CE7D075CCD11D6B77FDDEF1B9FE93FA703AEEEAFA71034DCDF6BDEBE36A5AF5A3747E7A364BFF3F6C2C985EEDE90EFACC67827E794730EDA9A01FD512D431A87E7CA85DEAB7A93E77BCC0B54BF5BA3E9CCEE5BA630A6E3A77FC5CC769350F0DBB75A2FA7B8379E9DC83EA1F1E9BB4EB43F5AB4D5A470BB5BDBDAB27BD0C85DE5E2B555691B479A557C9FC4CF5E89FFBBE17F5DF6994FF3716429E0328166E3F53AD73D341CEBEF7E147E6C4A9263B5C5D5B67F333F31CBA3B4E3A15E49BCE8FBA73D6FACCE6E5C4B41DA7323ABFD979A4FACAF9F52047F5AABCED387C74DEF1D76C868379E8BB45534BBBD97FA8D2541D3B6E5F6B75AD9BBE3784DAA52CD7757AAADFB5C5D5AB7303FA9ED1F0E69E2BE74A8F56A7A7D37B773CB6B3F2A83DEFEED689CE3D94270F989AE327ECF5826782F96B7DA8FEE4C1C3761DD9650C9D93766AEB1BCCC9E0BB4C4F30DFE6B9F688EA59EC7B4C3EDB6BA5DB3CB3EFE9323D9CF385ACD347E439009FB8FD8CCE9FAB0FAA6BE2A674BD7190C3EA5B663B87AE6C548EE93AADB1DEFE79D77DAB0FAC73911AA7F73AF7A8FEBABB1E58E544E7C1759D52AE768D04DF094E3436996490DFCA557DD7505BDC6B66F9F0B96DD79670BDA2AC56BB5B4259E5CE97B61F386C87754DBC5B27EA577774F799E3271A4D7FF09D40E3DC75055A375A47FAFEA0EF0DD996C195AD9EBB0E4C748DDBC4D0C88AB7D74AB779B6F964EBABBBF13A3611F5DFEA5A23CF01F884F3E7D9CF9B46DD8685DAB6D26DBE509E47FDF7584CC873003E896A3F53CCFBB7F5DEB65C798EA5AF6BF21C40B120CFE3D736CD43FFC2C3D93CB1E9BBB69CDE2FB5EFEEAEA92BF4B2AFE53104F21C804FC8F378B5ED776FBD93BEE66DB1B2BA6E21F31CC452DAB91A79BE96DB863C07E013B79FD17D59BDEEDEB0B60E7BAF9ABB2F2C7CFD596B9005AFCD65417930AD86CB97B1AF72F5EABA32513DBABF2B15D4EBEE4DD3F5E10323E3B62DF6FEAF548FFD2CF3FEB9D55A27BA26CF5E1317B445EB6242CF931D1AB16D519BC2EB4C6D5759B56F3CF87CB5DAB8DC5CC8EC2F2FA7AFFBF1DE4FCD8D37DE98D774E47961B61B00E4CBED674E37B7DAFBB2746F98F2FC70554DFABEB099B9677F39CA6F65BA7B7D6D19D768B97A754F9AAEFFD67D60BAAFEB74735BFADEB44FCAF7D9717A9EBCDAA2329FEEDB6FF352D3B6AED2B1D770DBDE7AF77D9BCDAEFE63750DF699B87A5F73BCDEAE9F8AFD07ED770F7DA6FBDAF4FD47F7D2AD46FB96930BB98E7DE7D347CF96DD8F3CFA9879E7BD0FB2D6E1CA172A7BC3C705C87300C8CDED671A837CEAEE1FB2C758955FBA672DDB7D61E2FAE4EE7525FD73F56F0F1FADB1F785A9CEA98C7BD394E7EEFB841BA7F7AAF32963965577BE6D536EEB77699A5ADB6DDD6ADBF49C701BC3F7D04D879E29BA1AED5B4E2EE4EA8BE733AF5CD3B99C75F7AA8733D7BDEAB845E6BDECAEAC2B97EB5E82F03C1FFCCE43F3962333D7DDF983CCCF175388754D9E032816CBDDCF84FB9ECBE9871662FFB6DAFDF3626CDF72FBE7B9FAE20BCD2FD7BDE8D99E3793D987CE3CB6EFA6CDF7987FE63C33DB1ABE57DE2D5BA1AFC123CF01F884EBE1E2D1B6CCE3E1E1E3E2D319BF53E2FCD99FFFC535752F567FAEFEEF4A8E9567CB7359ED67D192E7007C52CCCF4EC1B50AF13C994C995913EECFEBBD8E9BE79B47B9F23CDC9FD6F7870F7EFF71DED7E3E5FA2E90EB7976F9CC2FDF6BFA162B439E032816EC67FC5288ED952B6FC39F2FF73EEF5C791E96EDDCBB2B9F6DDAF0B870F9F03107275C7FE6F8F0F4F97C2F22CF01F884FD8C5F562BCF33F36EA5F35E681E99D7C087CB673B86AEEBE132F33E7CBC227338739CEA73CFCF097F9728C4BA26CF01140BF6330BAD9B645AD46D29E4F65AE8F875AE9C5BCAB1F17BEFBBDFDE1B90AB8CEA70CF9D0BB727DCE70E97FFC637BE31AFAC6B8F3CFFE37F9ED70F0FB735B3DFFFF2CF5F99D76F2FC4BA26CF01140BB79FD1FE57F750EB5EEFCAAA63F655F76AE9192EE1F23795EC48675C59452A3DECDEEB35B30E8D73655CB96C9F4B787E57DA77B5AE6CF52ED4A67099F0E7AECEF07499F371CB125EA6703927D7FC577B7BAD741E0B9D33CFA7FC52E69D29DC7F0E4FE3EA5FE878BB1B7EFAD9E7176D4BE67D72ABB1AEC97300C5C2ED67DC6F8D2BD7F57C97B6CE6ED31664795DC3A92CD324E70D9755A4D2397653C98EF4B0CAB9D7F07499D38787C3D33AE161F75EF5B8BADC7837AF6CF5668ECBAC3B5C26B3EDE132D9964BEDC835FFD5DA5E2B91EDBEB1709667E6E752AEC1CB27CFB35D6BBF50F62EE5FBC45AAF6BF21C40B170FB193D13AEBEF174FADEA5C191F19CCF93B9A964C7BCEC93ABF34B5E33CE8D17F73EF3B3F0B0A675F309CF2F73DEE1F7EE33D7B6CCF62CD4AECCF6E5AAD7BD86CBE76ADB6A6FAF95CABCAE2C575D4BBD366E35B2973C0780C52D673F7353C9D5E3D9651557FBCBE1CF347E7E3DC9ACD999F979E6F8E5C8AC3B9F65C9D6E66254ECB9F0B9CF7DCE0C8F4D167C99C973005818FB19BF14FBF65A8DDF335DEE7DE66BB1AEC97300C56229CFBB06E2249FEB06C87300008A5B3E194C9E030050DCC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FF9E6F94D2525B6EC62A25E1E0000E2289F8CA67F0E004071E3783B0000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C07502C2687464D4F5D83999E983663BD03265575CCB4ED3F643F1B6AEBB49F9D9D3A67BA6BEBCD604BBBE93B792A6D66E6822DD77EB0D28C0F0C9BA9B14933D0D4627AEA4F9AFEA6663BDD48578FE90D86079ADBECB8D9F317235F66A050C87300C5627A7CCA66B6B2B9F34895CDE5CEA3D52675B4C6E6F4998FF79AF39F5D32FDA7CF04D9DC6BCBBA57370F95D77C2686464C574DAD99181C31ADFBF69B91548FFD5CDF05FA4F35D9EF07512F2F5048E439806271EEECACED37AB7F3E1564F2E4C8B8196AEDB0C3D39367CDD4E884ED530F7774D9F21A177E95E1F694FD5CE52682EF039A87FAE3EE73F5D3558FE619F5F20285449E032816A589A4F9E63AA0E5887A5D227EC87300C5A2349134EF06AF3E79BDE2E035E3B41C51AF4BC40F790E2C4D59452AF236AC57A509FFF2FC17891F59E439A2469E034B539A4846DE86F54AEB369C8B7B0686CD9ECF2E995D9DDD66F7CC8579EFA3CE71F21CC5863C0796A634919C677B6287290FFEF6315F6B45D2EE1396E2A6925BAF667990DD3BAB8F99DD3DFD66675B87CDF0F0FBA8739C3C47B121CFB15E9455A4D6A49ED24432F2652D36E505FABFAF75EB327177E369B37D70C46CAD3B91EE9B87DF479DE3E4398A0D790EDF9555A4E6F59735BC9AF5A98EA89739D7B2472511F4AB0BB1FE35BDCBC45D1D5D36B7F70C8F9AED43A366D7F894D973FE62FA7DD4394E9EA3D890E7F0595945F63CD3F8A8DBB616BEBE25699EBA7C397AC13EC2BDDF904C2D7BFD6BDB459DCFE4397C459EC35765158BF74DA36EE36ACBCCF34DA3B3E68ECA1EF3C4F08CD93C79C13CD03266EE3939641E681E354F9EBB68EE3E3E60EE0D861F6C1BB7E37E70F10F76BADB0E759BFB1A87CDFDA747CCC35D9366C3812E3B4EEF35AFA5E4B9CBF4D2C48E159D3FDFB6FF90D97DA2D1F6C5B7067DF5ADFB0E98979ADBCCAEBA06B3ABFE6441B258F79AB93C5EAE9F94FC37F21C45813CC77A519A4846DE86B59699E79BA72E988DD57DF6F589911973576DBF7DDDB03F651EE9993277D70F5AF7378D98873A27D2D3699ADB0FF798075BC7CDADFB5236FBEF09CA955EB864EE6D185A569E9755A496B50D5D266E3F5A6DB61D3C6CDF3F55BECFEC9A3A6776EA387B5BA7D95E5553903C7FDAFCAB15E7B964DE831EC7BF45448F3CC77A519A4846DE86B5F6F9921D36D39D1B3795992F6E78C77CF1B677CD9F3E596E6EB8EF43F3E5EF7C64FEF8DB6FA5CB7CEDB1BDB6DC571EF9243DEEBA9BDFB6E5BEFAE85E73C3BD1FDAE934EEFA8DEFCF9B7F2E1B827E7578B8AC22B5EC6DE83271676B87D939327EE5FAB78161B33DB0AD6FD08EDF35315DB03C5F8D63F071FC5B44F4C873AC17A58964E46D88ABD5B8BE7D2D90E7584FC873AC17A58964E46D88ABD5C8F39DCD6DB65FAE3EBAFAE6BBCFCEDA63EE1A479E03D722CFB15EE8FAABA8DB1057D9F2BC6C85CF93D1F973FB3C99990B6657F2803DC6EECE9F172A77752D9B327DA5B81E0EC5803CC77AC1DF5F7456A37FBEED60A5D95AD760FBE3DBBAFBCCF6DE01B3ADB1C9EC3E54B9A6C7E417C3FD6A2816E439D60BFEFEA2E3EBF973F21CEB09798EF582BFBFE8AC469EA7AF69EFE9B7EFEDFD6AAD1D66CFD088D9DD376887F519790E5C419E63BDD0F9DAA8DBB012DB1739B7FC69E052E0629ECB7969AEFC62E7ACB717E0B7575E2B29B966DC62CBB3E8F9F3C347CCAEC9B3F618FB9ECA2AB3AD77C0ECACAD37DB8F54D9CF5FD8FA737B2E5D65969BC59C3FC77A429EC377F7057F77DFDC72D57D9EFE1DE6D3C75D4A9EAB5CBE65D7A2EDF9284D5CED9F6F4DF5989DA313F655CF8ADBDEDC6A76D61C0F5EDB6CB6EF095EB737B5ACA86FCDF5ED584FC873F8EC0B41BFF0DDCB972D65F90F9349FBDE65FAF9CF2E9954F5313335366906827D7F4FFD49D3166443EF894633DC9132436D1D6666E642E4CB2185CA449FDB5E9A48AE4ABE92E78803F21CBED2F17597DF99345E9F8FF6F4DB0C5766B7250F9891A0AFD779B4DA667C574DADCDFBA897C3592C13D5D776C7D097622DFAE86B95E7BA774DF7AC15EAF752C973AC27E4397CA5BFB76C59EEE8F3AE9AE3E6DCD9599BE9A3DD7D419FBCCBB41FAC343D750D667A62DA8E9B1C1E8B7C59643999A8BCBE6C4CDAA588FE0FAE469EEF0EBE8B29BB75DFB97DAE8C7E8B65EE39AF6E9C5E777576DBDF545D6E9EF3FC76AC17E4397CA5E3EB8BE579D46D5C8AE56462669F3DEAF617F47AB8B9EBDE6CA607DFBFECF365E67EF7DCF6D1E7AE91B3BFCF325776A9F87D35AC27E4397C954FFF7C7268D49C9D3A67FBE2EEBDA61D0FFA7651B73F93CFE7CF0BB74DAFF6CF5FD2EFB1CC5D0FE77E536DFBD0957EB85E758DDCB6D3CD66674DED8AAF8B5B09EE5743B120CFE1ABF0F973BD665E1BA732CA6F5DF396F95EE7CF95EF512F43D86279AEEF207D274FD973FE03418EF5D69F34ADC903A6BBB6DE9E43D067512FC34A952692916432798EF5803C87CF94E9EEB8BB325D34ECEE451FEF1F32C3EDA979EFD5571F6C6E3343ED9D91B73F6CB13C9F1E9F329D9555662AE8B38E7476DB7C1F0AFAAD67A7674CC7E123F6DABFA89761A54A1357F37CB1E7C9EC1C9B34BB9B9AC973600E798EF5E0CAB9D712AF9F29B3589EEBF8427F905FCAEDC991F1799F15E3F903B75D56EB7932F6387B90EB2BC9E2423C4B46B81E0EC5803CC77AE1FBDF1FE7CF97F63C195DFFBE2DC8FC95E6F96AF4D9B51C51AF4BC40F798EF5C2F7BFBFE5E4795945CA664731519B96BF0DAFE6B97EEF5C79AEE3EABA574DC3CA701D77D7F5707BCE5F343B3BBAC873600E798EF5C2F7BFBFE5E4F9D7B724CD53972F17950DC9D4B233BD34915C957C25CF1107E439D60BDFFFFE0A91E79B4667CD1D953DE689E119B379F28279A065CCDC7372C83CD03C6A9E3C77D1DC7D7CC0DC1B0C3FD8366EC7FDE0E21FD2D369F8FBB3FF621EEE9A341B0E7499DB0E75DBF79AD77232BD34B16365E7CFD5076F6AB6FDF2AD413F7CEBBE03E6253D53A6AEC1ECAA3F59B03CE77932582FC873AC17A589A4D7F51622CF374F5D301BABFBECEB132333E6AEDA7EFBBA617FCA3CD23365EEAE1FB4EE6F1A310F754ECC9BCE0DDFBA2F65B3FF9EA05CE9854BE6DE86A135EBA36B5DBA4CB4CF8E69EBB4EF9F2ADF77E5FAF6B971BA17BD1079CEF364B09E90E7582F4A13C935AFB3AC2215699E7FBE6487CD74E7C64D65E68B1BDE315FBCED5DF3A74F969B1BEEFBD07CF93B1F993FFEF65BE9325F7B6CAF2DF795473E498FBBEE9677CC7FF8DBDF99EBEF7CDFDC70EF8776BAEB6E7EDB5CBFF1FD79F3CF97D6CB72B7613ACFDB3ACCEEC6D3F699EDE97BD7749F5A6B47FAB9AFC580FBD5502CC873AC17A589E49AD6575671F55AB442CC8FEBDB799E0CB012E4397C57567125576F2AD951D07CCDA7CE5CB627765CF33CF3C5BC5652B2E4698AD9F6259E3BCF3C7FBEEBD8717BAFDA4BB5F5F6FEB4ADC74F9817CEB4E67DFEBC10C7D239DE0E9F90E7C0D29555CCCFF3A8DBB35E685DBA4C548EEB9EB4AD9DDD66F3DBEFD973E72F05EFF33D7FBE5679CEF5702816E439B03CA509F27C35D6A9CBC4F4F3643ABACC53476BCCB6EE3EF34C6353E4BFBF920FFE261005F21C58BED204795EE8F519751693E7F015790E2C5F5945E1AE6F07790EAC44BE79AEDFBAC8E77A96A89707586B6515A9C8DBB05E685D962696FFACD962A1E5887A5D227EF2C968FAE7000014378EB70300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C80CF6E4924CDD7B7149FB28A54E4EB06F1429E03F099B2F3A9CB97D39E3C77D13CD23D65364F7F669E189EB11E6C1B4F7F5E7AE19279B4FFAC7DFF68EFB47D0D97DD3C75C1CEE3BE53C376BA47FBA6E7CD3F5F1B9229321D6B8A3C07E0B3CC3CDF343A6BEE6D18B219FDD8C059B3F158BFB9ED50773AEBEF3E3E60B3FA0717FF60EE6B1CB6E395E37756F5DA61E5F9C35D9366C3812E3B9DDEEBF3E5647A22B1C39407FBC585B45624235F87581FC873003ECBCC73E5B1F25CFD7065B4B27863759FD958D3671EE9993277D70F9A873A27ECE77A75D3DC76B0CBDC7EB8C70EDFBA2F65B3FF9EA0ACCA697EABD53F2F67BF890221CF01F8ECF3253BE69DB7BE715399F9C2B7F698AF3CF289F9CAC39F982F7FE72373DDCD6FDB6157E686FB3EB4AF6EDCD71EDB6BCBA8EC9F6CFED4DC70EF87B68CC65DBFF1FD553D7F4E9EA350C87300880E798E4221CF01203AE4390A853C0780E8E493E75F28D961BEB9259937958F7AB9B0F6C87300884E3E79AE8C7EF7F2E5BCA97CD4CB85B5479E034074C873140A790E00D1596A9EBF71EE9CD9393C6C7E3B3B6BDFFFF4D429F34A5B9BF9655F9FF9F5E828791E63E4390044E7969212BBEF5C4838CF5F9F9A32AF7676DAF7CF1C396233FCC5FA7AF3D6A54BE6B9AA2AF23CC6C87300286EE13CFF59539379A6B2D2BC79E18279B1AECE6C0BB2FDE960785B478779B9A5853C8F31F21C80CF4A13C9A254C865E4FC39F2419E03F059217E8F451EEA98B065BF3FFB2F05F93D16FDEE5BA196319CE73A57AEF3E73AEECEF9738491E7007CB6D0F3DB1F6C1D33F79C18B4CF6F57862BAFFFEE9376FBDCF6EF9DFD2CFDFC76B967EEB9EE7A7FC7911EFBBB2E1A97B8F4FFCC5DB5FDCBCBF492857F8B45CA2A924B3A7FFE5C75B579E1D831CE9FE31AE439009F65E6F97727CEDBDF6151FF5C79FEF8D0397347658FB9BF69C466B43CD03266CBEAB7D3DCEFA5DE5AD169CBE97BC0DD750336DB35AC7EBBE6592CFD739D2B7FA9A181F3E7B806790EC067CACDE5FC5ECA6A2A64960BE7CF910FF21C80CFCA2A52915FFB96496D2AE43292E7C807790E00C58DE7B7231FE4390000FE23CF01A0784D8D4D9A81A616D3595965BA6A6A4D776DBD1938DD6CBA8FD5998E4347EC7B954B551D33ADFB0E98DEFA936666E682D5DBD068268746CD58EF80FDBC27F8ACA7AEC1741F3F11F972A1F0C87300285E13432336C727825C1E6E4F05595C6F5FC70786CD58DFA019E9ECB6E594F383CD6D66A4ABD70E4F8F4F99A1B64EFBDA79A4CA969F181CB1E534BFA8970B85479E0340F19A3D7FD14C0459AC5737EEFC67972CBD9F1C19CF3ADDF4C4B4991A9DB0DF03A6824C573919EDEE33E7CECE46BE5C283CF21C0000FF91E70000F88F3C07E0B3B28AF57FFF39900FF21C80CF8AF1F758362453643AD61C790EC067C5FA7B2CCAF4ED891D8BFE1E4B6B4532F27588F5813C07E0B362FD3D967CFBE8E5EC375120E439009F7DBE6447E4BFBF924D59452AAFF693E72814F21C00A2439EA350C87300880E798E4221CF01203AF9E439BFAF867C90E700109D7CF29CDF3F473EC87300880E798E4221CF01203A4BCDF337CE9D333B8787CD6F6767EDFB9F9E3A655E696B33BFECEB33BF1E1D25CF638C3C0780E86C4F5CD9BF2E249CE7AF4F4D99573B3BEDFB678E1CB119FE627DBD79EBD225F35C5515791E63E4390014B7709EFFACA9C93C535969DEBC70C1BC585767B605D9FE7430BCADA3C3BCDCD2429EC718790EC067A589E87F7F259B422E23E7CF910FF21C80CF0AF17B2CE1B27AFEFB4A7F8F456E49240BB68CE13CD7B9729D3FD77177CE9F238C3C07E0B342FC1E8BA6F9D6FBCDE6AE63FD05FB3D1649E4F17B2C6515C9259D3F7FAEBADABC70EC18E7CF710DF21C80CF16CA73FD2E8B325C79BEB1A6CF3CD23365EE9EFB1D357D1ECEF3DB0E7699DB0FF7D8E15BF7A56C1F5D79AE729A5F31E5F9D3870FDBF7FFB86F9FEDA32BCF753EFDF99A1AF23CC6C873003ECBCC73FD7EF903CDA3F618BA72FABBE3E7ED6FA469D89551C6BBE3ECEE18BDFD1DB5A0ACF2DB1D7BD738776CBE588EB7EBBAB7FF3B3E6EF35BC7DD7F15D0B8D7FAFBCD6FA6A7C9F31823CF01F8AC3411FDB56FD9147219B91E0EF920CF01A0B891E7C807790E00C5AD3411EDF101F8813C0780E235353A61C67AFA4D4BF93ED3595965DA0F569A54558D196E4FD9E1F1FE213B4EFA4E9EB29FF59F6AB2D3F636349AC9A15133DADD67C67A07CCC09956D3D7D86446BB7A6DD9A8970D85459E0340714B551D33134323667C60D8667257CD7133D6376873FAECD43933D2D96D7A4F349AD120F75546345D776DBD7DD5E78D6FBF67863BBA4CDBFE836666E642308FDAC8970B85459E03407153569FFFEC927DAF570D2B9345C3E2DECF9EBF989EAEF348951DEE6D08FAED476BCCD9E91933D0D462BF070CB57644BE5C282CF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E00CB57F5CAABF677554EBDFB8139F3C9A791B707F1459E03F3B55624E7FDFED5586FBF1DA77B776B77FEDA8CA47AD265F4EAA6D3788DD3FE5DCF00A97FE3B7E979E85E2237ACD7F0B0EE19CE5577DDAEDFD8F1673EDE6BDFAB0E0DBBCFB3B55FF72C85E71D9E67B8BDA27B976BB6BF66DBACE792B87BA22687476D79DDC71C9ED6BDBACF5D3D6EBEE1326AABD657F8FE2947CF3B5139DD579DADCD99752ED40677AFB5EA72F569B91ADEDC63D79B2BAFF9AA0E69DEFBE935F3CBB60DBA8F9FB8669C964BCF62D17A531B7EFE1FAF334F19635EFCB79F33AF7CE9FA79F30B97557BB22D47AEED082C15790ECCA77DACF6CFDACF7EFCF826FBDC0DBD3FFDE147E677FFFBDB66FFD3CFA6CB8473A0ECFBA5E6C3071F32875E7CC954BFFA0B53F9939FD932D25C5661F6FCDDCDE6A3471FB3AFDABFBBE14FBEFBBD7975BF565262A9CE8ABFFF473BFE8DBFF99FA66ADBFFB175EBFB852B93ADFDDDB575F3E6AD796EBFF14FACCC3CAFF9C52FCDC1175E3447B6BE6CCA9EFCBE9D56E3AB5ED96697A5FDC0E179ED71CBEC3EDFF70F3F9CB71EC2EBE5E0F32F9803CF3E67BF0785EB54FE267FF84F767E8DEFBC67A627A6D36D7EEFAE7B6C9BC375BAF7129E7FB88D9AE76FFEFA7FA4EB3BF5DE07E6EDDBEF30D5C1F2B9F29AAFEA90433FFEE7F4F8CCED18DEFE5ABEA1B6CEF438B5E1E3C79F302DC1F6547E2BCFDFBBFB1E5B56DB54C2F30B97559E672E977B8DFA6F1EEB03790E5C4BFB64F75E7D69ED77D5E77BEF9E7BCD0BFFFADF5C5346B6FDA7FF6C5F952DAE4CF3DE72FBFAEEC6BBD2FD30978B6E38733EE1BEB7EAD6ABB2D9CDD71DDF0DF7EB32FB7B99F3CED69FEFAD3F1964DE9DE9E95D5E69F8D93FFAA3ACBFD5EDE617FE3CB3FDE132D9FAE66FFCF5DF9891AEDEF4B0EB6787DB9CADEECC650AB7A1F2273F357B373F99AE2F5BF9CCF986C7E7DAFE5AE7BBFEF2AFE64DAFBA34DE9579F7AEBB4DF29F9EB6DF5FD41F0FCF2FB3EC42CB05AC14790E5C4BFB5FF5CDDDBE5639B177F3F7CCFBF73F603A2A8FA6CBE873F5F774FCB6F348B5D9F95FFFCCF6C5EA5E7FC396D17780A32FFF3C7DDC57C3CAE65DFFFD2FD3C3CAA570DDAECFF6EA0DFF253D4ECFF7D4BC55B7DAE2CA685EEFDCB9F19AE9F3C9F385B2446D1AEF1B4C67A6EAD1ABFB9E12FE5C75E879E0EAC786EBFCC557BF6A9F43D67BE2E435EB36B33EE59EFDCE92A54EF7FD45C35A5FD9DAA0F5FBC9A6CDE9FA72E5BFE621AA4FE3C3F3CBD5C6CCEF03EA676B79DD767BE9DFFD7BFBDC35BDEA787F787D649675CB21C91F3D9D6E4BD47FEF581FC873E05ADA279F3B3B9B3E6EAA4C79FBB6DBED795E65B72BA357971DDA9FB794276D7FEC577FFE17A6FB78BD3D96AC7C573FFBFDFBEE4F9F73568EB8E1F0F9F3F0FC4E7FF0FBF438658EFA7EAA3B571F3C73FA6C6D0C970BF7CFA5E9F71FA797D79DC376E7CF75FC5AE7EF3B0E1F99F7B93BE7ADEF1BEEB8B4AB47D32AABD4FF0ED7BBE7E65BD2E7BCB55E344DB6F3E7AE4EAD2B37ACFA33DBE0E6A5E95D7D9F96FE207D3CDBB527DBF9F3F0FC32B7BF5B069DEB081FFFE86F6A9EB7DD74FE23B3BFEDD647B8AC9B8796A3B9ACDC0EAB2DEE9A0560A5C87360BEF0F9D3DF3FFC48FA1AA8DF05FDF0964F2BCC9BDFFAF6BC32EA9FEBFCEF95F3C5CF5FE9576EF97B7372CFDB3687933FFC919DAF72A676C7AF4CFD6F76A7AFE7D2F0E1977E3AAFEEF039D657BEF4253B5EF3D0B960D51D3EA79C79FE5D32CF9F2B5794A1D9FAE2475FD966DBAC6B035EFFAB6F14E4D86FD993A50B7EAE8CAC78EA1F6CF6EA9AF0D538DEAC8C6C4B1ECCAB3D0B6DFFF2C453E9E30E9A8FB67FD47F9F402EE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F05FBE797E5349892DBB98A89707008038CA27A3E99F030050DC38DE0E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F01F790E0080FFC8730000FC479E0300E03FF21C0000FF91E70000F88F3C0700C07FE4390000FE23CF0100F05F21F3FCA692125B0E0000AC2D6570A1F21CEB0BDB3C5EDC3E21EA76606DB779D46DC0DA22CFE3896D1E2FE479FCB0BDE3873C8F27B679BC90E7F1C3F68E1FF23C9ED8E6F1429EC70FDB3B7EC8F378629BC70B791E3F6CEFF821CFE3896D1E2FE479FCB0BDE3873C8F27B679BC90E7F1C3F68E1FF23C9ED8E6F1429EC70FDB3B7E94E73C2B267ED8E6F1A2EDCD368F97CCED5D9E21EAF6A1F094E7FF1F0DEA8D00 6 | MediumImageOriginalSize=167000 7 | MediumImageWidth=250 8 | MediumImageHeight=167 9 | MediumImage=789CED9DF95B5BD799C7DFFFA07F52DB99DF3B3F74A6B69B269DE7E9D366C7595A37C93876A66D3A4FC7A17492D44D6C0C8E313B02B16F06129C946083318BD0C222362D0809897D73EA39EF81A30A212461AEB870F4FDE1F3DCEDACE27EEE7BEE4A7E4121B57774651DF959DCEF6CEEBBD96D30034B750DB589E9E693A7594736F73B9BFB6E761BCCA01D7FF3AC039E9BDF8E93069E9BDF0E33FA9DCD7D37BB0D6690C8F3DEBE81E8BEA033376F159ADE06B3FA6D74DF2B2C35A6F7CB88BF79A7A0A3B53D63F57FD992B9B263618753791EBF0C402A789F1977CF90C7BF40C3A34E9A9EF3C9F5E185102D85976965798D0293D3B4303D4B3ED738CD0E8E50C8E3A7F971374DF70F90DF354113DF7C2BB6CF917F7C92C6BBBFA67991DE6B77D1D4837E996E616A9616663C34FB7888A61EF6CB799F735C2E7B6C0E9A1B1A11D86419F3136E597E70D62B97431E9FA8E7312D8AF6CD4F4C91CF314601D1DEB991510A074272DE3BEA906DF38F4D8A72C7686E7834DA46CE372DDCE13AB9AD5C3FAF9B7D3C2CFB36F1758FCCC769B9FCF9C9290A88F6468261F23A5C34F36890267B7A77B789341E51972A9BDB1A5B36F739B66CDE165B7650FCB65C2E9711094568756D436E0B8AFCDC47EE5B6F55B5E88F933C237699BEB9B1099E8363C3F1BCB2DA4AB50D4D64AD6FA496F60EB91FB588D8D8505B4FCDCDAD545F534B4D0DCDD42AB6B5DEEBA4E696366A69BB1785D7373536539DC52AD3F3724D49999C97695BEFC9FC35A5E5D1ED5CBECC2BCAE36953538B4CDB50D720E7B9CE066B9DCCD728DAC5DBEA84035C6E6D653555DF2DD94D27DADE50DBB057E66E7B54BD9C9FD737D637C9796B5905598A8A453B6BA8B6A28A9A9B5A6539326F4C5FB86EAE532D73B9DC4EF51B1C5636F72FB66C5E175F36FF4E0DD67A39CFBF736DA585EA397F79A5CC5727F2F0B160757583D6D636A9B3B9059E8363C3FBCCAC2F40CE09370DDB9D64137176797D4B6E0BCF07657C6296232BB4B4B8B41B5745CCE36DC139AF5C175BDE9C288BCB7924E2BE53C4302E8BF7D9C8C2A28861619997F7638EFDBC8E6363584C3906735BDC22B63D1A1C96638C4111D3789CC1FB3B97ED13630CDE1E1075AE897237B6BF4BDAAF547D57E7024E1153FDA24DD772F324667A145F37C6EDC008543CB788985227624DA38855EA5CB151C4788EA132AE36EEC6586B698588A1B57BF1BB464E55FA2611A3EF88F8D8CC319563D85ECCE2F8CAE918CECBEBB82CCECFF198632ACFB363D522D6719B382FB7A55EC4504E2BC7181C4B45B9D5629CC171BF39A6ADF17059A9FA1EEB4BEC79F19C38B698F5F780E720131C679F317A7F33B2BC74E3B94AABF8FCE6AD03D7C214BC9E637F3AF51F56C651DB0DCF8111F03EC363EB901897CF87221414D375311EE6B1355F4762E60FD9B739EFDAD6135A12E3721E4BCF8B3C3C5D5C5E93E3E0D5CD9D23B725BCB22EDB1111657239A1A5555A082FCB725736B68F54D661DBB86DDF7CFB507ACEF3B1DBECAE09399E60DFE3B7A9717E3AF55FBE72F599FF1EB1CBF01C1801EF335E71AE3D3E354B93D373F2FC7A63E71F72DB3DB1AF324362BF3F2C6F58B838306C93E7F863E29C9A3D99F1CED3C4F42C79C5B9FEFD34C6CFB1E53D1E19A5A959AFC427CEDB77CB9A93E7EB5E57FAE5257341C5718ECD15717D8B8DD79FDDC88FDE7754D3BBA5E5D27F866376ECBD6C551E9FBFF079838AE9EA7E59AA7B6889DA0DCF811124DB67227BF12C1217D7D2C91B5FC671DB72D4F29295C52EB263EC2AA75BDFBB9EC79EB6777EB52F8D2AAB2DC637E5BD725D95ABC6F5B1E9F998A28E07CFD26E780E8CE0AC3C277354D2B90EA762B77250B9CBCF11C4A78DF55CC5F33F5DCB8DFE7E5C962A8FC7ECEA18C0DB79BD725DCDF37635AE88AF2776199E0323386DFB4C5B07FB92FE18E038FD5269D4785B791A7F5EAED2F2F5FFD8757C2C6157D9EBD873F7D7732E468F0B57FFFBF7D1E718B90E4ECBF9FEEF93BFC2737062A86B5F8EB1491A18B24563596F9F4FEC8703D2BB0A8B5DEC9B3DD23F5ECFCB6A3DA7E529A78D85D3BF96D32CE72F5FE9926978CAEB551A7F70432E7359BC4D6D5775707E5E56798EDAAF74D3C48FAD138D05DA12F8C6CE729EF8FCEA1A5CDFC0D08172D45820DD76C3736004CAF3203FE3BAB11D3D57659E7FA126EA247BA7BC6EEB704B947B6A99FD64D4F1803DE679466D57DB54CC56C788F8BC89E68FDAAF5469D4B9B4F24E9DAF27F2F04E7129D91C6369D5FDACD7DA13B51B9E0323D0F5DD2733DFF7394EDDF1D7FFE13900FA81780E80FEC07300F4079E03A03FF01C00FD81E700E80F3C07407FE03900FA03CF01D01F780E80FEC07300F4079E03A03FF01C00FD81E700E80F3C07407FE03900FA03CF01D01F780E80FEC07300F4079E03A03FF01C00FD81E700E80F3C07407F1279CEFF3722FEBBD166B71300F0ECC47FFB3DBFA010F11C00CDC0B81D00FD81E700E80F3C07407FE03900FA03CF01D01F780E80FEC07300F4079E03A03FF01C00FD81E700E80F3C07407FE03900FA03CF01D01F780E80FEC07300F4079E03A03FF01C00FD81E700E80F3C07407FE0393082F9713705673C34DDFF987C8E31F28F4D9277D4499E113B05E77C14989AA57020481E9B837CCE319A9F9C22AFDD451BDBDF99DEF66C009E0323F8AACD46F5D621B2963FA4DA8A3E6AA81DA63ACB003535DAA9B9C949F53583727B7DF5A04CC3EB795D5B873B6DFCC10DD3FB795681E7C008AE77B8C92AA64653313E45966058CEB7893ACCEEE759059E9F4E2A2C76B95F7777D8C9257EFFD3C074DFC0BE6F80C7F2474B0FD5ECFC832AFC0B54B1B44A15A108558B31F9713D2FEEE896C0F3E301CF330B8F35D959E778F8887F17B721F5F7F6F98E34364E44656EA92C27593D1CCF2B0321BAE3F153716485BE10BE576D6CC3F353023CCF2CB19E1DE5FCD2A873D1738503F49F5D6EFA69838B9E6B1A1353273DDF3A2EE79F6B72D1CF3B26E9BCD54117EA9DF4934A1BFDAC654CA68FE5A5BC527A514C07931CABD8F3AA9575AA5A5EA3D2C5252A15F1BC069E9F1AE079E66057DB3ADC742DB727EAFA49B7813DFDE0E953BA38B14897826BF4BA2B48AF3916E8D5D105CA11EB78DB2F1FCCC9E5D7EC0BF4D6DC925CB78FAE2E39FDB03AF9B8BD786A968A66E6E8FA889D6E8F4D5289C797D2E34F7E748E6E5EF930297C8E0ECF8F073C3F89DFD86D6ADDC785C7EDA9FAA0E279A588E7E5AB1B723E9D78CD1EA71BDBCDFC1DCF3AF0FC247EE31ED3DB701C5C7B7F7F7F309C329EDF197753A1E0AEDD9596BB05B99F268DE5D75F7811E3760380E727FF1B9F355C69B43F1ACFD7B7A894AFB7CF070DB9AF86F3736380E799856320FF4F5AA7887199AAC31977BFAB57B095E06FB625D2B92C35FBD276A7713FED7E6E9E9C0E1D12CBA3F17CD64B9FBB67E8F6F02815F43EA4DB038354EAF527F5F8B39C4B49E3396F2FEB1B84E7C7049E670E763CB7B38B6EB8DDF4C9C000DDEB1FA090C7279F0FE56742FD6313B42262DF71EB39106F45BD5B7BAE1F40B87EECF213C0F1BC7AEB099589985E1159A1E250982A446CE7F88EF373F381E799A356FC6ED6A74FA35CEFECA2A55084C281102DFA031411F3CBC289E3D693CCC39D9C8BF4DDF7BF4F9BC7184FA8B89E2A9E978B3E158BE35691CD2EAFC5954ECFD15D714C4B3686473C3F19E079E668DCF3BC381C96D31B9D5DB41C5EA65511F356044B8B4B86D413EFF9FAE68EAC83CB5F5A8CC8E349A6FBCAF1BC588C238A449DC50E1795AF6DCA6B727726A6A86C6111E7E72603CF334B91F8EDCE5FBD2A63F988D8EF398EB3E381C9695A10F1CE883AE23D67C73D22A606C5F97270CE4B5EE19D91FBCB61F1DC228E61FC1C1C3FF35A2AE278B9F0BE4A8C57D2F1F830F87A3C3C37E6EF16BB0CCF33FF1B1B4DB271BB11CFBD32E93CF75A22FCBE2D62F7ED5127DD718E53B170BE549CA324F35CDD374B06CECF8DDF07E179E67F63A349E6793ACFBDF23CAF3BECB957269DE75E2D5B4FC8C2E7E54778EE15D7E1CCD907E179267E63FB33E74D154799649EA7F3DC2BAFE3ED873EF7BA47AAE75E4B84DF55E25CE128CFBDE2399993DA07F7EF23F03C13BFB1FB99F2F13B6E97AFA4FEED9379CE751B45B236703CAF59DF92EFAAF1B5F63271AE8EF7584E0FF03CB3A87759D289CBB1B0E3376F0D48CF393F33D4D163EAFBE7A9EEABDDF5CE53FE8C873E1EB6D10D9BE3403CE7F75152BDB382F75832033C3FBDF031E2F295B3F1DBEF7B4E46C473BE2667D9DC39763CC7F9B93124F2FC5A6EDEBE63353FB769763BB395A37E9FC22C6A3BDC549661CECA6F711A6187639DCE2F28443C074033306E07407FE03900FA03CF01D01F780E3289BAAF6804B80EF7ECC0739049F23B769FC77B7FFB09BD13D9A04B0B6B72FA4E7883DE5DD9A2F756B7A2EB7EED5BA15FFB57E8FDAD27099FC7FBED64981EC43D4330FD0CEFD36723F01C6412E5F97F6DECD01B53617A7D2C442F0FF9E9E2E422FD26B02A7D7F7534209FB77DD5BE403962FB6F17D7D3F6FC21EEF9A6053C079984C7DA6D1D991BB7277BE617FC13780ECE32893CFFA06080AE77BA0FC0CFF298DD5EB380E7E02C93C8F33F74B9F77DAF4BC1CFD499DD5EB380E7E02CF320C13B35EC79C5FA3A7D1108D0C7232374DDE5A242AF179EC72CC3736024DD7D3E792DCE08DAFAD37BE74F795EBABC4C65ABAB541C89906567079EC72CC3736024D1EBEDEBDBF4E64C64F71B17B600E58C87E43D34BEA7C6D7DAF9DAFB2B23F3F29B17875D6F7FC31DA66ECBFE7765E3BF5DAFE279FECC0CDD9C9E463CDF039E834C52D4B1FBDDA9E7DB27E85CF5289DB7DAE9C72543F45CA34BF2B3E631F9BDAA73D576FA8F0A1BFD7BD9B04C9BE8DB55B99DEEB4EA64CF3986972C2DC9B1FB6DBF9FCAD7D6E079CC323C07671D5C6F3F083C073AB1B6B12DFFD7CDECE008F99CE3343FEEA6F07C50AC73D0DAFA1685BCF3729D7F6C92C20B21D3DB7B52C073A013ECF2CAF21A6D6C7F47EB5B4FE43CAF63FF79CAFFB38261F7799BD9ED3D29E03900FA03CF4126895E876B1B97D7E07E52659353E642BD537E4FFEBCD521E7F91A9CBC0ED73A7EACEB70E020F01C6412755FEDF2E68EBC7FF6D6EC92BCB726DF510B6FD07B2B5BF4B66759DE577B633A22EFBDF1BAC3DE6389BFAF86F758D2039E834C82F7584E07F01C9C6512797ECB624FF8BDD86F8EF80D7D9D80E7E02C83F758D2039E83B3CC61CFBDE23D96FDC0739049F01ECBE9009E834C127BBDFD6DEF325D7487E535759EBF145A97D7DC791DBFD3C2DF92E26DEF2E6FA6FDDDA8C3E2393FD3CE7C3E3929DF69290A06E179CC323C0746F2A9C59EF23D96739651BA50EB48F91ECBA54EB7FC7E6CAA3AF11ECB41E039D08D5FE4F548D7E3E1EBF066B7CD2CE039D089F58D6DAA29F996AABEB84FD6B207642D7F4855B7BBA9BAB88746863C1409866929BC4C8BFE050A07F01E4BB234009C66D8E1A5508442733E5A595A95CBCB9115F91ECBA22F405EBB8B0253B314F2F84D6FEB4901CF01D01F780E80FEC073709A09CE7868AAB78FC20B8BA6B7E52C03CF4F077C2FF8DE95AB34FDF011D99BDB68C85243F773F3E47523E7BD4E7A5C5E2969FECD257A58709BBEFDEC86D8FE6739E5FC9C96DFDDE2EFA40C9494D1704DAD2C4F95EF6CEFA0FE2F8A68B0D242ED97DF97E5F277186C750DD47FE7AE3C5F7D74B78486ABADB22C8697EF5DFD40A6E5E5D1C666F28C3A6479C1592F395ADB65BEC76515D473FD6FB23E4EA7A6F69636E928B785F3F5171553D7877F946DB8FFD19FA9E9ADB7A37D64389FABE34BB98ED3FDFDD3EB3452DB40D65FFE8AEA5E794DA6B1D537D1D77FF9385A0763F6DFEE2C00CF4F07EC79C5859FCAFF0BC83EB3EBBC2FB36B8CF5572F92A3ED1E8D757D457FFFE4536A7DF73DAA7DF12539E5FC9CB6EEE557E47CB770C863B35343CE45E90A97C9F3EA58A2FC9FEE7B24CBE4EDFC2DA5F273E7A9F847FF464D6FBE2DBDE5E5FFF9DEF7C8E71893F9F9F831F5A05FE6FD3AEF2FF238C1F35FFDE97FA9E5D23B54FBD2CBD47DED2339654F1FDCBC25CAB820DBC0F9B80F96177E2ED737BC9E4385FFF2AF329DFA0DB85DDDD772655DBD37F2A9F18D37659D75AFBC4A053FF8A16C071FFFBA3FCA9575F0F18AEB36FB6F771680E7A703E520C748DE9739FEAA982A292E9571B7F3777F90DF3C9A7AD027BF7FC653CEAFE2B9BBF7A174C356DF28CB53F15EC5735EDFF3D7BFC975ECE9486D3D0D55D5A4FCBFA33C4E885DE66BD9AECE2F65CC4EB78F9E91D103E528FE19CFBB649A08C6E98602CF01D01F780E80FEC07300F4079E03A03FF01C00FD49E4F9B5DCBC7DEFF3DEC437350138D3B0C3B14EE71714229E03A01918B703A03FF01C00FD81E700E80F3C07407FE03900FA03CF01D01F780E80FEC07300F4079E03A03FF01C00FD81E700E80F3C07407FE03900FA03CF01D01F780E80FEC07300F4079E03A03FF01C00FD81E700E80F3C07407FE03900FA03CF01D01F780E80FEC07300F4079E03A03FF01C00FD81E700E80F3C07407FE03900FA03CF01D01F780E80FEC07300F4079E03A03FF01C00FD81E700E84F3A9EF7F60DC875BA73F356A1E96D30ABDFD9DC77B3DB7012B0C3A93CCF16B2B9DFD9DC77B3DB6006F0DCFC7698D1EF6CEEBBD96D3003786E7E3BCCE87736F7DDEC3698017B7E2D37CFF4F30933C8E67E6773DFBBC5D4B587D9ED3929F20B0AE9FF0167965AFE 10 | SmallImageOriginalSize=60000 11 | SmallImageWidth=150 12 | SmallImageHeight=100 13 | SmallImage=789CED9DFB57535716C7BF7FE874B5337675CD74AD9976A61D6B9753A775C6997649EB7369C52AC85B044145441E222124843C0809509440DE2F20E1FD52679CBD0F5C0C101491432EE3FEE1B3EEC9BDE7DC6C723F9EB3EF35E7A4A9B905FDBE4153D164C298CC1A9719636AEFE88487B62B2F5E9A0A33C664D6B8CC1813BB65C435BBB8ACCA66A0AEE14EC163382C71E58BC9B7C773EDB59DC14476669B57C656D8DFBE24108C20969A54AFA72732C852399348633214C5F4641693E1982AF3BEF45810C9A7014C46E2984E4F21353AAEEAF3EB89609888602A96C4CCD4F4C6B92623316A17C2049D632A9640F249409D8BEB31EABDE83DA6A2093ADF987A8FF4780899780AD9E4C4FA36AD8E4FAA7324D5798DF7CD3D3797D539A90DC7C07538CEB5738FC3DBFE48D571F6D8C52B8DB4529ED1F4E021EEDC6B86ABDF0787BD0FB6AE6EF4DA7A61B7F4C042C76C5DD68D7FEF1D9D16DCBDFF0056AAE7B03B145CAF8B722855BFA515E5553554A705F7A9FCB8B34BB56BA7ADCDE1445F9F6B57FDCAD90B17F1D86A53DBCBC557F7ADEFB43BDDEAEF96FE4ABF570E57FFC6E7EEF6FAE0A2D72EB797A0ADC78B96D6F68DE33DBDCE8D321FE3FA6EF2D149D74BB5A37DB5F50DE8A3F6EA7C74CCA8EFEC1FD8F4DA93736DB7C2D79FBDE2E329EA77728F713E94AFCD4EFB7331DE4FBCD20B7FA6511A8722C4F2B3FFE02979C66CAD13A3F1689CC69C108D2741627E7E69C7735A7BFB10A5712B9D994698C6236E3337B7B8AB78D88DA73406B6E6C4C07EB5B475A872201441654DEDB676FC7E8687E255E1E1EBD7E7F16EF41DBD746DACEBF7E0B979B7C3BDD6A7B9BC6BFD0D8F7B3B8D3535B7EA553DF7805FF1A6FAB9F1705E3DF46454ED9F595856BE84285FE238B97C8FC75BEACB5AD76364CF0C3778FCCDEDE7C4ABC2A1E3338D261714EF720E768B9D617F8C7B38235ECE03B9CC791EE75E274FFD4BBDBE7EA34C3955DF7857F9C734DCB9B7A9EF13AF0ECEAB91C038C6E87E8C5F5F2E76D3F518A53E6A84AEEB0C8D399CEB26E87A45D4BEEB3706541DA3FC43914D6DF938B7E3FA7C9CB74699EBBE6D5CEC027BC16EF13637DE5C1F18C31B1E1F8DFB5A86C7D4AD3997787530F0B8B179CCB3D0F5E9545BBBD34BD7D4A668ED7028B6DF5FBD1A438DBAFB75EF960FEE8FDCDEEDB93FC35EC9FDA05008A4BF1274205E093A10AF041D8857820EC42B4107E295A003F14AD0817825E840BC1274205E093A10AF041D8857820EC42B4107B95E19F384785BE8B884C3CDBDF5EFAD36AD6F799FF457C2BB22E3A0A003F14AD0817825E840BC1274205E093A10AF041D8857820EC42B4107E295A003F14AD08178A50F5EC7CE58BF8ED7C533D6B8E37DBCDE1EBF5E7EFEDF82C7A903F14A1F365F1AD7F7C0D58E211477040B1EFFBBF0FFE8D5ECE2F3D71EE7755B7CBE0462F477EE1763561B92EBEB491954373B503FBB80CAC92C6AB2B368A4F7DE0D6535B7955F85FE1CC5AB574C6497D57A3EBC96CF4E7EBDC9BB5C3E6C19C5C78E187EDB1DC6478F4338D213C1115B84CA4155FE7430ADF8D31D0BAEB822DBBCBA959941457A0AD5A9C9BC0E953734298F72B9567441BC32219E7DBC2625D608CA9C7194F5C571A33746E5847A5D424EDD20DFAAFC6945698305CED0CCA6B6168AA376661E15C90954519FB553DF946FBF78653E3CBEB75F5FEC5DE1B170EBBAF7DC5FDD9CC8A032497EEDE095F457878716CA7582C9BD5D17DFFAFA6763BC2E58CEBA8893D657EB9805F2E457FE863B08E5386578C57955C9E818CAE89EB08A62DAD62F5DB8B2CD2BC9AFCCC7638ABDF1E54B5C1C1C546BED4F84226A3D7C5E837837ED63C6DF4E4EAD52F9C51F3EC5B3E2AB58A19CFC4DEDF2795537B7889B945F55F1766A1AB797563779F5CBA9A26D4E5534B789572663983C3AE376E3AACBAD9E1FCD905BFC7B0CBB6D6F7835373DA7DAA5C7C3585878F37AE5F950F915B5AD26AF6AE87C9C673592DF723F7838E1B53177B376FDEBBC5A5A798EC5E56768F726D14AD7783724B279F2ABD905944762A88C25514B7DD65687AE7C7E6C5B7F55E3EC17AF4C88C7177C639D9DD6A78E6DF9DBF919C2D1C945FC253E8BCF43D3F832358FAF324BF87374165F24E6F02D8DB906A7F33C67E0BCBD349A4029E55879EFFB24BF3A34F073CFD7AD6BCECFB84E9EEA56CF2302BED14DF937FF06C45E9F8DE6CBAFF839C32FE118CAC3D10D976EFA86F3BA64505A5C2A5E1D52F6B2D6F9DBD2417E9FA571F427771C458E30CE932BBBE574F3EBEF13CC8ECC4B157420F352051DBCAFE3A0A017F1EAE068A2BCE99B8114BEEE8BE3983D8AAF1D311C772570CC16C5516B441D3B41F79F06BE9C7B8A853D3E372914E2D5C1C1CFB8CE7953F8FE7108FF7E144411B9F593338EEFA9FC03ED3BEB49E2BC3FBD013F0F33DA6E7DFE6176C4ABC381E155FF930C6AC939038B499F4788578703E3F72AAB9BDDA89E9F47F9D4144A924934FBC5ABF79D7A6742E5507FB584F165671047BBC338EE4EA85CEB8B8E711CA7713037BFEA778E6CE457C66F9BB257553333CA2B46BC12BA680C3B475E715E759A72F533E414E754A72967E77D7CCCC8AD2E11F9BED7AAFE2F7B7919D57373AADF12AF84FD20169982A5C50B6B9B1F76CB13044612EA7B1B9944AAE0B1E5225E1D2E169756B1B4FA427DDF427DE7626945FD663D7FAFA7D0B1E5225E1D1C55945FFDDE9BC487945B7DF030808F68FB8933AEE664FC865E7F42E3E2C63C8C2DF9D56C76A6E0F1BF0DE2D5C1D14BF955D5405ACDBD28272ABD2954F6A7D4FC0BDE67CCC130C8CDAFE4F995A003C32B35D775F0150FC8C742C7960FF1EA70E05C9FB7C1CF19CA33195C4F24501C0AC9FDA0A0E6226ECDAF3EB647F1416B605B7EC5F4EEF0FCAA229BC5B5785C9E8B0A8ABCF915B136D7F5F5F995013FBFAA5B5D45DDB367B8B5B2225E09FB423C9A41D77D372C0FBDE86AF6606C348D4C2C894C3CB5E779433A10AF0E17C6BA46CBAB2F5499E7452E2CAEA8B943858E2D17F1CA7CF0BA5866EA7BF6C2FBE495ABE406C6BA7B3074EF3E7A2F5FC168A7059E8A2A74FF78066DDF9CC0C0AD7A9523FBEA1BE0A9AC46CFF98B988A25E0BBDD085F5D035CA565488E8C62A4B51D7EDAD77EE25B786B6AD1F1DD3FD4EBB6BF9D5073ACC3EE7EA40341D82E5E52E7BEFDBB23AA9EF35A097E6D6953E76F39FA159AFEF899DACFEFE92EAB50F1F5FE5CACCEC3ED869B5BF0E8E43F6129FA519E5F99989E731710E8EA26476EA3FDEFDFC17EE967B5AEC2406D9D72EDE9A32E75FDAC67CF63F06E136C172E6288B60172D1DF7857ED63AFE243BF2231F214018B1553D138C6ED0E44BD7E8CF5D8D5FFD345FA0710767910F30FA96DD0DEA7EAC5FCC3483E0960F8FE036ADB43B1ACB55FF3AA1CE33DBD74EE11440706316E73203ECC65BFF294FFFFA6D09F9F7825141AF14AD081CC1F147420F307051DC83828E840BC1274205E093A10AF041D8857820EC42B4107E295A003F14AD0817825E840BC1274205E093A10AF041D8857820EC42B4107E295A003F14AD0817825E840BC1274205E093A10AF041D8857820EF27935919D51653360CC17321B668CCB4C314593E96D5E990933C664D6B8CC1853EEBC543361C698CC1A17C714A06DC004B118F0BCD4FF01E831B4E7 14 | 15 | -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #8 - LINX Custom Firmware/ESP8266_Wifi_DHCP_Configuration/ESP8266_Wifi_DHCP_Configuration.ino: -------------------------------------------------------------------------------- 1 | /**************************************************************************************** 2 | ** This is example LINX firmware for use with the ESP8266 device 3 | ** 4 | ** For more information see: www.labviewmakerhub.com/linx 5 | ** For support visit the forums at: www.labviewmakerhub.com/forums/linx 6 | ** 7 | ** BSD2 license. 8 | ****************************************************************************************/ 9 | 10 | //Include All Peripheral Libraries Used By LINX 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | //Include Device Specific Header From Sketch>>Import Library (In This Case LinxESP8266.h) 18 | //Also Include Desired LINX Liste0ner From Sketch>>Import Library (In This Case LinxESP8266WifiListener.h) 19 | #include 20 | #include 21 | 22 | //Create A Pointer To The LINX Device Object We Instantiate In Setup() 23 | LinxESP8266* LinxDevice; 24 | 25 | //Initialize LINX Device And Listener 26 | void setup() 27 | { 28 | Serial.begin(115200); 29 | WiFi.mode(WIFI_STA); 30 | WiFi.disconnect(true); 31 | 32 | //Instantiate The LINX Device 33 | LinxDevice = new LinxESP8266(); 34 | 35 | //The LINX Serial Listener Is Included In WIFI Listener And Pre Instantiated. This Is Necessary For Configuring Wifi Settings. 36 | //LinxSerialConnection.Start(LinxDevice, 0); 37 | 38 | //The LINX Listener Is Pre Instantiated. 39 | //Set SSID (Network Name), Security Type, Passphrase/Key, And Call Start With Desired Device IP and Port 40 | LinxWifiConnection.SetSsid("YOUR_SSID"); 41 | LinxWifiConnection.SetSecurity(WPA2_PASSPHRASE); //NONE, WPA2_PASSPHRASE, WPA2_KEY, WEP40, WEO104 42 | LinxWifiConnection.SetPassphrase("YOUR_PASS"); 43 | LinxWifiConnection.SetPort(44300); 44 | LinxWifiConnection.Start(LinxDevice); 45 | } 46 | 47 | 48 | void loop() 49 | { 50 | //Listen For New Packets From LabVIEW 51 | LinxWifiConnection.CheckForCommands(); 52 | 53 | //Your Code Here, But It will Slow Down The Connection With LabVIEW 54 | } 55 | -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #8 - LINX Custom Firmware/LINX-dev-esp8266-cfg-2.1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #8 - LINX Custom Firmware/LINX-dev-esp8266-cfg-2.1.zip -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #8 - LINX Custom Firmware/LinxESP8266WifiListener.cpp: -------------------------------------------------------------------------------- 1 | /**************************************************************************************** 2 | ** LINX ESP8266 Wifi listener code. 3 | ** 4 | ** For more information see: www.labviewmakerhub.com/linx 5 | ** For support visit the forums at: www.labviewmakerhub.com/forums/linx 6 | ** 7 | ** BSD2 License. 8 | ****************************************************************************************/ 9 | 10 | /**************************************************************************************** 11 | ** Includes 12 | ****************************************************************************************/ 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "utility/LinxDevice.h" 19 | #include "utility/LinxListener.h" 20 | #include "LinxESP8266WifiListener.h" 21 | 22 | /**************************************************************************************** 23 | ** Constructors 24 | ****************************************************************************************/ 25 | LinxESP8266WifiListener::LinxESP8266WifiListener() 26 | { 27 | State = START; 28 | 29 | wifiState = sINIT; 30 | LinxWifiConnectStatus = WL_IDLE_STATUS; 31 | LinxWifiTimeout = 2000; 32 | unsigned char wifiServerFail = 0; 33 | 34 | } 35 | 36 | /**************************************************************************************** 37 | ** Functions 38 | ****************************************************************************************/ 39 | int LinxESP8266WifiListener::SetSsid(const char ssid[]) 40 | { 41 | //Copy User SSID Into Member Var 42 | for(int i=0; i<32; i++) 43 | { 44 | LinxWifiSsid[i] = ssid[i]; 45 | } 46 | return L_OK; 47 | } 48 | 49 | int LinxESP8266WifiListener::SetSecurity(SecurityType securityType) 50 | { 51 | LinxWifiSecurity = securityType; 52 | return L_OK; 53 | } 54 | 55 | int LinxESP8266WifiListener::SetPassphrase(const char pw[]) 56 | { 57 | //Copy User PW Into Member Var 58 | for(int i=0; i<32; i++) 59 | { 60 | LinxWifiPw[i] = pw[i]; 61 | } 62 | return L_OK; 63 | } 64 | 65 | int LinxESP8266WifiListener::SetPort(unsigned short port) 66 | { 67 | LinxWifiPort = port; 68 | return L_OK; 69 | } 70 | 71 | 72 | //Start With IP And Port Saved In NVS 73 | int LinxESP8266WifiListener::Start(LinxDevice* linxDev) 74 | { 75 | 76 | LinxDev = linxDev; 77 | LinxDev->DebugPrintln("Network Wifi Stack :: Starting With NVS Data"); 78 | 79 | recBuffer = (unsigned char*) malloc(LinxDev->ListenerBufferSize); 80 | sendBuffer = (unsigned char*) malloc(LinxDev->ListenerBufferSize); 81 | 82 | /* 83 | //Load Stored WIFI Values 84 | int ssidSize = LinxDev->NonVolatileRead(NVS_WIFI_SSID_SIZE); 85 | for(int i=0; iNonVolatileRead(NVS_WIFI_SSID + i); 88 | } 89 | 90 | int pwSize = LinxDev->NonVolatileRead(NVS_WIFI_PW_SIZE); 91 | for(int i=0; iNonVolatileRead(NVS_WIFI_PW + i); 94 | } 95 | 96 | LinxWifiSecurity = (SecurityType)LinxDev->NonVolatileRead(NVS_WIFI_SECURITY_TYPE); 97 | 98 | LinxWifiIp = LinxDev->NonVolatileRead(NVS_WIFI_IP)<<24 | LinxDev->NonVolatileRead(NVS_WIFI_IP+1)<<16 | LinxDev->NonVolatileRead(NVS_WIFI_IP+2)<<8 | LinxDev->NonVolatileRead(NVS_WIFI_IP+3); 99 | LinxWifiPort = (LinxDev->NonVolatileRead(NVS_WIFI_PORT) << 8) + (LinxDev->NonVolatileRead(NVS_WIFI_PORT+1)) ; 100 | */ 101 | 102 | State = START; 103 | 104 | return L_OK; 105 | 106 | } 107 | 108 | int LinxESP8266WifiListener::Start(LinxDevice* linxDev, unsigned char ip3, unsigned char ip2, unsigned char ip1, unsigned char ip0, unsigned short port) 109 | { 110 | LinxDev = linxDev; 111 | 112 | LinxDev->DebugPrintln("Network Wifi Stack :: Starting With Fixed IP Address"); 113 | 114 | LinxWifiIp = ip3<<24 | ip2<<16 | ip1<< 8 | ip0; 115 | LinxWifiPort = port; 116 | 117 | State = START; 118 | 119 | LinxDev->DebugPrint("Connecting To Wifi Network"); 120 | return L_OK; 121 | 122 | } 123 | 124 | int LinxESP8266WifiListener::PrintWifiInfo() 125 | { 126 | //SSID 127 | const char * szSsid; 128 | szSsid = LinxWifiSsid; 129 | 130 | //PW 131 | const char * szPassPhrase; 132 | szPassPhrase = LinxWifiPw; 133 | 134 | //Used to check the IP address 135 | Serial.println(""); 136 | Serial.println(""); 137 | Serial.print("IP Address : "); Serial.println(IPAddress(WiFi.localIP())); 138 | Serial.print("Port : "); Serial.println(LinxWifiPort); 139 | 140 | //LINX WIFI DEBUG INFO 141 | LinxDev->DebugPrintln(""); 142 | LinxDev->DebugPrintln(""); 143 | LinxDev->DebugPrintln(".: LINX WIFI SETTINNGS :."); 144 | 145 | LinxDev->DebugPrint("IP Address : "); 146 | IPAddress IpAddress = WiFi.localIP(); 147 | LinxDev->DebugPrint(IpAddress[0], DEC); 148 | LinxDev->DebugPrint("."); 149 | LinxDev->DebugPrint(IpAddress[1], DEC); 150 | LinxDev->DebugPrint("."); 151 | LinxDev->DebugPrint(IpAddress[2], DEC); 152 | LinxDev->DebugPrint("."); 153 | LinxDev->DebugPrintln(IpAddress[3], DEC); 154 | 155 | LinxDev->DebugPrint("SSID : "); 156 | LinxDev->DebugPrintln(szSsid); 157 | 158 | LinxDev->DebugPrint("Security : "); 159 | switch(LinxWifiSecurity) 160 | { 161 | case NONE: 162 | //No Security 163 | LinxDev->DebugPrintln("None"); 164 | break; 165 | case WPA2_PASSPHRASE: 166 | //WPA2 Passphrase 167 | LinxDev->DebugPrintln("WPA2 Passphrase"); 168 | break; 169 | case WPA2_KEY: 170 | //WPA2 Key --Untested-- 171 | LinxDev->DebugPrintln("WPA2 Key - Not Implemented"); 172 | break; 173 | case WEP40: 174 | LinxDev->DebugPrintln("WEP40 - Not Implemented"); 175 | break; 176 | case WEO104: 177 | LinxDev->DebugPrintln("WEP104 - Not Implemented"); 178 | break; 179 | default: 180 | break; 181 | } 182 | 183 | LinxDev->DebugPrint("Passphrase : "); 184 | LinxDev->DebugPrintln(szPassPhrase); 185 | 186 | LinxDev->DebugPrintln(""); 187 | LinxDev->DebugPrintln(""); 188 | 189 | return L_OK; 190 | } 191 | 192 | 193 | 194 | int LinxESP8266WifiListener::Init() 195 | { 196 | //This case will be called repeatedly until the device connects to the network and starts listening. 197 | 198 | //SSID 199 | const char * szSsid; 200 | szSsid = LinxWifiSsid; 201 | 202 | //PW 203 | const char * szPassPhrase; 204 | szPassPhrase = LinxWifiPw; 205 | 206 | char key[64]; 207 | 208 | for(int i=0; i<64; i++) 209 | { 210 | key[i] = LinxWifiPw[i]; 211 | } 212 | 213 | if (LinxWifiIp) { 214 | // if IP == 0.0.0.0 then use DHCP 215 | IPAddress ip(LinxWifiIp>>24 & 0xFF, LinxWifiIp>>16 & 0xFF, LinxWifiIp>>8 & 0xFF, LinxWifiIp & 0xFF); 216 | WiFi.config(ip, IPAddress(0,0,0,0), IPAddress(255,255,255,255)); 217 | } 218 | 219 | switch(LinxWifiSecurity) 220 | { 221 | case NONE: 222 | //No Security 223 | LinxWifiConnectStatus = WiFi.begin(szSsid); 224 | break; 225 | case WPA2_PASSPHRASE: 226 | //WPA2 Passphrase 227 | LinxWifiConnectStatus = WiFi.begin(szSsid, szPassPhrase); 228 | break; 229 | case WPA2_KEY: 230 | //WPA2 Key --Untested-- 231 | //LinxWifiConnectStatus = deIPcK.wfConnect(szSsid, szPassPhrase, &LinxTcpStatus); 232 | break; 233 | case WEP40: 234 | //TODO 235 | break; 236 | case WEO104: 237 | //TODO 238 | break; 239 | default: 240 | break; 241 | } 242 | 243 | Serial.println(""); 244 | while (WiFi.status() != WL_CONNECTED) { // WL_CONNECTED = 3 245 | //while (WiFi.status() != WL_CONNECTED) { 246 | delay(1000); 247 | LinxWifiConnectStatus = WiFi.status(); 248 | Serial.print("."); 249 | } 250 | 251 | //Connect To Network 252 | if(WiFi.status() == WL_CONNECTED) 253 | //if(WiFi.status() == WL_CONNECTED) 254 | { 255 | LinxDev->DebugPrintln(""); 256 | LinxDev->DebugPrintln("Connected To Wifi Network"); 257 | m_pWifiSvr = new WiFiServer(LinxWifiPort); 258 | 259 | //Start the server 260 | m_pWifiSvr->begin(); 261 | State = AVAILABLE; 262 | } 263 | PrintWifiInfo(); 264 | 265 | 266 | return L_OK; 267 | } 268 | 269 | 270 | int LinxESP8266WifiListener::Listen() 271 | { 272 | State = AVAILABLE; 273 | return L_OK; 274 | } 275 | 276 | int LinxESP8266WifiListener::Available() 277 | { 278 | m_WifiClient = m_pWifiSvr->available(); 279 | if(m_WifiClient) 280 | { 281 | LinxDev->DebugPrintln("Available Client"); 282 | State = ACCEPT; 283 | } 284 | return L_OK; 285 | 286 | } 287 | 288 | int LinxESP8266WifiListener::Accept() 289 | { 290 | 291 | if(m_WifiClient.connected()) 292 | { 293 | LinxDev->DebugPrintln("Client Connected"); 294 | State = CONNECTED; 295 | LinxWifiStartTime = (unsigned)millis(); 296 | 297 | } 298 | else 299 | { 300 | State = CLOSE; 301 | } 302 | 303 | return L_OK; 304 | } 305 | 306 | int LinxESP8266WifiListener::Connected() 307 | { 308 | 309 | //Read Wifi TCP Bytes 310 | 311 | //If There Are Bytes Available Have A Look, If Not Loop (Remain In Read Unless Timeout) 312 | if(m_WifiClient.available() > 0) 313 | { 314 | //Read First Byte, Check If It Is SoF (0xFF) 315 | if ( (recBuffer[0] = m_WifiClient.read()) == 0xFF) //// 316 | { 317 | //LinxDev->DebugPrintln("Network Stack :: SoF Received"); 318 | 319 | //SoF Received, Reset LinxWifiStartTime 320 | LinxWifiStartTime = (unsigned)millis(); 321 | 322 | //SoF Received Wait For Packet Size 323 | while(m_WifiClient.available() < 1) 324 | { 325 | if( ((unsigned)millis() - LinxWifiStartTime) > LinxWifiTimeout) 326 | { 327 | State = CLOSE; 328 | LinxDev->DebugPrintln("Network Stack :: Rx Timeout (0)"); 329 | break; 330 | } 331 | } 332 | 333 | recBuffer[1] = m_WifiClient.read(); 334 | 335 | //LinxDev->DebugPrint("Network Stack :: Packet Size Received : "); 336 | //LinxDev->DebugPrintln(recBuffer[1], HEX); 337 | 338 | //Wait For Rest Of Packet 339 | while(m_WifiClient.available() < recBuffer[1]-2) 340 | { 341 | 342 | if( ((unsigned)millis() - LinxWifiStartTime) > LinxWifiTimeout) 343 | { 344 | State = CLOSE; 345 | LinxDev->DebugPrintln("Network Stack :: Rx Timeout (1)"); 346 | break; 347 | } 348 | } 349 | 350 | //Read Packet 351 | m_WifiClient.read(&recBuffer[2], recBuffer[1]-2); 352 | 353 | 354 | //DEBUG PRINT PACKET 355 | LinxDev->DebugPrint("RX <= "); 356 | for(int i=0; iDebugPrint("["); 359 | LinxDev->DebugPrint(recBuffer[i], HEX); 360 | LinxDev->DebugPrint("] "); 361 | } 362 | LinxDev->DebugPrintln(""); 363 | 364 | 365 | //Checksum 366 | if(ChecksumPassed(recBuffer)) 367 | { 368 | //LinxDev->DebugPrintln("Network Stack :: Packet Checksum Passed"); 369 | 370 | //Process Command And Respond 371 | LinxStatus m_status = (LinxStatus)ProcessCommand(recBuffer, sendBuffer); 372 | if(m_status == L_DISCONNECT) 373 | { 374 | State = CLOSE; 375 | } 376 | m_WifiClient.write((const uint8_t *)sendBuffer, (size_t)sendBuffer[1]); 377 | } 378 | else 379 | { 380 | LinxDev->DebugPrintln("Network Stack :: Checksum Failed"); 381 | } 382 | } 383 | else 384 | { 385 | State = CLOSE; 386 | LinxDev->DebugPrintln("Network Stack :: SoF Failed"); 387 | } 388 | 389 | //Data Received, Reset Timeout 390 | LinxWifiStartTime = (unsigned)millis(); 391 | } 392 | else if( ((unsigned)millis() - LinxWifiStartTime) > LinxWifiTimeout) 393 | { 394 | //Time Out 395 | LinxDev->DebugPrintln("Network Stack :: Wifi Timeout"); 396 | LinxDev->DebugPrintln(LinxWifiTimeout, DEC); 397 | State = CLOSE; 398 | 399 | } 400 | 401 | return L_OK; 402 | } 403 | 404 | int LinxESP8266WifiListener::Close() 405 | { 406 | 407 | //Close TCP Connection, Return To Listening State 408 | LinxDev->DebugPrintln("Closing Wifi TCP Connection..."); 409 | if (m_WifiClient.connected()) 410 | m_WifiClient.stop(); 411 | 412 | //Assume Wifi Stack Is Ok, But Check For Errors 413 | State = LISTENING; 414 | 415 | return L_OK; 416 | } 417 | 418 | int LinxESP8266WifiListener::Exit() 419 | { 420 | //Something Went Wrong. Try To Close Connection And Quit. 421 | m_WifiClient.stop(); 422 | delete m_pWifiSvr; 423 | State = START; 424 | 425 | LinxDev->DebugPrintln("Restarting Wifi Server..."); 426 | 427 | return L_OK; 428 | } 429 | 430 | int LinxESP8266WifiListener::CheckForCommands() 431 | { 432 | switch(State) 433 | { 434 | case START: 435 | Init(); 436 | //LinxDev->DebugPrintln("..........START.........."); 437 | break; 438 | case LISTENING: 439 | Listen(); 440 | //LinxDev->DebugPrintln("..........LISTENING.........."); 441 | break; 442 | case AVAILABLE: 443 | Available(); 444 | //LinxDev->DebugPrintln("..........AVAILABLE.........."); 445 | break; 446 | case ACCEPT: 447 | Accept(); 448 | //LinxDev->DebugPrintln("..........ACCEPT.........."); 449 | break; 450 | case CONNECTED: 451 | Connected(); 452 | //LinxDev->DebugPrintln("..........CONNECTED.........."); 453 | break; 454 | case CLOSE: 455 | Close(); 456 | //LinxDev->DebugPrintln("..........CLOSE.........."); 457 | break; 458 | case EXIT: 459 | Exit(); 460 | break; 461 | } 462 | 463 | //Every Iteration Run Periodic Network Tasks 464 | 465 | return L_OK; 466 | } 467 | 468 | // Pre Instantiate Object 469 | LinxESP8266WifiListener LinxWifiConnection; 470 | -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #8 - LINX Custom Firmware/LinxESP8266WifiListener.h: -------------------------------------------------------------------------------- 1 | /**************************************************************************************** 2 | ** LINX header for ESP8266 Wifi listener. 3 | ** 4 | ** For more information see: www.labviewmakerhub.com/linx 5 | ** For support visit the forums at: www.labviewmakerhub.com/forums/linx 6 | ** 7 | ** BSD2 License. 8 | ****************************************************************************************/ 9 | 10 | #ifndef LINX_CHIPKITNETWORKSHIELD_LISTENER_H 11 | #define LINX_CHIPKITNETWORKSHIELD_LISTENER_H 12 | 13 | /**************************************************************************************** 14 | ** Defines 15 | ****************************************************************************************/ 16 | #define LINX_SERIAL_BUFFER_SIZE 128 17 | 18 | /**************************************************************************************** 19 | ** Includes 20 | ****************************************************************************************/ 21 | #include "LinxSerialListener.h" 22 | #include "utility/LinxListener.h" 23 | #include "utility/LinxDevice.h" 24 | 25 | /**************************************************************************************** 26 | ** Type Defs 27 | ****************************************************************************************/ 28 | enum SecurityType {NONE, WPA2_PASSPHRASE, WPA2_KEY, WEP40, WEO104}; 29 | enum WifiStartState {sINIT, sCONNECT, sLISTEN}; 30 | 31 | /**************************************************************************************** 32 | ** Classes 33 | ****************************************************************************************/ 34 | class LinxESP8266WifiListener : public LinxListener 35 | { 36 | public: 37 | /**************************************************************************************** 38 | ** Variables 39 | ****************************************************************************************/ 40 | LinxListenerState State; 41 | WifiStartState wifiState; 42 | int LinxWifiConnectStatus; 43 | 44 | unsigned long LinxWifiIp; 45 | unsigned short LinxWifiPort; 46 | unsigned char LinxWifiSsidSize; 47 | char LinxWifiSsid[32]; 48 | SecurityType LinxWifiSecurity; 49 | unsigned char LinxWifiPwSize; 50 | char LinxWifiPw[64]; 51 | 52 | unsigned char wifiServerFail; 53 | 54 | unsigned int LinxWifiStartTime; 55 | unsigned int LinxWifiTimeout; 56 | 57 | /**************************************************************************************** 58 | ** Constructors 59 | ****************************************************************************************/ 60 | LinxESP8266WifiListener(); //Default Constructor 61 | 62 | /**************************************************************************************** 63 | ** Functions 64 | ****************************************************************************************/ 65 | virtual int SetSsid(const char ssid[]); 66 | virtual int SetSecurity(SecurityType securityType); 67 | virtual int SetPassphrase(const char pw[]); 68 | virtual int SetPort(unsigned short port); 69 | 70 | virtual int Start(LinxDevice* linxDev); 71 | virtual int Start(LinxDevice* linxDev, unsigned char ip3, unsigned char ip2, unsigned char ip1, unsigned char ip0, unsigned short port); 72 | virtual int PrintWifiInfo(); 73 | virtual int Init(); 74 | virtual int Listen(); 75 | virtual int Available(); 76 | virtual int Accept(); 77 | virtual int Connected(); 78 | virtual int Close(); 79 | virtual int Exit(); 80 | 81 | virtual int CheckForCommands(); 82 | 83 | private: 84 | /**************************************************************************************** 85 | ** Variables 86 | ****************************************************************************************/ 87 | WiFiServer* m_pWifiSvr; 88 | WiFiClient m_WifiClient; 89 | 90 | /**************************************************************************************** 91 | ** Functions 92 | ****************************************************************************************/ 93 | 94 | }; 95 | 96 | extern LinxESP8266WifiListener LinxWifiConnection; 97 | 98 | #endif //LINX_CHIPKITNETWORKSHIELD_LISTENER_H 99 | -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #9 - LINX Doesn't Work With Virtual COM Ports (Arduino Serial Communication)/Serial_switch_LEDs/Serial_switch_LEDs.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Switch statement with serial input 3 | */ 4 | 5 | void setup() { 6 | // initialize serial communication: 7 | Serial.begin(115200); 8 | while (!Serial) { 9 | ; // wait for serial port to connect. Needed for Native USB only 10 | } 11 | 12 | Serial.println(""); //Debug use only 13 | 14 | // initialize the LED pins: 15 | for (int thisPin = 2; thisPin < 7; thisPin++) { 16 | pinMode(thisPin, OUTPUT); 17 | } 18 | Serial.println(""); //Debug use only 19 | } 20 | 21 | void loop() { 22 | // read the sensor: 23 | if (Serial.available() > 0) { 24 | int inByte = Serial.read(); 25 | // do something different depending on the character received. 26 | // The switch statement expects single number values for each case; in this 27 | // example, though, you're using single quotes to tell the controller to get 28 | // the ASCII value for the character. For example 'a' = 97, 'b' = 98, 29 | // and so forth: 30 | 31 | switch (inByte) { 32 | case 'a': 33 | digitalWrite(2, HIGH); 34 | Serial.println("Case: A"); //Debug use only 35 | break; 36 | case 'b': 37 | digitalWrite(3, HIGH); 38 | Serial.println("Case: B"); //Debug use only 39 | break; 40 | case 'c': 41 | digitalWrite(4, HIGH); 42 | Serial.println("Case: C"); //Debug use only 43 | break; 44 | case 'd': 45 | digitalWrite(5, HIGH); 46 | Serial.println("Case: D"); //Debug use only 47 | break; 48 | case 'e': 49 | digitalWrite(6, HIGH); 50 | Serial.println("Case: E"); //Debug use only 51 | break; 52 | default: 53 | // turn all the LEDs off: 54 | for (int thisPin = 2; thisPin < 7; thisPin++) { 55 | digitalWrite(thisPin, LOW); 56 | } 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabVIEW Basics #9 - LINX Doesn't Work With Virtual COM Ports (Arduino Serial Communication)/Simple Serial.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabVIEW Basics #9 - LINX Doesn't Work With Virtual COM Ports (Arduino Serial Communication)/Simple Serial.vi -------------------------------------------------------------------------------- /LabVIEW Basics Examples/LabvIEW BASics #12 - Stepper Motor Control/Stepper Motor Control.vi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SINConsulting/LabVIEW-Basics/67f5acf1f06e4f117ba9793d170f1e36bce1f1e6/LabVIEW Basics Examples/LabvIEW BASics #12 - Stepper Motor Control/Stepper Motor Control.vi -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LabVIEW-Basics 2 | Repository for the developed VIs and projects following the LabVIEW basics series created by SIN Consulting. 3 | --------------------------------------------------------------------------------