What is the best way for intermediate arduino users to raise our skill level?

Hi, I've been programming Arduino and Processing for a few years now. I am self taught (with lots of help from this forum of course). I started doing simple RGB light control which I introduced to my work and it quickly evolved into some pretty complex stuff involving GUI's, servo control, Sound generating, R/C control of parameters and sequences, Wireless communication, etc

The more I do the more that is expected so I feel its time to actually learn how to do it right.

Up until now I havent done any planning. I design in my head and code as I go.

My code is very simplistic but the end product is very complex so I am starting to feel the hardware limitations probably because my code is not as efficient as it should be.

Also I have no experience outside of the main arduino environment so looking inside a library is like trying to read a foreign language. anything involving HEX or binary is also very foreign to me.

I feel that its time to take a step backwards and learn fundamentals in my spare time but am not sure what te best way to go about it is.

Online tutorials and books have been a great source of information, but if they discuss subjects that are foreign to me, its very hard to fill in the blanks.

What I feel I need is a live course, tutoring, or maybe an online course where the basics are covered, such as base structuring, as well as advanced subjects such as non linear programming, working outside of the arduino toolsets, etc

In order to keep developing my skills at the pace my job requires, I have focused my attention specifically on learning things that apply specifically to the tasks I need to perform, but I feel I've missed some Key fundamental steps along the way.

Any ideas, links, etc would be extremely appreciated!!!

My advice is to tackle lots of small projects, learning one thing at a time. That's how I did it. Then subsequent projects can build on what you learned before.

You don't have to look inside libraries initially. After a while they will seem easier to understand.

Maybe this?

Learning by doing works well as Nick observes. Indeed, you can augment it with education, but it's where the rubber meets the road.

Doing some C/C++ tutorials and reading a book or two on the subject, preferably without an Arduino focus, would likely help.

Read something on coding or software engineering - I like Steve McConnell's 'Code Complete'.

After reading the above, go back to some of your earlier projects and examine your code. Hopefully, what you see will make you cringe. As an exercise, see if you can improve it, no need to actually deploy it of course.

In my opinion though, since most arduino projects have to be pretty small because of memory limitations, you can get away with a multitude of sins regarding software methodology. Using it makes things easier and clearer, but you can still just as well hack stuff together and get it to work. So maybe don't worry so much about the big picture - learn some better techniques bottom up and add them to your projects as you go - sneak up on superior coding.

It may be worth posting some of your existing code for review; just be sure you're ready for some hard truths, perhaps expressed unsympathetically ;-)

Ill post some sample code tomorrow from work. I'm very open to all kinds if criticism as long as its for the better good... If I can learn from you guys bring it on!

Lakes, Thanks for the reference. I just pre-ordered that book.

I'm a bit like MechFX..... the curse of being an enabler that has much expected of him...


fxmech: Also I have no experience outside of the main arduino environment so looking inside a library is like trying to read a foreign language. anything involving HEX or binary is also very foreign to me.

I would encourage you to continue looking at libraries. Different libraries are written at different levels. Indeed, some will be more difficult to understand. Put those aside for now and spend time with the smaller and simpler ones. Write one of your own. Make it so simple it seems stupid. An LED library or something.

Learn the C and C++ languages.

Understanding hexadecimal and binary is fairly important to any computer-oriented discipline. Microcontrollers are, first and foremost, complete small computers. At the lowest level, computers only deal in binary. So if you understand binary, you begin to understand computers.

Get the datasheet for the microcontroller on the board(s) you use. For example, the ATmega328P for an Arduino Uno. The datasheet is huge and overwhelming. Don't worry about the details right away, just look through it, get the lay of the land.

Play with connecting other devices to the Arduino. Simple things like shift registers, real time clocks or other things that interest you. Read their datasheets too. Try to understand how they communicate.

Take chances, get messy, break things, have fun! A little "magic smoke" is a good thing!

[quote author=Jack Christensen link=topic=195030.msg1449232#msg1449232 date=1383175876] The datasheet is huge and overwhelming. [/quote]

FWIW, I think the Atmel datasheets are amongst the most user-friendly of any of uC architecture I've worked with -- Intel, Motorola, MIPs (and most recently) ARM(!)

Motorola actually wasn't bad, quite good really, but Atmel is nicer. All IMHO, of course.

The ARM datasheets are simply mind-numbing by comparison. Much, much more going on, of course, but still...

Maybe start looking at data sheets of simpler stuff, and then work up.

I like this data sheet site: http://www.datasheets.com/search/ You need to sign up but they don’t bug you.

Type in LS595 for example. Look at the Arduino ShiftOut page:
http://arduino.cc/en/Tutorial/ShiftOut Hook one or two of those up while referring to the real data sheet.

My favorite set of 20 cent chips is HERE:
…and the data sheets are linked there…


If you need further inspiration you can have a look at Project Hub: https://create.arduino.cc/projecthub/

You can browse projects by skills level, products, and category.

I think this may be a good way to move forward with Arduino.

Best regards,