Я всегда говорю, что программирование контроллеров распадается на две задачи: собственно программирование и схемотехника. Потому сначала надо научиться программировать и освоить схемотехнику.
Научиться программировать можно выполняя классические задачи - на сортировки, на работу со структурами данных и т.п. Про это есть множество хороших и проверенных книжек и сайтов. Только не берите книжки типа "C++ за десять дней" - это совсем не то, что научит писать изящно и грамотно. На описываемом этапе вас будут интересовать основы, которые помогут научиться проводить разбиение сложной задачи на простые действия.
Естесственно, генераторы кода я даже не обсуждаю - про них надо просто забыть. Никакого C++, только ANSI C - упор на него.
Знание схемотехники необходимо, чтобы понимать особенности железа и способы правильного взаимодействия с ним. По основам схемотехники тоже есть много проверенных книг. Но, опять же, это не "Ардуино для начинающих". Берите нормальные книги вроде Горовица и Хилла.
Ну и практика, практика, практика. Ну и, конечно, не забывайте, что понимание терминов "изящно и грамотно" у каждого свое. :)