Differential Amplifier

opamp18(1) opamp22

 

Jika R1 = R2 and R3 = R4, maka persamaan menjadi:

opamp23

Aplikasi Rangkaian

Berikut adalah contoh aplikasi differential amplifier yang memanfaatkannya sebagai Voltage Subtractor atau rangkaian pengurangan. Misal saya mempunyai sebuah sensor jarak yang mempunyai output analog yang akan mendeteksi perubahan posisi sebuah besi pada jarak sekitar 5cm. Nilai output saat 5cm adalah 2.5V. Jika menjauh maka sensor akan bertambah positif (>2.5 V) dan jika mendekat maka nilai output semakin rendah (<2.5V). Akan tetapi perubahan nilai output tersebut sangat kecil, missal hanya 0.001V/cm. Maka kita menggunakan op amp sebagai penguat agar bisa dibaca mikrokontroler, kira-kira akan dikuatkan 1000 kali. Agar kita bisa mendapatkan nilai pergeseran besi saja, maka kita normalisasi dulu nilai tengah dari output sensor 2.5V ke 0V dengan cara menggunakan op amp differensial. Karena jika menggunakan penguatan biasa nilai dasar 2.5V akan terbawa dan output sensor menjadi terlalu besar +-2500V.

Maka dari itu saya gunakan resistor pembagi tegangan untuk menghasilkan 2.5V. Saya gunakan juga rangkaian buffer untuk memisahkan rangkaian pembagi tegangan dengan op amp differensial agar nilai perhitungan kedua rangkaian tersebut tidak tercampur.

penguat2

__________________________________________

Daftar Pustaka:

electronics-tutorials.ws/opamp/opamp_5.html

PBO to VCard

.PBO adalah file yang berisi kontak telpon. Biasanya digunakan pada windows. Sedangkan VCard adalah file kontak telpon yang biasanya dipakai pada HP. PBO sendiri berisi sekumpulan data VCard. Maka .PBO bisa kita pisahkan menjadi VCard. Berikut codenya.

using System;
using System.Collections.Generic;
using System.IO;

namespace pboToVcardConsole
{
	class Program
	{
		public static void Main(string[] args)
		{
			Console.WriteLine("Hello World!");
			
			// TODO: Implement Functionality Here
			
			Console.WriteLine("Insert .PBO input path: ");
			string pathPBO = Console.ReadLine();
			Console.WriteLine("Output path:");
			string pathoutput = Console.ReadLine();
			
			using (StreamReader reader = new StreamReader(pathPBO))
			{
				int counterFile = 0;
	    		string line;
	    		string writeBuffer = "BEGIN:VCARD" + Environment.NewLine; 
	    		while ((line = reader.ReadLine()) != null)
	    		{
	    			Console.WriteLine(line);
	    			
	    			if((string.Equals(line,"END:VCARDBEGIN:VCARD"))||(string.Equals(line,"END:VCARD")))
	    			{
	    				if(!(writeBuffer.Length < 1))
	    				{
	    					writeBuffer = writeBuffer + "END:VCARD";
	    					
	    					if(!Directory.Exists(pathoutput))//if file doesn't exist
							{
								Directory.CreateDirectory(@pathoutput);
							}
	    					
	    					string namaFile = string.Format("{0}\\{1}.vcf",pathoutput,counterFile);
	    					if(!File.Exists(namaFile))//if file doesn't exist
							{
								File.Create(namaFile).Close();
							}
	    					TextWriter tw = new StreamWriter(@namaFile);
							tw.WriteLine(writeBuffer);
							tw.Close();
							counterFile++;
							writeBuffer = "BEGIN:VCARD" + Environment.NewLine;
	    				}	
	    			}
	    			else
	    			{
	    				writeBuffer = writeBuffer + line + Environment.NewLine;
	    			}
				}
			}
		}
	}
}

Simple HTTP Server Class C#

Source: gist.github.com/aksakalli/9191056

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Threading;
using System.Diagnostics;


class SimpleHTTPServer
{
    private readonly string[] _indexFiles = { 
        "index.html", 
        "index.htm", 
        "default.html", 
        "default.htm" 
    };
    
    private static IDictionary<string, string> _mimeTypeMappings = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) {
        #region extension to MIME type list
        {".asf", "video/x-ms-asf"},
        {".asx", "video/x-ms-asf"},
        {".avi", "video/x-msvideo"},
        {".bin", "application/octet-stream"},
        {".cco", "application/x-cocoa"},
        {".crt", "application/x-x509-ca-cert"},
        {".css", "text/css"},
        {".deb", "application/octet-stream"},
        {".der", "application/x-x509-ca-cert"},
        {".dll", "application/octet-stream"},
        {".dmg", "application/octet-stream"},
        {".ear", "application/java-archive"},
        {".eot", "application/octet-stream"},
        {".exe", "application/octet-stream"},
        {".flv", "video/x-flv"},
        {".gif", "image/gif"},
        {".hqx", "application/mac-binhex40"},
        {".htc", "text/x-component"},
        {".htm", "text/html"},
        {".html", "text/html"},
        {".ico", "image/x-icon"},
        {".img", "application/octet-stream"},
        {".iso", "application/octet-stream"},
        {".jar", "application/java-archive"},
        {".jardiff", "application/x-java-archive-diff"},
        {".jng", "image/x-jng"},
        {".jnlp", "application/x-java-jnlp-file"},
        {".jpeg", "image/jpeg"},
        {".jpg", "image/jpeg"},
        {".js", "application/x-javascript"},
        {".mml", "text/mathml"},
        {".mng", "video/x-mng"},
        {".mov", "video/quicktime"},
        {".mp3", "audio/mpeg"},
        {".mpeg", "video/mpeg"},
        {".mpg", "video/mpeg"},
        {".msi", "application/octet-stream"},
        {".msm", "application/octet-stream"},
        {".msp", "application/octet-stream"},
        {".pdb", "application/x-pilot"},
        {".pdf", "application/pdf"},
        {".pem", "application/x-x509-ca-cert"},
        {".pl", "application/x-perl"},
        {".pm", "application/x-perl"},
        {".png", "image/png"},
        {".prc", "application/x-pilot"},
        {".ra", "audio/x-realaudio"},
        {".rar", "application/x-rar-compressed"},
        {".rpm", "application/x-redhat-package-manager"},
        {".rss", "text/xml"},
        {".run", "application/x-makeself"},
        {".sea", "application/x-sea"},
        {".shtml", "text/html"},
        {".sit", "application/x-stuffit"},
        {".swf", "application/x-shockwave-flash"},
        {".tcl", "application/x-tcl"},
        {".tk", "application/x-tcl"},
        {".txt", "text/plain"},
        {".war", "application/java-archive"},
        {".wbmp", "image/vnd.wap.wbmp"},
        {".wmv", "video/x-ms-wmv"},
        {".xml", "text/xml"},
        {".xpi", "application/x-xpinstall"},
        {".zip", "application/zip"},
        #endregion
    };
    private Thread _serverThread;
    private string _rootDirectory;
    private HttpListener _listener;
    private int _port;
 
    public int Port
    {
        get { return _port; }
        private set { }
    }
 
    /// <summary>
    /// Construct server with given port.
    /// </summary>
    /// <param name="path">Directory path to serve.</param>
    /// <param name="port">Port of the server.</param>
    public SimpleHTTPServer(string path, int port)
    {
        this.Initialize(path, port);
    }
 
    /// <summary>
    /// Construct server with suitable port.
    /// </summary>
    /// <param name="path">Directory path to serve.</param>
    public SimpleHTTPServer(string path)
    {
        //get an empty port
        TcpListener l = new TcpListener(IPAddress.Loopback, 0);
        l.Start();
        int port = ((IPEndPoint)l.LocalEndpoint).Port;
        l.Stop();
        this.Initialize(path, port);
    }
 
    /// <summary>
    /// Stop server and dispose all functions.
    /// </summary>
    public void Stop()
    {
        _serverThread.Abort();
        _listener.Stop();
    }
 
    private void Listen()
    {
        _listener = new HttpListener();
        _listener.Prefixes.Add("http://localhost:" + _port.ToString() + "/");
        _listener.Start();
        while (true)
        {
            try
            {
                HttpListenerContext context = _listener.GetContext();
                Process(context);
            }
            catch (Exception ex)
            {
 
            }
        }
    }
 
    private void Process(HttpListenerContext context)
    {
        string filename = context.Request.Url.AbsolutePath;
        Console.WriteLine(filename);
        filename = filename.Substring(1);
 
        if (string.IsNullOrEmpty(filename))
        {
            foreach (string indexFile in _indexFiles)
            {
                if (File.Exists(Path.Combine(_rootDirectory, indexFile)))
                {
                    filename = indexFile;
                    break;
                }
            }
        }
 
        filename = Path.Combine(_rootDirectory, filename);
 
        if (File.Exists(filename))
        {
            try
            {
                Stream input = new FileStream(filename, FileMode.Open);
                
                //Adding permanent http response headers
                string mime;
                context.Response.ContentType = _mimeTypeMappings.TryGetValue(Path.GetExtension(filename), out mime) ? mime : "application/octet-stream";
                context.Response.ContentLength64 = input.Length;
                context.Response.AddHeader("Date", DateTime.Now.ToString("r"));
                context.Response.AddHeader("Last-Modified", System.IO.File.GetLastWriteTime(filename).ToString("r"));
 
                byte[] buffer = new byte[1024 * 16];
                int nbytes;
                while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0)
                    context.Response.OutputStream.Write(buffer, 0, nbytes);
                input.Close();
                
                context.Response.StatusCode = (int)HttpStatusCode.OK;
                context.Response.OutputStream.Flush();
            }
            catch (Exception ex)
            {
                context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            }
 
        }
        else
        {
            context.Response.StatusCode = (int)HttpStatusCode.NotFound;
        }
        
        context.Response.OutputStream.Close();
    }
 
    private void Initialize(string path, int port)
    {
        this._rootDirectory = path;
        this._port = port;
        _serverThread = new Thread(this.Listen);
        _serverThread.Start();
    }
}

_________________________________________________
Atau
Source: realfiction.net/2010/04/17/A-HTTP-file-server-in-130-lines-of-code/

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

public class HttpFileServer : IDisposable
{
    private readonly string rootPath;
    private const int bufferSize = 1024*512; //512KB
    private readonly HttpListener http;
    
    public HttpFileServer(string rootPath)
    {
        this.rootPath = rootPath;
        http = new HttpListener();
        http.Prefixes.Add("http://localhost:8889/");
        http.Start();
        http.BeginGetContext(requestWait, null);
    }
    
    public void Dispose()
    {
        http.Stop();
    }
    
    private void requestWait(IAsyncResult ar)
    {
        if (!http.IsListening)
        return;
        var c = http.EndGetContext(ar);
        http.BeginGetContext(requestWait, null);
        var url = tuneUrl(c.Request.RawUrl);
        var fullPath = string.IsNullOrEmpty(url) ? rootPath : Path.Combine(rootPath, url);
        if (Directory.Exists(fullPath))
        returnDirContents(c, fullPath);
        else if (File.Exists(fullPath))
        returnFile(c, fullPath);
        else
        return404(c);
    }
    
    private void returnDirContents(HttpListenerContext context, string dirPath)
    {
        context.Response.ContentType = "text/html";
        context.Response.ContentEncoding = Encoding.UTF8;
        using (var sw = new StreamWriter(context.Response.OutputStream))
        {
            sw.WriteLine("<html>");
            sw.WriteLine("<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head>");
            sw.WriteLine("<body><ul>");
            var dirs = Directory.GetDirectories(dirPath);
            foreach (var d in dirs)
            {
                var link = d.Replace(rootPath, "").Replace('\\', '/');
                sw.WriteLine("<li>&lt;DIR&gt; <a href=\"" + link + "\">" + Path.GetFileName(d) + "</a></li>");
            }
            var files = Directory.GetFiles(dirPath);
            foreach (var f in files)
            {
                var link = f.Replace(rootPath, "").Replace('\\', '/');
                sw.WriteLine("<li><a href=\"" + link + "\">" + Path.GetFileName(f) + "</a></li>");
            }
            sw.WriteLine("</ul></body></html>");
        }
        context.Response.OutputStream.Close();
    }

    private static void returnFile(HttpListenerContext context, string filePath)
    {
        context.Response.ContentType = getcontentType(Path.GetExtension(filePath));
        var buffer = new byte[bufferSize];
        using ( var fs = File.OpenRead(filePath))
        {
            context.Response.ContentLength64 = fs.Length;
            int read;
            while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
            context.Response.OutputStream.Write(buffer, 0, read);
        }
        context.Response.OutputStream.Close();
    }

    private static void return404(HttpListenerContext context)
    {
        context.Response.StatusCode = 404;
        context.Response.Close();
    }

    private static string tuneUrl(string url)
    {
        url = url.Replace('/', '\\');
        //url = HttpUtility.UrlDecode(url, Encoding.UTF8);
        url = url.Substring(1);
        return url;
    }

    private static string getcontentType(string extension)
    {
        switch (extension)
        {
            case ".avi": return "video/x-msvideo";
            case ".css": return "text/css";
            case ".doc": return "application/msword";
            case ".gif": return "image/gif";
            case ".htm":
            case ".html": return "text/html";
            case ".jpg":
            case ".jpeg": return "image/jpeg";
            case ".js": return "application/x-javascript";
            case ".mp3": return "audio/mpeg";
            case ".png": return "image/png";
            case ".pdf": return "application/pdf";
            case ".ppt": return "application/vnd.ms-powerpoint";
            case ".zip": return "application/zip";
            case ".txt": return "text/plain";
            default: return "application/octet-stream";
        }
    }

}

_______________________________________________

atau

source: codehosting.net/blog/BlogEngine/post/Simple-C-Web-Server.aspx

 

using System;
using System.Net;
using System.Threading;
using System.Linq;
using System.Text;
 
namespace SimpleWebServer
{
    public class WebServer
    {
        private readonly HttpListener _listener = new HttpListener();
        private readonly Func<HttpListenerRequest, string> _responderMethod;
 
        public WebServer(string[] prefixes, Func<HttpListenerRequest, string> method)
        {
            if (!HttpListener.IsSupported)
                throw new NotSupportedException(
                    "Needs Windows XP SP2, Server 2003 or later.");
 
            // URI prefixes are required, for example 
            // "http://localhost:8080/index/".
            if (prefixes == null || prefixes.Length == 0)
                throw new ArgumentException("prefixes");
 
            // A responder method is required
            if (method == null)
                throw new ArgumentException("method");
 
            foreach (string s in prefixes)
                _listener.Prefixes.Add(s);
 
            _responderMethod = method;
            _listener.Start();
        }
 
        public WebServer(Func<HttpListenerRequest, string> method, params string[] prefixes)
            : this(prefixes, method) { }
 
        public void Run()
        {
            ThreadPool.QueueUserWorkItem((o) =>
            {
                Console.WriteLine("Webserver running...");
                try
                {
                    while (_listener.IsListening)
                    {
                        ThreadPool.QueueUserWorkItem((c) =>
                        {
                            var ctx = c as HttpListenerContext;
                            try
                            {
                                string rstr = _responderMethod(ctx.Request);
                                byte[] buf = Encoding.UTF8.GetBytes(rstr);
                                ctx.Response.ContentLength64 = buf.Length;
                                ctx.Response.OutputStream.Write(buf, 0, buf.Length);
                            }
                            catch { } // suppress any exceptions
                            finally
                            {
                                // always close the stream
                                ctx.Response.OutputStream.Close();
                            }
                        }, _listener.GetContext());
                    }
                }
                catch { } // suppress any exceptions
            });
        }
 
        public void Stop()
        {
            _listener.Stop();
            _listener.Close();
        }
    }
}

How to use code di atas

 

class Program
{
    static void Main(string[] args)
    {
        WebServer ws = new WebServer(SendResponse, "http://localhost:8080/test/");
        ws.Run();
        Console.WriteLine("A simple webserver. Press a key to quit.");
        Console.ReadKey();
        ws.Stop();
    }
 
    public static string SendResponse(HttpListenerRequest request)
    {
        return string.Format("<HTML><BODY>My web page.<br>{0}</BODY></HTML>", DateTime.Now);    
    }
}

 

HTML Page Auto Reload Image

Source: htmlhelpcentral.com/messageboard/showthread.php?19672-automatic-reload-of-specific-image-in-page

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
//<![CDATA[
window.onload = function() {
	img = document.getElementById('refreshImage');
	img.src += "?";
	setInterval("img.src=img.src.replace(/\\?[0-9]*/, '?'+Math.floor(Math.random()*9999999+1));", 5000);
}
//]]>
</script>
</head>

<body>
<img src="theImage.jpg" id="refreshImage" />
</body>
</html>

Capture MainForm Window C#

Source: stackoverflow.com/questions/5124434/how-to-get-the-screenshot-of-the-form

using (var bmp = new Bitmap(this.Width, this.Height)) 
{
             this.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
             bmp.Save(@"E:\pic\TEST.bmp");
 }

Design AGV System

Printf dan Scanf USART pada AVR Studio 4 + AVR AVR GCC

Sumber: embedds.com/using-standard-io-streams-in-avr-gcc/

Mengatur Linker

WinAVR , AVR Studio atau AVR GCC secara default, linker option-nya di-set standard yaitu tanpa floating point conversion.

USART1

Jadi kita ingin mengirim string dengan basic integer number, maka gunakan minimized version. Maka gunakan linker option sebagai berikut.

-Wl,-u,vfprintf -lprintf_min 

Jika kita ingin fungsi untuk floating point maka gunakan standard option dengan floating point conversion:

-Wl,-u,vfprintf -lprintf_flt -lm

Untuk menambahkan linker option pada AVR Studio 4, maka buka project option à Custom Option , lalu tambahkan –Wl, -u, vprintf ke linker option seperti gambar di bawah ini:

avrstudio_linker_options-445x300

Kemudian buka tab Libraries dan tambahkan libprintf_flt.a dan libm.a karena float conversion membutuhkan math library.

avrstudio_linker_options_libraries-441x300

Hal ini juga berlaku untuk fungsi scan. Jika kita akan sering membaca data streams, maka masukan juga linker berikut.

Untuk minimized version:

-Wl,-u,vfscanf -lscanf_min

Untuk float version:

-Wl,-u,vfscanf -lscanf_flt –lm

Men-setting I/O Streams

Send

int USART0SendByte(char u8Data, FILE *stream)
{
   if(u8Data == '\n')
   {
      USART0SendByte('\r', 0);
   }
   //wait while previous byte is completed 
   while(!(UCSR0A&(1<<UDRE0))){};
   // Transmit data
   UDR0 = u8Data;
   return 0;
}

 

Receive

int USART0ReceiveByte(FILE *stream)
{
   uint8_t u8Data;
   // Wait for byte to be received
   while(!(UCSR0A&amp;(1&lt;&lt;RXC0))){};
   u8Data=UDR0;
   //echo input data
   USART0SendByte(u8Data,stream);
   // Return received data
   return u8Data;
}

 

Lalu tambahkan pula kode berikut.

FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, USART0ReceiveByte, _FDEV_SETUP_RW);

 

Kita bisa mengatur untuk mengunakan stream data untuk menerima, mengirim, atau kedua-duanya tergantung dari parameter yang yang kita setting pada FDEV_SETUP_STREAM tadi.

read - _FDEV_SETUP_READ

written - _FDEV_SETUP_READ

read/written - _FDEV_SETUP_RW

Dalam C, stream data itu ada 3. Pada computer bentuk stream data ini digunakan untuk membaca keyboard – stdin (standard input stream), output ke layar – stdout (standard output stream) dan satu lagi output ke layar – stderr (standard error stream). Untuk itu kita perlu menginisialisasi standard stream yang akan kita gunakan sebagai berikut.

stdin=stdout=&amp;uart0_str;

Dengan demikian kita bisa menggunakan fungsi prinf() dan akan memudahkan kita dalam menggunakan usart.

Print Format

Sebelum kita menggunakanfungsi print seperti int fprintf(FILE*, const char *, ) kita perlu faham dulu format datanya. Untuk fungsi ‘printf’ terdiri dari.

fprintf_format

Jika menggunakan fungsi stream standard maka bentuknya printf(formatted string, arguments); fungsi ini memungkinkan kita untuk mengubah arguments yang kita masukan menjadi data string. Bentuk data yang diubah akan ditempatkan pada formatted string dengan cara mengawalinya dengan tanda “%”:

%[flag][leading][width].[precision][length]specifier

Setiap tag dapat diatur sesuai kebutuhan. Hal ini bisa banyak dicari pada tutorial bahasa C.

Flag can be:

space – that can usually is filled if number sign is present;

+ – forces to use plus/minus sign to positive/negative number;

– – left justifies result (default is right);

# – Used with o, x or X specifiers the value is preceded with 0, 0x or 0X respectively for values different than zero; Used with e, E and f forces output to contain a decimal point even if no digits would follow; Used with g or G the result is the same as with e or E but trailing zeros are not removed.

Leading – print a leading zero(ignored for negative numbers);

Width – minimum field of characters to be printed. Padded with spaces if result is shorted and truncated if longer. If * is used then it represents integer number that is taken from argument list.

Precision – represents number of digits after decimal point for double numbers. For integers this number shows the minimum number of digits to be printed. If number is shorter – leading zeros are added, if longer- it is truncated. It also can be specified as * and value taken from arguments.

Length – can be h, l, and L. used for argument compatibility where h – stands for short int, l – long int and L – long double.

Specifier – this is a mandatory specifier. It defines value type of corresponding argument:

  • c – character (eg. a, C, …);
  • i, d – decimal integer (eg 10, -23);
  • u – unsigned integer (eg. 100);
  • e, E – scientific format (eg. 1.2e01, 5E21);
  • f – decimal floating point (eg. -5.014);
  • g, G – shorter e or f (eg. -5.02, 5E2);
  • o, O – octal unsigned integer (eg. 457);
  • x, X – unsigned hexadecimal (eg. 1f8, FF4);
  • s – string of characters (eg. Hello);
  • p – pointer address;
  • n – associated argument points to int variable which holds current count of printed characters;
  • % – % followed after % prints character %.

Pada AVR GCC library stdio.h pada beberapa fungsi mungkin memiliki keterbatasan seperti beberapa tag atau specifiers tidak bekerja.

Testing I/O stream functionality

Berikut contoh penggunaan fungsi print (mengirim data usart) dan juga scanf() (menerima data usart).

#include <stdio.h>
#include <math.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#define USART_BAUDRATE 9600
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
void USART0Init(void)
{
// Set baud rate
UBRR0H = (uint8_t)(UBRR_VALUE>>8);
UBRR0L = (uint8_t)UBRR_VALUE;
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
//enable transmission and reception
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
}
int USART0SendByte(char u8Data, FILE *stream)
{
   if(u8Data == '\n')
   {
      USART0SendByte('\r', 0);
   }
//wait while previous byte is completed
while(!(UCSR0A&(1<<UDRE0))){};
// Transmit data
UDR0 = u8Data;
return 0;
}
int USART0ReceiveByte(FILE *stream)
{
uint8_t u8Data;
// Wait for byte to be received
while(!(UCSR0A&(1<<RXC0))){};
u8Data=UDR0;
//echo input data
USART0SendByte(u8Data,stream);
// Return received data
return u8Data;
}
//set stream pointer
FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, USART0ReceiveByte, _FDEV_SETUP_RW);
int main (void)
{
//sample data
uint16_t u16Data = 10;
double fltData = 3.141593;
int8_t s8Data = -5;
uint8_t u8str[]="Hello";
uint8_t u8Data;
//Initialize USART0
USART0Init();
//assign our stream to standart I/O streams
stdin=stdout=&usart0_str;
//print unsignet integer
printf("\nunsigned int = %u",u16Data);
//print hexadecimal number
printf("\nhexadecimal unsigned int = %#04x",u16Data);
//print double with fprint function
fprintf(stdout,"\ndouble = %08.3f", fltData);
//print signed data
printf("\nsigned int = %d",s8Data);
//print string
printf("\nstring = %-20s",u8str);
//print string stored in flash
printf_P(PSTR("\nString stored in flash"));
//printing back slash and percent symbol
printf("\nprintf(\"\\nstring = %%-20s\",u8str);");
    while(1)
    {
    printf_P(PSTR("\nPress any key:"));
    //scan standard stream (USART)
    scanf("%c",&u8Data);
    printf_P(PSTR("\nYou pressed: "));
    //print scaned character and its code
    printf("%c; Key code: %u",u8Data, u8Data);
    }
}

 

Berikut hasil yang dicapture pada terminal serial.

printf_example_terminal_results

Program tersebut menggunakan variable float, maka kita terlebih dahulu perlu men-setting linker dengan setting floating point seperti yang telah kita bahas di atas. Fungsi printf juga bisa digunakan untuk menampilkan data pada LCD atau pada perangkat lainnya. Jika operasi stream tidak terikat pada hardware tertentu – fungsi stream yang sama bisa kita definisikan pula untuk hardware berbeda. Kita bisa mengirim data yang sama menggunakan USART atau LCD jika perlu – hanya satu fungsi hardware yang perlu diubah.

 

Labview – Tambahan

FAQ

 

Q:     Ketika saya build .exe, aplikasi yang saya buat tidak berjalan sebagaimana mestinya semisal custom menu bar tidak muncul.

A:     Bisa jadi ketika kita mem-build .exe, file exe tersebut masih berjalan di computer kita. Sehingga proses build menjadi kacau. Maka daripada itu, pastikan  ketika mem-build aplikasi .exe, file tersebut tidak sedang dijalankan. Bisa dilihat di task manager. Solusi amannya clean .exe yang kita buat terlebih dahulu sebelum kita melakukan build.

 

Tips

 

  1. Aplikasi Labview terdiri dari 2 halaman. Yaitu Front Panel (user interface) yang selalu mempunyai Block Diagram(chart programming). Settingan Front Panel yang kita buat akan sama ketika kita run. Jadi ketika kita membuat program dengan window kecil yang kita tempatkan di pojok layar dan dan tidak ideal denga button dan elemen lain, maka begitu pula ketika kita jalankan sebagai aplikasi. Oleh karena itu, aturlah front panel serapi mungkin dan tempatkan pada posisi yang ideal terhadap layar monitor.
  2. Jangan sembarangan mencopy atau mengganti nama VI karena bisa jadi file tersebut berhubungan (caller atau subVI dari VI lainnya) dengan file lainnya dalam satu project. Sehingga biasanya akan menyebakan error can’t find file VI atau file conflict. Lakukan dengan rapid dan hati-hati jika ingin mengedit file-file.
  3. Kita bisa menggunakan Use default setting ktika kita menyambung wire pada structure FOR LOOP (Disable Indexing) atau CASE STRUCTURE (Use Default Setting) dengan cara klik kanan pada sisi objek lalu pilih Use default setting dengan demikian kita tidak perlu menyambung wire pada sisi lainnya (CASE STRUCTURE) akan tetapi efeknya yaitu wire akan bernilai default biasanya false untuk boolean dan no error untuk error line atau pilih Disable Indexing pada FOR LOOP dengan demikian output wire-nya tidak akan berbentuk array akan tetapi tetap single.

tips-1

Figure FOR LOOP

tips-2

Figure CASE STRUCTURE

_________________________

Daftar Pustaka

academic.amc.edu.au/~hnguyen/JEE344ACE/

simplymodbus.ca/FC05.htm

ni.com/example/26488/en/

Tutorial 15 Local Variable, Global Variable, & Shared Variable

Local Variable

Dalam  LabVIEW sebuah elemen hanya mempunyai satu symbol pada block diagram, maka untuk mengisi atau membaca elemen tersebut pada kode lainnya yang masih dalam satu VI bisa menggunakan local variable.  Klik kanan, buka function palette.

lv15-1

Figure 15.1

Jika sudah ditambahkan pada block diagram, maka klik kiri > pilih elemen yang akan kita akses. Missal saya akan mengakses message box.

lv15-2

Figure 15.2

Kita bisa mengisi atau membaca variable tersebut. Klik kanan pada local variable yang sudah kita assign sebagai message box tadi, lalu pilih change to read jika ingin membaca isi dari elemen message box.

lv15-3

Figure 15.3

Atau jika dalam mode read kita akan mengubahnya menjadi mode write kita tinggal klik kanan pada local variable tersebut.

lv15-4

Figure 15.4

lv15-5

Figure 15.5

Dengan demikian,  dengan menggunakan local variable kita bisa mengakses suatu elemen dari mana saja, walaupun intinya suatu elemen hanya bisa digunakan pada satu diagram saja.

Global Variable

Global variable digunakan untuk berbagi nilai bersama-sama antar VI dalam satu project file.

lv15-6

Figure 15.6

Sebuah global variable biasanya di save dalam format .vi. Akan tetapi vi ini tidak mempunyai block diagram.

lv15-7

Figure 15.7

Pada gambar di atas adalah global variable dengan format .vi. Jika kita buka file tersebut maka bisa kita lihat seperti gambar di bawah  ini.

lv15-8

Figure 15.8

Untuk menggunakannya kita bisa drag file tersebut dari project file window ke program block diagram yang kita inginkan. Jika pada file global variable tadi mempunyai lebih dari satu elemen, dengan cara klik kiri kita bisa memilih elemen mana yang akan kita gunakan.

lv15-9

Figure 15.9

Global variable ini juga bisa kita set sebagai mode write atau  read.

lv15-10

Figure 15.10

Shared Variable

Jika kita mempunyai 2 buah computer dan ingin kedua software pada dua computer tadi berkomunikasi satu sama lain maka kita bisa gunakan shared variable. Dengan membuat shared libraries melalui network-published variable pada kedua masing-masing PC maka kita dapat membuat sharing data diantara PC tersebut.

Biasanya dalam beberapa kasus, satu computer bertindak sebagai publisher dan mengirim data ke shared variable yang mana PC lainnya bertindak sebagai subscriber dan menerima data tersebut.

  1. Lakukan pengaturan shared variable pada PC yang aka kita jadikan sebagai publisher dengan cara klik kanan My Computer >> New>>Variable seperti pada gambar di bawah ini. Dengan demikian, maka akan muncul sebuah dialog box untuk men-setting shared variable yang kita buat.

lv15-11

Figure 15.11

  1. Pada dialog box, pada tab variable, pastikan bahwa Variable Type bernilai Network-Published seperti ditunjukan pada gambar di bawah ini. Pada window ini kita dapat mengatur Data Type dan Name dari variable yang akan kita buat. Klik OK pada dialog box dan perlu diketahui bahwa library yang kita buat belum mempunyai nama dan belum di save (untitled library). Pada project file kita, shared variable akan terlihat terexpand ke bawah seperti ditunjukan pada gambar berikutnya.

lv15-12

Figure 15.12

lv15-13

Figure 15.13

  1. Save project kita, maka secara otomatic akan muncul pesan bahawa kita harus mengisi nama library lalu save. Jalankan VI Anda yang mana menyimpan data ke shared variable yang kita buat tadi. Dengan demikian, maka library dan hared variable kita akan ter-deploy pada publisher PC kita.
  2. Pada subscriber PC, buka Project Explorer dan buat shared variable seperti halnya dijelaskan pada poin 1. Pada variable tab ceklis Enable Aliasing dan pilih PSP URL pada bagian Bind To. Click Browse, lalu pilih IP sesuai publisher PC kita tadi, lalu expand. Maka kita akan bisa melihat shared library dan variable kita seperti ditunjukan pada gambar di bawah. Pilih, lalu klik OK untuk keluar dari variable configuration window.

lv15-14

Figure 15.14

  1. Simpan variable ini pada VI, pada subscriber computer, dan kita pun bisa membaca data yang di-write dari publisher PC.

_________________________

Daftar Pustaka

academic.amc.edu.au/~hnguyen/JEE344ACE/

simplymodbus.ca/FC05.htm

ni.com/example/26488/en/

Tutorial 14 Membuat File CFG Untuk Menyimpan Nilai Variable

Terkadang kita ingin menyimpan setting-an dari applikasi kita semisal port serial atau port aplikasi DAQ yang kita setting sebagai control sehingga memungkinkan diganti-ganti oleh user. Akan tetapi ketika aplikasi kita dimatikan maka setting-an tersebut hilang dan saat menghidupkan kembali aplikasi kita ternyata kita harus memasukannya settingan kembali. Oleh karena itu, kita simpan saja nilai settingan tersebut pada file .cfg.

Misal kita akan menyimpan data settingan port serial. Untuk membuat program ini kita akan menggunakan Configuration File Vis seperti terlihat pada gambar di bawah ini.

lv14-1

Figure 14.1

lv14-2

Figure 14.2

lv14-3

Figure 14.3

Intinya kita akan menggunakan Open Config Data, Read Key (untuk membaca isi file), Write Key (untuk menulis pada file), dan Close Config Data.

lv14-4

Figure 14.4

Kita gunakan application directory lalu menggabungkan dengan nama file menggunakan Build Path.

lv14-5

Figure 14.5

lv14-6

Figure 14.6

PadaRead Key atau pun Read Key ada Sectio dan Key. Gunakan nama Section dan Key yang sama untuk menulis atau membaca data yang sama.

lv14-7

Figure 14.7

Kita juga menggunakan Type Cast untuk menkonversi tipe data. Pada bagian  read kita mengubah dari tipe data string ke visa resource name. Sedangkan pada bagian write kita mengubah sebaliknya dari tipe VISA resource name menjadi string untuk dituliskan ke file cfg.

lv14-8

Figure 14.8

Kita juga menggunakan Merge Error .

lv14-9

Figure 14.9

Terakhir adalah bagian Close Config Data.

Sekarang mari kita coba.

lv14-10

Figure 14.10

Kita pilih COM pada combo box yang tersedia. Lalu kita klik write. Lalu klik read. Pada display read akan tampil nama COM3 yang sama dengan yang kita write. Sekarang kita buka file .cfg yang kita gunakan untuk menyimpan data kita.

lv14-11

Figure 14.11

lv14-12

Figure 14.12

Pada file tersebut telah tertulis data yang kita masukan.

_________________________

Daftar Pustaka

academic.amc.edu.au/~hnguyen/JEE344ACE/

simplymodbus.ca/FC05.htm

ni.com/example/26488/en/

Follow

Get every new post delivered to your Inbox.